Để gửi tin nhắn email qua SMTP server, bạn có thể dùng cmdlet Send-MailMessage của PowerShell. Bạn có thể dùng cmdlet tích hợp này để gửi email trong PowerShell phiên bản 2.0 và mới hơn (trước đó bạn có thể dùng class .Net System.Net.Mail để gửi email). Trong bài viết này, chúng tôi sẽ chỉ cách dùng Send-MailMessage để gửi email từ script PowerShell.
Để lấy cú pháp của cmdlet, chạy lệnh này:
get-help Send-MailMessage
Send-MailMessage [-To][-Subject] [[-Body] ] [[-SmtpServer] ] [-Attachments ] [-Bcc ] [-BodyAsHtml] [-Cc ] [-Credential ] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding ] -From [-Port ] [-Priority {Normal | Low | High}] [-UseSsl] [ ] The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.
Dưới đây là các tùy chọn chính:
- From là địa chỉ người gửi (Nếu SMTP server không kiểm tra địa chỉ người gửi và cho phép gửi email ẩn danh, bạn không cần cung cấp địa chỉ smtp thực. Bạn có thể gửi email thay mặt bất kỳ địa chỉ email nào);
- To – địa chỉ email người nhận;
- SMTPServer – địa chỉ SMTP server mà qua đó bạn muốn gửi email.
Nếu bạn đặt địa chỉ mail server trong biến môi trường $PSEmailServer, bạn không cần chỉ định địa chỉ SMTP server trong cmdlet Send-MailMessage.
Lệnh PowerShell đơn giản sau sẽ gửi email với chủ đề và nội dung quy định đến nhiều người nhận.
Send-MailMessage -From 'ps-script@woshub.com' -To 'serveradmin@woshub.com','helpdesk@woshub.com' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'
Để dễ dàng chỉnh sửa thuộc tính của cmdlet, lệnh gửi email có thể được biểu diễn như sau:
Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To 'serveradmin@woshub.com','helpdesk@woshub.com' `
-From 'ps-script@woshub.com' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'
Lưu ý rằng trong lệnh cuối cùng chúng tôi thêm đặt encoding UTF8 cho email. Nếu không, nếu chủ đề hoặc nội dung email chứa ký tự non-ANSI, chúng sẽ hiển thị không đúng.
Mặc định, encoding ANSI và ASCII được dùng trong Windows PowerShell. Nếu bạn đã cập nhật phiên bản PS lên PowerShell Core, hãy nhớ rằng phiên bản này đã dùng encoding UTF-8 mặc định.
Mặc định, cmdlet Send-MailMessage cố gắng gửi email qua cổng SMTP chuẩn TCP 25. Nếu SMTP server của bạn chỉ cho phép gửi email dùng giao thức mã hóa, bạn có thể chỉ định số cổng (thường là 465 hoặc 587) và tùy chọn UseSsl:
-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl
Bảng dưới đây cho thấy tham số SMTP server của các nhà cung cấp email công khai phổ biến mà bạn có thể dùng để gửi tin nhắn từ PowerShell (lưu ý bạn phải cho phép gửi email qua SMTP trong giao diện tài khoản):
| Tên | Địa chỉ SMTP Server | Cổng | Loại mã hóa |
|---|---|---|---|
| Gmail | smtp.gmail.com | 587, 25, 465 | TLS, TLS, SSL |
| Office 365 | smtp.office365.com | 587 | TLS |
| Outlook.com | smtp-mail.outlook.com | 587 | TLS |
| Yahoo | smtp.mail.yahoo.com | 587 | TLS |
| iCloud mail | smtp.mail.me.com | 587 | TLS |
| AOL | smtp.aol.com | 465 | SSL |
Nếu SMTP server cấm gửi email ẩn danh (relay bị từ chối), bạn sẽ thấy lỗi này:
5.7.1 Client was not authenticated.
Lúc này bạn có thể xác thực trên SMTP server bằng tùy chọn –Credential.
Bạn có thể yêu cầu tương tác credentials người dùng để xác thực:
Send-MailMessage …… -Credential (Get-Credential)
Cũng có thể chỉ định tài khoản dùng để xác thực trong biến:
$cred = Get-Credential
Send-MailMessage ... -Credential $cred
Nếu bạn muốn lưu mật khẩu kết nối đến SMTP server trực tiếp trong script PowerShell, dùng cú pháp sau:
$mypasswd = ConvertTo-SecureString "smP@ssdw0rrd2" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("user1@woshub.com", $mypasswd)
Send-MailMessage ... –Credential $mycreds
Xem bài viết Using saved credentials securely in PowerShell scripts.
Nếu bạn muốn thêm file đính kèm vào email, dùng tùy chọn –Attachments. Trong ví dụ dưới, chúng tôi sẽ gửi email dạng HTML và đính kèm file1.txt và install.log từ ổ đĩa cục bộ. Chúng tôi sẽ dùng SMTP server Gmail (trước tiên bạn cần tạo app password trong Gmail và dùng nó cho xác thực smtp thay vì mật khẩu Gmail):
$MailMessage = @{
To = "admin@woshub.com"
Bcc = "manager@woshub.com", "manager2@woshub.com"
From = "smtpsender1@gmail.com"
Subject = "DC Server Report"
Body = "Welcome!
Generated: $(Get-Date -Format g)
"
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = "UTF8"
Attachment = "C:\Logs\file1.txt", "C:\Logs\install.log"
}
Send-MailMessage @MailMessage -Credential $cred
Đây là hình ảnh email dạng HTML với file đính kèm trong giao diện Gmail.
Bạn có thể cấu hình thông báo giao hàng (read receipts) cho email bằng -DeliveryNotificationOption. Thông báo giao hàng cho phép bạn được thông báo nếu người nhận nhận được email.
Các loại thông báo có sẵn:
- OnSuccess (Thông báo nếu giao hàng thành công)
- OnFailure (Thông báo nếu giao hàng thất bại)
- Delay (Thông báo nếu giao hàng bị trì hoãn)