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

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

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

使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2


在以下两篇文章系列中,我们回顾主题 - 如何使用“发送电子邮件 PowerShell 脚本”,该脚本将使用 Office 365 邮件服务器作为他的邮件服务器。使用“发送电子邮件 PowerShell 脚本”的最常见用途是:

  • 测试将电子邮件发送到 Office 365 邮件基础设施的过程
  • 使用“发送电子邮件 PowerShell 脚本”实现自动化目的,例如发送每日报告。

一般来说,我们有两个主要选项来解决 Office 365 邮件基础设施问题

1. 匿名 SMTP 会话

2. 经过身份验证的 SMTP 或 TLS 会话。

  • 在本文中,我们将回顾可以伪装成匿名 SMTP 邮件会话的方法。
  • 在下一篇文章中,我们将回顾可伪装为经过身份验证的 TLS 邮件会话的方法,以及如何使用 Windows 任务计划程序组件来使用发送电子邮件 PowerShell 脚本”

寻址 Office 365 邮件服务器的两种主要方法

在开始详细说明如何创建所需的“发送电子邮件 PowerShell 脚本”之前,我们先简要回顾一下客户端寻址 Office 365 邮件服务的方法。

当我们想要寻址Office 365邮件服务器(Exchange Online)时,我们可以使用以下方法之一:

方法 1 - 使用标准匿名 SMTP 会话寻址 Office 365 邮件服务器

一种方法,其中我们的 PowerShell 脚本使用 SMTP 会话(非加密会话)对 Office 365 邮件服务器进行寻址。

SMTP 会话是使用匿名连接创建的。
“匿名连接”的含义是,寻址 Office 365 邮件服务器(PowerShell 脚本)的一方不提供任何用户证书。

优势

此方法的主要好处是我们避免了提供用户凭据的过程。提供凭证的需求对其他任务(例如保护凭证的需求等)是“盲目的”。

缺点

使用匿名连接的主要缺点是邮件服务器无法信任发件人,因为发件人显示为匿名。

大多数情况下,PowerShell 脚本发送的电子邮件将被识别为欺骗电子邮件,因为我们用作“发件人地址”的 Office 365 收件人电子邮件地址未经身份验证。

另外的缺点是,当使用“匿名会话”时,我们无法将电子邮件发送给“外部收件人”,即其电子邮件地址不是由托管我们域的 Exchange Online 服务器托管的收件人。

此问题的解决方案可以通过创建 Exchange Online 传入邮件连接器或在允许的发件人白名单中定义发件人的 10 个电子邮件地址来实现。

如果您需要有关如何创建此类邮件连接器的更多信息,请阅读文章 - 使用标准 SMTP 会话将邮件发送到 Exchange Online |第 2 部分#4

方法 2 - 使用 TLS 会话 + 凭据寻址 Office 365 邮件服务器

一种方法,其中 PowerShell 脚本使用 TLS 会话(加密会话)+ 提供用户凭据(经过身份验证的会话)来寻址 Office 365 邮件服务器。

优势

保护通信通道 - 使用 TLS 协议时,发送电子邮件的主机和 Office 365 邮件服务器之间的通信通道是加密的。

经过身份验证的会话 - 此方法的主要优点是,当我们提供 Office 365 收件人凭据时,Exchange Online 将“发件人”作为受信任的发件人进行关联。

因此,我们不需要在 Exchange Online 服务器端添加额外的配置设置,而且我们可以将电子邮件发送给未托管在 Exchange Online 服务器上的外部收件人。

缺点

如果我们想要使用“发送电子邮件 PowerShell 脚本”作为计划任务,我们需要找到一种解决方案,使 PowerShell 脚本可以访问存储在文件中的所需凭据。

以不安全的格式保存用户凭据(例如密码)是不好的做法!

虽然我们可以将密码添加到不受保护的文本文件(PowerShell 文件)中,但不建议使用此选项。

针对这种“安全需求”的解决方案将通过一种方法来实现,在该方法中,我们创建一个加密的密码文件,并指示“发送邮件PowerShell脚本”访问该加密文件并从该文件中获取所需的密码。

我们需要加密凭据的过程比我们使用没有凭据的 SMTP 会话的场景更复杂。

方法 1 - 使用标准 SMTP 会话寻址 Office 365 邮件服务器

在本节中,我们将回顾如何创建“发送电子邮件 PowerShell 脚本”,它将 Office 365 作为邮件服务器。

