我正在编写一个程序,该程序将使用postfix
该mail -s
命令发送外部电子邮件,我需要验证电子邮件是否已发送到指定的地址。
在这种情况下,我很好奇是否postfix
立即报告错误,如果电子邮件发送失败或者如果postfix
只要有效的电子邮件([电子邮件受保护])被输入,然后在日志文件中报告或导致电子邮件无法发送?
另外如果网络断了,postfix
只要使用有效的邮箱地址仍然会返回成功,还是会立即报告失败?
答案1
如果您的 postfix 配置设置为日志,您可以检查日志以了解消息的状态。
它将包含以下信息:
Mar 25 16:07:40 serverName postfix/smtp[3113]: B169ZZZ24F: host foo.net.mx1.name.foo.net[1.2.3.4] refused to talk to me: 421 Offline: HELO/FDNS
Mar 25 16:07:40 serverName postfix/smtp[3036]: 7ZZZFC2440: to=<[email protected]>, relay=mtaz.amz.yahoodns.net[66.196.118.35]:25, delay=11, delays=0.35/0/0.6/9.9, dsn=2.0.0, status=sent (250 ok dirdel)
Mar 25 16:07:36 serverName postfix/smtp[3073]: ZZZZ3C623E: to=<[email protected]>, relay=none, delay=0.55, delays=0.35/0/0.2/0, dsn=5.4.4, status=bounced (Host or domain name not found. Name service error for name=customer.com type=A: Host not found)
可以通过包含以下行的脚本检索此信息:(不是我的工作。感谢谁,这每天都会使用。)
grep 'status=sent' /var/log/mail.log | awk '{print $7}' | sed 's/to=<//g' | sed 's/>,//g'
grep 'status=deferred' /var/log/mail.log | awk '{print $7}' | sed 's/to=<//g' | sed 's/>,//g'
grep 'status=bounced' /var/log/mail.log | awk '{print $7}' | sed 's/to=<//g' | sed 's/>,//g'
答案2
一些严重的错误(例如读取消息内容的 I/O 错误或非常严重的无法解析的消息/地址)可能会立即报告为失败退出,但通常情况不会如此,您不能指望它。
如果发生送货失败的情况,您应该收到退回邮件(发送回发起邮件的用户),但如果 Postfix 成功地将邮件转发到另一个邮件传输代理并且错误发生在下线,那么即使这也可能超出 Postfix 的控制范围。反弹可能会在几分钟或几天后出现。
如果网络出现故障,Postfix 仍会返回成功。这是一个功能,而不是一个错误:-)