sendmail-确保电子邮件已发送

sendmail-确保电子邮件已发送

我正在尝试通过 sendmail 发送电子邮件,并阻止它们排队。我只希望发送电子邮件,到目前为止,这一直是一个极端的问题。

在 sendmail.cf 和 submit.cf 中,我都有以下设置:

O QueueLA=99

在邮件日志中,写着该邮件已发送并已排队。说真的,这不是太令人困惑了吗?

Feb 10 17:04:34 nnn sendmail[27910]: r1AG4Q0V027910: [email protected], 
[email protected] (33/33), delay=00:00:08, xdelay=00:00:04, 
mailer=relay, pri=30391, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, 
stat=Sent (r1AG4U09027911 Message accepted for delivery)

Feb 10 17:04:36 nnn sm-mta[27913]: r1AG4U09027911: to=<[email protected]>, 
delay=00:00:06, xdelay=00:00:02, mailer=esmtp, pri=120589, 
relay=mail1.someone.com. [207.106.200.39], dsn=2.0.0, stat=Sent 
(Queued! 1360512372 qp 15149 <[email protected]>)
  1. 当写这个日志的时候,电子邮件是否发送了?
  2. 有什么方法可以避免最后排队吗?

答案1

为什么要改变这一点?这正是 sendmail 的运作方式。在向原始发件人确认已接受邮件之前,Sendmail 会将其保存在硬盘驱动器上的队列中。然后它会拾取邮件并保留物理副本,直到下一个收件人确认收到。这就是 sendmail 确保在系统发生硬崩溃或 sendmail 自身崩溃时邮件不会丢失的方式。Sendmail 还会由于各种原因延迟邮件。有时您无法控制的其他 MTA 会延迟电子邮件(网络问题、系统负载、灰名单)。它需要将邮件安全地存储在某个地方。

电子邮件并非即时通讯的即时传递机制。正常情况下请等待 2 秒钟。

当您看到其他邮件服务器的 stat=Sent 时,您就知道邮件已发送:relay=mail1.someone.com. [207.106.200.39], dsn=2.0.0, stat=Sent

答案2

SMTP 不保证电子邮件一定能到达目的地;它是一种尽力而为的传递机制,没有同步端到端反馈来了解您的流量的命运。您要向其传递邮件的服务器必须直接告诉您是否接受这些邮件并最终进行传递,但它不需要同步传递这些邮件(它可以存储这些邮件以供日后使用,而不告诉您),也不需要直接传递这些邮件(该路径有多个跳转)。实际上,几乎所有 SMTP 守护程序都会对邮件进行排队。

由于垃圾邮件发送者滥用,送达和已读回执功能并未得到广泛支持,其设计初衷就是为了克服这一限制。此外,如果最初将邮件发送到的服务器接受了您的邮件,而服务器拒绝了您的邮件,则服务器可能会在将来的某个时间自行选择向您发送通知,但这不是必须的。

您的应用程序应将下一跳的接受视为成功案例。这是 SMTP 始终为您提供的最可靠反馈。

答案3

经过一番研究,我发现括号里的消息(Queued! 1360512372 qp 15149 <[电子邮件保护]>) 是来自接收服务器的消息。

这意味着:

  1. 是的,邮件已发送。
  2. 否,因为该消息已在接收服务器上排队。

以下是我如何得到答案的一些解释: freebsd 8 邮件日志状态,这些是什么意思? 答案中的一些引述在我看来是可靠的:

“已发送状态条目表示远程服务器接受了该消息。”

“状态条目括号内的注释是远程服务器在发送电子邮件时给出的答复。它对于查看邮件被拒绝、推迟或保留的原因很有用。”

相关内容