在这种情况下,我们将创建一个标准 SMTP 会话,并且不会提供任何用户凭据(匿名连接)。

我们需要完成的任务如下:

  1. 获取我们将处理的邮件服务器的主机名
    我们需要从 Office 365 门户“获取”有关 Exchange Online 主机名的信息,即表示 Office 365 中的公共域名的 MX 记录 | DNS 设置。
  1. 创建一个 PowerShell 脚本,其中包含所需的参数,例如发件人电子邮件地址、收件人电子邮件地址、邮件服务器名称、邮件服务器端口号、用户凭据等。
  2. 运行“发送电子邮件 PowerShell 脚本”,并验证电子邮件是否已成功发送到目标收件人。

使用“发送邮件 PowerShell 脚本”的一般准则和要求

在运行“发送邮件 PowerShell 脚本”之前,我们需要确保满足以下要求:

1.PowerShell控制台和Set-ExecutionPolicy

默认情况下,PowerShell 控制台不允许运行 PowerShell 脚本。
如果我们过去没有使用现有的 PowerShell 控制台来运行 PowerShell 脚本,我们需要将 PowerShell 控制台配置为“允许》 PowerShell脚本执行。

如果您需要阅读如何启用 PowerShell 脚本执行的说明,可以使用以下部分中的说明

2. 网络防火墙和出站通信

基于端口 25 的 Exchange Online 服务器的通信通道。
我们需要验证我们的网络防火墙是否包含一条规则,使我们的桌面能够与 Office 365 邮件服务器实现 SMTP 会话(端口 25)。

3. 动态与静态 IP 地址

如果您从使用“动态公共 IP 地址”(例如家庭网络)的桌面运行“发送电子邮件 PowerShell 脚本”,Office 365 邮件服务器(Exchange Online)将不会接受通信请求。

您将需要使用位于网络上的主机,该网络使用静态 IP 地址来表示内部主机。

场景描述

为了能够演示我们如何使用“发送电子邮件 PowerShell 脚本”通过 Office 365 邮件服务器 (Exchange Online) 发送
电子邮件,我们将使用以下场景:

组织信息

  • 我们的组织公共域名是 - o365info.com
  • 我们的邮件基础设施托管在 Office 365 (Exchange Online) 上。

用户凭据

我们将使用其凭据的 Office 365 收件人是 -[email protected]
源发件人和目标收件人

在我们的场景中,我们将使用以下收件人:

Office 365 邮件基础设施

在 Office 365 环境中,如果我们想要使用 Office 365 邮件服务器的未经身份验证的会话,我们需要找到代表 Office 365 中公共注册域的 Exchange Online 的主机名。

  • 在我们的具体场景中,Office 365 邮件服务器的主机名是 - o365info2.mail.protection.outlook.com

注意 - 我们将在下一节中回顾如何获取有关 Exchange Online 主机名的信息。

  • 我们使用的通信端口是 25 (TLS)

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

任务 1#3 - 获取有关代表 Office 365 中公共域名的 MX 记录的主机名的信息

为了能够获取代表我们公共域名的 Office 365 邮件服务器的主机名,我们将使用 Office 365 管理门户。

  • 登录 Office 365 管理门户
  • 在左侧菜单栏上,选择设置图标
  • 选择域名菜单

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

在我们的场景中,我们将选择通过双击所选域名来查看域名的设置 - o365info.com

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

在下面的屏幕截图中,我们可以看到 o365info.com 域的 DNS 设置。

我们将复制 MX 记录中出现的主机名信息。

在我们的场景中,代表我们域的 Exchange Online 主机名是 - o365info2.mail.protection.outlook.com

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

任务 2#3 - 创建“发送邮件 PowerShell 脚本”

为了能够使用 PowerShell 发送电子邮件,我们将使用 PowerShell 命令:

Send-MailMessage

“发送邮件 PowerShell 脚本”是使用以下 PowerShell 语法创建的:

Send-MailMessage -From <sender> -To <recipient> -Subject "<Subject>" -Body "<Subject>" -SmtpServer <SMTP server> -Port <port number>

在我们的场景中,我们将使用带有以下参数的 PowerShell 命令语法:

Send-MailMessage -From [email protected] -To [email protected] -Subject "Test Email" -Body "Test SMTP Relay Service" -SmtpServer o365info2.mail.protection.outlook.com -Port 25

要创建 PowerShell 脚本,我们可以使用任何文本编辑器。

在我们的示例中,我们使用记事本。

我们将以下信息复制到文本文件中:

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

