当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] Send-MailMessage:发送电子邮件的 PowerShell 方式

作者:精品下载站 日期:2024-12-14 12:52:38 浏览:13 分类:玩电脑

Send-MailMessage:发送电子邮件的 PowerShell 方式


对于今天的 PowerShell cmdlet,我们将介绍 PowerShell cmdlet Send-MailMessage。此 PowerShell cmdlet 仅用于一个目的;以多种不同方式发送电子邮件。

由于 Send-MailMessage cmdlet 发送电子邮件的方式有很多种,因此让我们直接深入并开始介绍您可能遇到的所有常见示例。在本文中,我们将介绍许多示例,从最简单的一直到一些我不希望出现在任何人身上的场景!

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

SMTP 服务器

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

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

PS51> $PSEmailServer = 'smtp.server.local'

但是,此变量并不存在于 PowerShell 会话中。这意味着每次打开新的 PowerShell 会话时都必须定义它。因此,我建议要么通过在 Send-MailMessage 引用上方定义它来使用它,要么不全部定义它。相反,我会亲自提供 SMTPServer 参数值。这样您就不必管理可能会因您而改变的外部变量。

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

港口

默认情况下,cmdlet 将尝试通过 SMTP 服务器发送电子邮件的值为端口 25。这是普通的、未加密的 SMTP。然而,如今,使用 SSL/TLS 发送加密电子邮件更为常见(我们稍后将介绍这些场景)。

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

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

接收者和发起者

要通过“收件人”、“抄送”和“密件抄送”字段等方法将电子邮件发送给不同的收件人,cmdlet 具有各种参数来适应这种情况。

Send-Mailmessage Cmdlet 中的“收件人”、“抄送”和“密件抄送”参数

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

您可以指定单个地址,如下所示。

PS51> Send-MailMessage -To [email  -Cc b[email  -Bcc [email  -Subject 'this is a subject'

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

PS51> Send-MailMessage -To [email , [email  -Cc [email , [email  -Bcc [email ,[email  -Subject 'this is a subject'

来自参数

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

PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject'

默认情况下,使用电子邮件地址只会在收件人的 FROM 字段中显示电子邮件地址。但是,如果您想指定名称或某种标签(例如服务帐户邮箱),您还可以指定名称和电子邮件,例如:

Adam Bertram <[email >

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

身体

Body 参数允许您指定电子邮件正文中的内容。最简单的是,您可以指定任何您想要的文本,cmdlet 将通过纯文本发送它。

PS51> Send-MailMessage -From [email  -To [email protected] -Subject 'this is a subject' -Body 'this is the body'

发送 HTML 正文电子邮件

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

$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 [email  -To jo[email  -Subject 'this is a subject' -Body $body -BodyAsHtml

请注意,在上面的示例中,我将正文字符串括在 @''@ 中。这称为此处字符串。这允许您定义通常在电子邮件正文中看到的包含回车符的长字符串。这里的字符串保留了字符串的格式,是定义电子邮件正文的好方法,尤其是在 HTML 格式的情况下。

编码

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

您在这里有几个选择:

  • ASCII(默认)
  • UTF8
  • UTF7
  • UTF32
  • 统一码
  • BigEndianUnicode
  • 默认
  • 代加工
PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8

附件

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

PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'

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

PS51> Send-MailMessage -From [email  -To [email  -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 [email  -To [email protected] -Subject 'this is a subject' -Body 'this is the body'

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

默认情况下,该 cmdlet 通过端口 25 通过未加密的 SMTP 通信发送电子邮件。但是,它还支持使用用户名和密码通过 SSL/TLS 发送加密电子邮件。

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

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 [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential

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

一个常见的电子邮件示例是使用 Gmail。利用您在上面获得的知识,您现在可以使用 smtp.gmail.com SMTP 服务器轻松通过 Gmail 发送电子邮件,如下所示。

$gmailCred = Get-Credential

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

Send-MailMessage @sendMailParams

分配电子邮件优先级

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

[玩转系统] Send-MailMessage:发送电子邮件的 PowerShell 方式

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

  • 正常(默认)
  • 高的
  • 低的
PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -Priority High

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

交货通知

最后,您可以指定电子邮件的送达通知。送达通知在某些电子邮件客户端中通常称为已读回执。送达通知允许您在收件人收到电子邮件时收到通知。但是,收件人仍必须允许。

请求送达通知时,您有四个选项。

  • 无(默认)
  • OnSuccess(电子邮件发送成功时)
  • OnFailure(发送不成功则通知)
  • 延迟(当电子邮件通过 SMTP 服务器延迟时)

您可以使用 DeliveryNotificationOptions 参数指定送达通知选项。

PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'

您还可以一次请求多个送达通知,并用逗号分隔它们。

PS51> Send-MailMessage -From [email  -To [email  -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'

概括

在这篇文章中,您了解了有关 Send-mailmessage cmdlet 及其功能的所有信息。我们使用该 cmdlet 具有的每个参数以及示例广泛介绍了该 cmdlet。我希望这篇文章可以为您在使用 Send-mailmessage cmdlet 时提供参考。

进一步阅读

请务必查看其他一些相关帖子!

  • 使用 Get-ChildItem PowerShell cmdlet
  • 使用 Set-Content PowerShell cmdlet
  • 使用 Out-File PowerShell cmdlet

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