使用 Send-MailMessage PowerShell Cmdlet 轻松发送电子邮件

对于今天的PowerShell cmdlet,我们要介绍的是PowerShell cmdlet Send-MailMessage。这个PowerShell cmdlet只有一个目的,那就是发送电子邮件,而且有很多不同的方式。很多不同的方式。

由于Send-MailMessage cmdlet可以以很多方式发送电子邮件,让我们直接深入了解并开始涵盖您可能遇到的所有常见示例。在这篇文章中,我们将涵盖从最简单的到我不希望任何人遇到的一些场景的许多示例。

在您需要使用PowerShell发送电子邮件并忘记语法的情况下,这篇文章将是一个很好的书签资源。

SMTP服务器

所有电子邮件都必须通过某个SMTP服务器通过服务器和端口进行中继。要指定要使用的SMTP服务器,请使用一个称为SMTPServer的参数,该参数允许您指定要建立连接并中继邮件的SMTP服务器。但这不是必需的。

如果不为SMTPServer参数指定值,则将使用存储在$PSEmailServer首选变量中的值。您可以像为任何其他变量分配值一样为此变量分配值。

Assigning a value to the $PSEmailServer preference variable
PS51> $PSEmailServer = 'smtp.server.local'

然而,这个变量在PowerShell会话之间不保留。这意味着每次打开新的PowerShell会话时,您都必须重新定义它。因此,我建议要么在Send-MailMessage引用上面定义它,要么根本不定义它。相反,我个人建议提供SMTPServer参数值。这样,您就不必管理可能会更改的外部变量。

PS51> Send-MailMessage -SmtpServer 'smtp.server.local'

端口

默认情况下,该命令将尝试通过SMTP服务器发送电子邮件的端口为25。这是纯粹的、未加密的SMTP。然而,现在更常见的是使用SSL/TLS发送加密电子邮件(我们稍后会涵盖这些场景)。

如果您需要更改端口,可以使用Port参数。

PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587

收件人和发件人

通过ToCcBcc字段之类的方法发送电子邮件给不同的收件人,该命令具有各种参数来适应这一点。

Send-Mailmessage Cmdlet中的To、Cc和Bcc参数

该命令具有三个参数,每个参数都支持通过逗号分隔的多个收件人,分别为ToCcBcc

您可以像下面这样指定单个地址。

Sending email to one recipient via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com -Cc bob@gmail.com -Bcc susie@hotmail.com -Subject 'this is a subject'

或者您可以为每个参数值指定多个收件人。

Sending email to multiple recipients via To, Cc and Bcc
PS51> Send-MailMessage -To joe@gmail.com, tony@mycompany.local -Cc bob@gmail.com, rick@othercompany.com -Bcc susie@hotmail.com,secret@fooorg.org -Subject 'this is a subject'

发件人参数

在发送电子邮件时,您还可以指定From参数,该参数将设置电子邮件中的回复地址标头。此参数仅允许一个地址。如果收件人选择回复邮件,这将是回复邮件返回的电子邮件地址。

Sending email from an address
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject'

默认情况下,使用电子邮件地址将简单地显示在收件人的FROM字段中。但是,如果您想指定名称或类似Service Account Mailbox的某种标签,您也可以指定名称和电子邮件地址:

Adam Bertram <adbertram@gmail.com>

请注意使用了Subject参数。此参数始终是必需的。您将在所有示例中看到使用此参数。

正文

Body参数允许您指定电子邮件正文内容。在最简单的情况下,您可以指定任何您喜欢的文本,命令将通过纯文本发送它。

PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

发送HTML正文电子邮件

您还可以通过HTML而不是纯文本发送电子邮件正文。为此,请使用与纯文本相同的Body参数,但使用HTML作为字符串,并使用BodyAsHtml开关参数。

Sending an HTML table in an email
$body = @' <table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr> </table> '@ PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body $body -BodyAsHtml

请注意上面的示例,我将body字符串包裹在@''@中。这被称为here string。这使您能够定义通常在包含换行符的电子邮件正文中看到的长字符串。Here strings保留字符串的格式,并且是定义电子邮件正文的绝佳方式,特别是如果它是HTML格式的。

