我想通过 bash 脚本发送邮件并得知他们已成功离开我的服务器。
有很多方法可以从 bash 发送邮件(请参阅1 2mail
以获得更多可能性)。一种常见的方法是将或mutt
与内置 MTA 一起使用(例如postfix
)。如果没有运行“真正的”邮件服务器,那么 postfix 可以配置为“智能主机”或“卫星系统”,它会连接到另一个 SMTP 服务器(所谓的中继)并通过该服务器发送所有内容。
我可以假设任何 MTA。由于我控制服务器,我愿意安装任何易于维护的 MTA = 具有 ubuntu(18.04 LTS 及更新版本)和 centos(7.4 及更新版本)软件包。现在我正在使用 postfix,因为我知道它没问题,并且作为中继的设置非常简单。
假设这样的设置,我想编写一个 bash 脚本,发送一封邮件,然后等待确认将其发送到中继成功了。我的问题是最后一部分。
echo "hello world" | mail -s "a subject" [email protected]
#
# Check that the mail has arrived at the relay server. But how?
#
答案1
所有广泛使用的 MTA 都不会向您提供实际发送过程的确认,这是有充分理由的:MTA 在定义上是基于队列的,并且在繁忙的邮件服务器上排队所花费的时间可能比 Shell 脚本预计等待的时间高出几个数量级。
例如,想想非常常见的灰名单场景:您希望您的脚本等待 10 分钟吗?
您有以下几种选择:
- 如果你的收件人发送了送达通知,你可以使用这些通知
- 你可以编写一个脚本,将邮件直接发送到相关域的 MX(可能有相关库),并可能需要等待几分钟
- 使用
-N 'success'
postfix 版本的 sendmail 中的参数,然后轮询 DSN 邮件
我已经使用了所有这三种变体,最后一种似乎最适合您的问题。