PowerShell命令语法包括以下部分:

  • 发件人(数字 1) - 我们将使用电子邮件地址 - [email protected] 来代表发件人电子邮件地址。
  • 收件人(数字 2) - 我们将使用电子邮件地址 - [email protected] 代表目标收件人电子邮件地址。
  • 主题(数字 3)——这是电子邮件主题的文本
  • 正文(数字 4)——这是将出现在电子邮件“正文”中的文本
  • SmtpServer(数字 5)——这是我们要寻址的邮件服务器的主机名或 IP 地址。在我们的场景中,我们希望将 Exchange Online 服务器称为“邮件服务器”。服务器”。我们将提供从上一步中获得的主机名 - o365info2.mail.protection.outlook.com
  • 端口(数字 6)——这是将“侦听”我们的通信请求的邮件服务器的端口号。在 Office 365 环境中,Exchange Online 将使用端口 25 进行侦听。

保存PowerShell脚本文件

下一步是将文本文件保存为 PowerShell 脚本。

我们使用记事本创建 PowerShell 脚本。
在我们的场景中,我们将命名 PowerShell 脚本 - Sendmail-smtp.ps1

  1. 在“保存类型”部分中,选择选项“所有文件 (*.*)”。
  2. 另外推荐的选项是,使用 UTF-8 保存 PowerShell 脚本
    这不是强制性要求,但根据我的经验,当使用标准格式保存 PowerShell 脚本时,例如作为 ANSI,当我们尝试从 PowerShell 控制台运行 PowerShell 脚本时,我们可能会遇到问题。

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

在我们的场景中,我们将“发送电子邮件 PowerShell 脚本”保存在我们在驱动器 C: 中创建的 script 文件夹中

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

任务 3#3 - 运行“发送邮件 PowerShell 脚本”

运行 PowerShell 脚本 |首次配置

默认情况下,PowerShell控制台将阻止我们运行PowerShell脚本。

为了能够运行 PowerShell 脚本,我们需要设置默认的 PowerShell 提取策略。

为了能够更新现有的 PowerShell 提取策略,我们需要以管理员身份运行 PowerShell 控制台。

  • 搜索PowerShell图标,右键单击PowerShell控制台图标并选择菜单-以管理员身份运行

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

出现一个弹出窗口,要求我们批准“以管理员身份运行”任务

  • 点击批准

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

运行以下 PowerShell 命令:

Set-ExecutionPolicy Unrestricted -force

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

任务 2#2 - 运行“发送邮件 PowerShell 脚本”

我们将使用以下命令从 PowerShell 控制台运行“发送邮件 PowerShell”:

  1. 通过导航到 PowerShell 脚本所在的路径来访问 PowerShell 脚本。
    在我们的场景中,PowerShell 脚本保存在 C:\script 文件夹中。

键入以下命令:

cd C:\script
  1. 运行 PowerShell 脚本

要执行 PowerShell 脚本,我们可以编写
脚本的全名 - Sendmail-smtp.ps1 或使用 PowerShell 自动完成功能。

例如,要调用 PowerShell 脚本,我们需要编写以下字符 - .\ ,输入 PowerShell 脚本的第一个字母 (“s“) 并点击 Tab键。

“敲”TAB键后,PowerShell控制台,我们自己完成PowerShell脚本名称的其余部分。

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

为了验证电子邮件是否成功发送,我们将使用 OWA 邮件客户端登录到管理邮箱。

在下面的屏幕截图中,我们可以看到电子邮件已成功发送到目标收件人,但需要强调的是,电子邮件已发送到
垃圾邮件文件夹

这是预期结果,因为如上所述,PowerShell 脚本使用 Office 365 收件人的身份 ([email protected])。由于 PowerShell 脚本未提供任何用户凭据,因此 Exchange Online 会将电子邮件视为“可疑电子邮件”,因此,reason 将电子邮件标记为垃圾邮件!

[玩转系统] 使用 PowerShell 脚本向 Office 365 发送电子邮件 |第 1 部分#2

如果您想避免这种情况,建议创建一个 Exchange Online 连接器,它将通过公共 IP 地址识别“源发件人”。

您可以在文章 - 使用标准 SMTP 会话将邮件发送到 Exchange Online | 中阅读有关此配置的更多信息。第 2 部分#4

当前文章系列的下一篇文章

使用 PowerShell 脚本发送电子邮件到 Office 365 并保存加密密码 |第 2 部分#2

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

取消回复欢迎 发表评论:

关灯