编码

如果您的电子邮件主题或正文中有特殊字符,则可以使用Encoding参数。此参数允许您在发送之前通过指定的编码类型对电子邮件主题和正文进行编码。

您在这里有几个选项:

  • ASCII(默认)
  • UTF8
  • UTF7
  • UTF32
  • Unicode
  • BigEndianUnicode
  • Default
  • OEM
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

附件

该cmdlet还可以附加一个或多个文件。要执行此操作,您可以使用Attachments参数,并提供要附加的文件的路径。

Attaching the C:\file.doc to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

您还可以通过用逗号分隔的集合指定多个附件。

Attaching the C:\file.doc and D:\report.xlsx file to an email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'

Attachments参数还允许您通过像Get-ItemGet-ChildItem这样的cmdlet将文件导向到Send-MailMessage cmdlet。

PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body'

安全和经过身份验证的电子邮件

默认情况下,cmdlet通过未加密的SMTP通信在端口25上发送电子邮件。然而,它也支持通过SSL/TLS发送加密电子邮件,并使用用户名和密码。

如果您尝试通过需要身份验证的SMTP服务器中继电子邮件,则命令将失败,并显示以下错误消息。

Error message when attempting to send unencrypted email.
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.

为了解决这个问题,您首先必须指定端口(通常为TLS的587)和UseSsl参数。这告诉cmdlet尝试连接到SMTP服务器上的端口587,并加密整个消息。通常(总是?)还需要使用Credential参数指定用户名/密码来对SMTP服务器进行身份验证。

PS51> $credential = Get-Credential
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

上面我正在使用Get-Credential cmdlet来获取凭据(PSCredential)对象。这有时会带来问题,因为它是交互式的,这意味着它会停止脚本并要求输入用户名和密码。为了防止这种情况发生,您可以即时创建一个PSCredential对象

A common email example is to use Gmail. Using the knowledge you’ve gained above, you can now easily send email through Gmail using the smtp.gmail.com SMTP server as shown below.

$gmailCred = Get-Credential

$sendMailParams = @{
    From = '[email protected]' ## 必须是gmail.com
    To = '[email protected]'
    Subject = 'some subject'
    Body = 'some body'
    SMTPServer = 'smtp.gmail.com'
    SMTPPort = 587
    UseSsl = $true
    Credential = $gmailCred
}

Send-MailMessage @sendMailParams

分配电子邮件优先级

尽管我个人希望电子邮件的一个特性消失,但您可以通过Priority参数为您发送的电子邮件分配优先级。然后,电子邮件客户端会以各种方式解释这个优先级。

High priority message in Outlook

Send-mailmessage允许您为电子邮件分配三种不同的优先级。

  • 普通(默认)
Assigning a high-priority email
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -Priority High

但请你看在上帝的份上,不要认为你所有的电子邮件都是高优先级的!

交付通知

最后,您可以为电子邮件指定交付通知。交付通知通常在某些电子邮件客户端中被称为已读回执。交付通知允许您在收件人收到电子邮件时或何时收到通知。但是,收件人仍然必须允许此操作。

在请求交付通知时,有四个选项可供选择。

  • 无(默认)
  • OnSuccess(当电子邮件成功交付时)
  • OnFailure(如果交付失败则通知)
  • Delay(当电子邮件通过SMTP服务器延迟时)

您可以通过使用DeliveryNotificationOptions参数指定交付通知选项。

Requesting a notification on delivery
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

您还可以通过用逗号分隔它们一次性请求多个交付通知。

Requesting a notification for all types
PS51> Send-MailMessage -From me@company.org -To joe@gmail.com -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

总结

在这篇文章中,您了解了Send-mailmessage cmdlet以及它的所有参数和示例。我们详细介绍了这个cmdlet。希望这篇文章在您使用Send-mailmessage cmdlet时能为您提供参考。

更多阅读

确保查看一些其他相关的帖子!

Source:
https://adamtheautomator.com/send-mailmessage/