it-swarm-vi.com

Gửi thư qua gmail với Send-MailMessage của PowerShell V2

Tôi đang cố gắng tìm ra cách sử dụng Send-MailMessage của PowerShell V2 với gmail.

Đây là những gì tôi có cho đến nay.

$ss = new-object Security.SecureString
foreach ($ch in "password".ToCharArray())
{
    $ss.AppendChar($ch)
}
$cred = new-object Management.Automation.PSCredential "[email protected]", $ss
Send-MailMessage    -SmtpServer smtp.gmail.com -UseSsl -Credential $cred -Body...

Tôi nhận được lỗi sau đây

Send-MailMessage : The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn
 more at                              
At foo.ps1:18 char:21
+     Send-MailMessage <<<<      `
    + CategoryInfo          : InvalidOperation: (System.Net.Mail.SmtpClient:SmtpClient) [Send-MailMessage], SmtpException
    + FullyQualifiedErrorId : SmtpException,Microsoft.PowerShell.Commands.SendMailMessage

Tôi đang làm gì đó sai hay là Send-MailMessage chưa được nướng hoàn toàn (Tôi đang ở CTP 3)?

Một số hạn chế bổ sung

  1. Tôi muốn điều này không tương tác, vì vậy get-credential sẽ không hoạt động
  2. Tài khoản người dùng không có trên miền gmail, nhưng tên miền đã đăng ký ứng dụng google
  3. Đối với câu hỏi này, tôi chỉ quan tâm đến lệnh ghép Send-MailMessage, việc gửi thư qua API .Net thông thường được hiểu rõ.
39
Scott Weinstein

Chỉ cần tìm thấy câu hỏi này .. đây là Mẫu Gửi MailMessage của PowerShell cho Gmail .. Giải pháp đã được thử nghiệm và hoạt động: 

$EmailFrom = "[email protected]"
$EmailTo = "[email protected]" 
$Subject = "Notification from XYZ" 
$Body = "this is a notification from XYZ Notifications.." 
$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
$SMTPClient.EnableSsl = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("username", "password"); 
$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

Chỉ cần thay đổi $ EmailTo và tên người dùng/mật khẩu trong $ SMTPClient.Credentials .. không bao gồm @ gmail.com trong tên người dùng của bạn .. 

có lẽ đây là một sự giúp đỡ cho người khác đi qua câu hỏi này .. 

45
Christian Casutt

Điều này sẽ khắc phục vấn đề của bạn

$credentials = new-object Management.Automation.PSCredential “[email protected]”, (“password” | ConvertTo-SecureString -AsPlainText -Force)

Sau đó sử dụng thông tin đăng nhập trong bạn gọi tới Send-MailMessage -From $From -To $To -Body $Body $Body -SmtpServer {$smtpServer URI} -Credential $credentials -Verbose -UseSsl

13
Jstar

tôi chỉ có cùng một vấn đề và chạy vào bài viết này. Nó thực sự giúp tôi chạy nó với lệnh Send-MailMessage gốc và đây là mã của tôi:

$cred = Get-Credential
Send-MailMessage ....... -SmtpServer "smtp.gmail.com" -UseSsl -Credential $cred -Port 587 

Tuy nhiên, để Gmail cho phép tôi sử dụng máy chủ SMTP, tôi đã phải đăng nhập vào tài khoản gmail của mình và theo liên kết này https://www.google.com.vn/sinstall/securance đặt "Truy cập ít hơn ứng dụng bảo mật "thành" Đã bật ". Cuối cùng thì nó cũng hoạt động !!

ciao marco

7
Marco Mirandola

Tôi không chắc bạn có thể thay đổi số cổng bằng Send-MailMessage vì gmail hoạt động trên cổng 587. Dù sao, đây là cách gửi email qua gmail bằng .NET SmtpClient:

$smtpClient = new-object system.net.mail.smtpClient 
$smtpClient.Host = 'smtp.gmail.com'
$smtpClient.Port = 587
$smtpClient.EnableSsl = $true
$smtpClient.Credentials = [Net.NetworkCredential](Get-Credential GmailUserID) 
$smtpClient.Send('[email protected]','[email protected]','test subject', 'test message')
6
Shay Levy

Tôi đã sử dụng giải pháp ngày 12 tháng 2 của Christian và tôi cũng mới bắt đầu học PowerShell. Theo như các tệp đính kèm, tôi đã tìm hiểu về cách Thành viên học cách hoạt động và nhận thấy Send () có hai định nghĩa ... định nghĩa thứ hai lấy một đối tượng System.Net.Mail.MailMessage cho phép Đính kèm và mạnh hơn và các tính năng hữu ích như Cc và Bcc. Đây là một ví dụ có tệp đính kèm (được trộn với ví dụ trên):

# append to Christian's code above --^
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $EmailFrom
$emailMessage.To.Add($EmailTo)
$emailMessage.Subject = $Subject
$emailMessage.Body = $Body
$emailMessage.Attachments.Add("C:\Test.txt")
$SMTPClient.Send($emailMessage)

Thưởng thức!

4
core

Sau nhiều thử nghiệm và tìm kiếm giải pháp lâu dài. Tôi tìm thấy một mã kịch bản chức năng và thú vị tại http://www.powershellmagazine.com/2012/10/25/pstip-seinating-emails-USE-your-gmail-account/ .

$param = @{
    SmtpServer = 'smtp.gmail.com'
    Port = 587
    UseSsl = $true
    Credential  = '[email protected]'
    From = '[email protected]'
    To = '[email protected]'
    Subject = 'Sending emails through Gmail with Send-MailMessage'
    Body = "Check out the PowerShellMagazine.com website!"
    Attachments = 'D:\articles.csv'
}

Send-MailMessage @param

Thưởng thức

3
BSF

Đây là một ngày thực sự muộn để hòa nhập ở đây, nhưng có lẽ điều này có thể giúp đỡ người khác.

Tôi thực sự mới đối với powershell và tôi đã tìm kiếm về gmailing từ PS. Tôi đã lấy những gì bạn đã làm ở trên, và sửa đổi nó một chút và đã đưa ra một kịch bản sẽ kiểm tra các tệp đính kèm trước khi thêm chúng, và cũng để lấy một mảng người nhận. Tôi sẽ thêm một số kiểm tra lỗi và công cụ sau, nhưng tôi nghĩ rằng nó có thể đủ tốt (và đủ cơ bản) để đăng ở đây. 

## Send-Gmail.ps1 - Send a gmail message
## By Rodney Fisk - [email protected]
## 2 / 13 / 2011

# Get command line arguments to fill in the fields
# Must be the first statement in the script
param(
    [Parameter(Mandatory = $true,
                    Position = 0,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias('From')] # This is the name of the parameter e.g. -From [email protected]
    [String]$EmailFrom, # This is the value [Don't forget the comma at the end!]

    [Parameter(Mandatory = $true,
                    Position = 1,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias('To')]
    [String[]]$Arry_EmailTo,

    [Parameter(Mandatory = $true,
                    Position = 2,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Subj' )]
    [String]$EmailSubj,

    [Parameter(Mandatory = $true,
                    Position = 3,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Body' )]
    [String]$EmailBody,

    [Parameter(Mandatory = $false,
                    Position = 4,
                    ValueFromPipelineByPropertyName = $true)]
    [Alias( 'Attachment' )]
    [String[]]$Arry_EmailAttachments

)

# From Christian @ StackOverflow.com
$SMTPServer = "smtp.gmail.com" 
$SMTPClient = New-Object Net.Mail.SMTPClient( $SmtpServer, 587 )  
$SMTPClient.EnableSSL = $true 
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( "GMAIL_USERNAME", "GMAIL_PASSWORD" ); 

# From Core @ StackOverflow.com
$emailMessage = New-Object System.Net.Mail.MailMessage
$emailMessage.From = $EmailFrom
foreach ( $recipient in $Arry_EmailTo )
{
    $emailMessage.To.Add( $recipient )
}
$emailMessage.Subject = $EmailSubj
$emailMessage.Body = $EmailBody
# Do we have any attachments?
# If yes, then add them, if not, do nothing
if ( $Arry_EmailAttachments.Count -ne $NULL ) 
{
    $emailMessage.Attachments.Add()
}
$SMTPClient.Send( $emailMessage )

Tất nhiên, thay đổi giá trị GMAIL_USERNAME và GMAIL_PASSWORD cho người dùng cụ thể của bạn và vượt qua.

3
Rodney Fisk

Gửi email với tệp đính kèm bằng powershell -

      $EmailTo = "[email protected]"  // [email protected]
      $EmailFrom = "[email protected]"  //[email protected]
      $Subject = "zx"  //subject
      $Body = "Test Body"  //body of message
      $SMTPServer = "smtp.gmail.com" 
      $filenameAndPath = "G:\abc.jpg"  //attachment
      $SMTPMessage = New-Object System.Net.Mail.MailMessage($EmailFrom,$EmailTo,$Subject,$Body)
      $attachment = New-Object System.Net.Mail.Attachment($filenameAndPath)
      $SMTPMessage.Attachments.Add($attachment)
      $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587) 
      $SMTPClient.EnableSsl = $true 
      $SMTPClient.Credentials = New-Object System.Net.NetworkCredential("[email protected]", "xxxxxxxx");    // xxxxxx-password
      $SMTPClient.Send($SMTPMessage)
2
udit043

Trên máy Windows 8.1, tôi đã nhận được Send-MailMessage để gửi email có tệp đính kèm qua GMail bằng tập lệnh sau:

$EmFrom = "[email protected]"    
$username = "[email protected]"    
$pwd = "YOURPASSWORD"    
$EmTo = "[email protected]"    
$Server = "smtp.gmail.com"    
$port = 587    
$Subj = "Test"    
$Bod = "Test 123"    
$Att = "c:\Filename.FileType"    
$securepwd = ConvertTo-SecureString $pwd -AsPlainText -Force    
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $username, $securepwd    
Send-MailMessage -To $EmTo -From $EmFrom -Body $Bod -Subject $Subj -Attachments $Att -SmtpServer $Server -port $port -UseSsl  -Credential $cred
2
Andy Urban

Đây rồi 

$filename = “c:\scripts_scott\test9999.xls”
$smtpserver = “smtp.gmail.com”
$msg = new-object Net.Mail.MailMessage
$att = new-object Net.Mail.Attachment($filename)
$smtp = new-object Net.Mail.SmtpClient($smtpServer )
$smtp.EnableSsl = $True
$smtp.Credentials = New-Object System.Net.NetworkCredential(“username”, “password_here”); # Put username without the @GMAIL.com or – @gmail.com
$msg.From = “[email protected]”
$msg.To.Add(”[email protected]”)
$msg.Subject = “Monthly Report”
$msg.Body = “Good MorningATTACHED”
$msg.Attachments.Add($att)
$smtp.Send($msg)

Hãy cho tôi biết nếu nó giúp bạn San cũng sử dụng tính năng gửi thư cũng tại Www.techjunkie.tv Theo cách đó tôi cũng nghĩ là cách tốt hơn và thuần túy hơn để sử dụng

1
Scottalvarino.com

Tôi đồng ý với giải pháp của Christian Muggli, mặc dù lúc đầu tôi vẫn gặp lỗi mà Scott Weinstein đã báo cáo. Làm thế nào bạn vượt qua đó là:

EITHER lần đầu tiên đăng nhập vào gmail từ máy này sẽ chạy trên, sử dụng tài khoản được chỉ định. (KHÔNG cần thêm bất kỳ trang web google nào vào vùng Trang web đáng tin cậy, ngay cả khi Cấu hình bảo mật nâng cao của Internet Explorer được bật.)

HOẶC, trong lần thử đầu tiên, bạn sẽ gặp lỗi và acct gmail của bạn sẽ nhận được thông báo về thông tin đăng nhập đáng ngờ, vì vậy hãy làm theo hướng dẫn của họ để cho phép đăng nhập trong tương lai từ máy này sẽ chạy.

0
Tom Keller

Tôi chưa sử dụng tính năng gửi thư PowerShell V2, nhưng tôi đã sử dụng lớp System.Net.Mail.SMTPClient trong V1 để gửi tin nhắn đến tài khoản gmail cho mục đích demo. Điều này có thể là quá mức nhưng chạy một máy chủ smtp trên máy tính xách tay Vista của tôi xem liên kết này , nếu bạn ở trong một doanh nghiệp, bạn sẽ có một máy chủ dựa vào thư và bước này không cần thiết. Có máy chủ smtp Tôi có thể gửi email đến tài khoản gmail của mình với mã sau:

$smtpmail = [System.Net.Mail.SMTPClient]("127.0.0.1")
$smtpmail.Send("[email protected]", "[email protected]", "Test Message", "Message via local smtp")
0
Chad Miller