我正在使用 Postfix 发送我的电子邮件,而且我有相当多的电子邮件列表可以发送时事通讯。因此,我更喜欢通过将其中一封电子邮件设置To
为Bcc
(在 PHP 中)和一堆其他电子邮件来将我的 SMTP 请求打包成一个请求。
我的问题是,如果其中一封电子邮件无效,Postfix 会拒绝整个请求并提示以下错误:
5.1.1 : Recipient address rejected: User unknown in local recipient table
Run Code Online (Sandbox Code Playgroud)
如果我能以某种方式配置 Postfix 以便它转储无效的但发送其余的,那就太好了。我知道我可以在电子邮件中使用地址之前自己验证地址,但我更喜欢它是由 Postfix 完成的。
[更新]
这是邮件日志的内容:
Nov 18 16:20:28 mail postfix/smtpd[12922]: 14A5FB812E1: client=localhost[127.0.0.1]
Nov 18 16:20:28 mail postfix/smtpd[12922]: 14A5FB812E1: reject: RCPT from localhost[127.0.0.1]: 550 5.1.1 <mehran_hotmail.com>: Recipient address rejected: User unknown in local recipient table; from=<mehran@localhost> to=<mehran_hotmail.com> proto=ESMTP helo=<localhost>
Run Code Online (Sandbox Code Playgroud)
而我试图与发送电子邮件会产生这个错误mehran@hotmail.com
的主要接受者和mehran_hotmail.com
作为Bcc
。
[更新]
这是与请求相关的完整日志:
Nov 19 09:47:01 mail postfix/smtpd[20947]: connect from localhost[127.0.0.1]
Nov 19 09:47:01 mail postfix/smtpd[20947]: EC281B81BCE: client=localhost[127.0.0.1]
Nov 19 09:47:01 mail postfix/smtpd[20947]: warning: Illegal address syntax from localhost[127.0.0.1] in RCPT command: <mehran@?????.com>
Nov 19 09:47:01 mail postfix/smtpd[20947]: disconnect from localhost[127.0.0.1]
Run Code Online (Sandbox Code Playgroud)
这是一个新的场景(导致同样的问题),我在其中使用了正确的电子邮件地址(包括To
和Bcc
保持正确的电子邮件地址,但不是相同的地址),但这次因为Postfix的不承认它的电子邮件地址被拒绝。我使用非 ASCII 字符作为域名 (mehran@?????.com)。我不在乎 Postfix 是否支持非 ASCII 地址,只是当它拒绝一个地址时,整个请求都会被拒绝!!并且没有电子邮件发送到 mehran@hotmail.com(以 命名To
)!
现在返回到我的代码(PHP 制作 MUA)的错误消息是:
5.1.3 Bad recipient address syntax
Run Code Online (Sandbox Code Playgroud)
至于我与SMTP
服务器交互的 PHP 代码:
$mail = new \Zend_Mail('utf-8');
$mail->setMessageId($mail->createMessageId());
foreach ($array_to as $to) {
$mail->addTo($to['email'], $to['name']);
}
foreach ($array_cc as $to) {
$mail->addCc($to['email'], $to['name']);
}
foreach ($array_bcc as $to) {
$mail->addBcc($to['email'], $to['name']);
}
$mail->setSubject($subject);
$mail->setBodyHtml($body);
$mail->setFrom($current_user_email, $current_user_name);
$mail->setDate(new \Zend_Date());
$smtp = createSmtpConnection();
$smtp->send($mail);
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用了 Zend Framework (v1) 并且我的代码相当简单。该$array_*
变量是抱着电子邮件地址简单数组。在我的测试场景中,只有两个电子邮件地址,To
一个用于Bcc
.
TLDR:您的案例是邮件客户端在正确的 SMTP 交易中的异常行为。也许你的 PHP 代码有问题。请参阅postfix 邮件列表上的此线程。Postfix作者在该线程中的引用
你误会了。您没有任何证据表明 Postfix 拒绝整个邮件。
众所周知,一些 SMTP CLIENT 程序会在一个收件人不被接受时放弃传递邮件,即使其他收件人是好的。
首先,我们将了解 SMTP 事务。以下是 SMTP 在低级别的工作方式。您可以随时通过 telnet/netcat 尝试。
案例 1这是只有一个收件人时的交易。
S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<mail@example.com>
S: 250 OK
C: RCPT TO:<john@example.net>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye
Run Code Online (Sandbox Code Playgroud)
因此,SMTP 是一种闲聊协议,每次客户端发出命令(HELO/MAIL/RCPT/DATA/QUIT)时,服务器都应在事务继续之前对其进行应答。在这种情况下,所有答案的代码都是 250,或者在人类语言中我接受了它。
案例 2多个收件人的 SMTP 事务
S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<mail@example.com>
S: 250 OK
C: RCPT TO:<john@example.net>
S: 250 OK
C: RCPT TO:<doe@example.net>
S: 250 OK
C: RCPT TO:<alice@example.net>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye
Run Code Online (Sandbox Code Playgroud)
在这个例子中有三个收件人。我们在单个事务中使用多个 RCPT 命令。RCPT 命令是特殊命令。可以针对给定的电子邮件消息多次重复此命令,以便将单个电子邮件消息传递给多个收件人。
情况 3如果某些收件人拒绝(但不是全部),则继续交易。这里是示例交易。
S: 220 smtp.example.net Simple Mail Transfer Service Ready
C: HELO client.example.com
S: 250 Hello client.example.com
C: MAIL FROM:<mail@example.com>
S: 250 OK
C: RCPT TO:<john@example.net>
S: 250 OK
C: RCPT TO:<invaliduser@example.net>
S: 550 5.1.1 <invaliduser@example.net>: Recipient address rejected: User unknown in local recipient table
C: RCPT TO:<alice@example.net>
S: 250 OK
C: DATA
S: 354 Send message content; end with <CRLF>.<CRLF>
C: The message data (body text, subject, e-mail header, attachments etc) is sent
C: .
S: 250 2.0.0 Ok: queued as D7D3E84403
C: QUIT
S: 221 Bye
Run Code Online (Sandbox Code Playgroud)
为什么服务器仍然接受电子邮件?因为在一个无效接收者旁边有两个有效接收者。
免责声明:以上资源取自此处。
好的,我已经尝试在我的盒子中重现您的问题。这是我带有库PHPMailer 的PHP 代码。(我不熟悉 zend 框架)
<?php
require '../PHPMailerAutoload.php';
$internaldomain = 'in.example.com';
$externaldomain = 'ex.example.com';
$mail = new PHPMailer;
$mail->isSMTP();
$mail->SMTPDebug = 2;
$mail->Host = "smtp6.example.com";
$mail->Port = 25;
$mail->SMTPAuth = false;
$mail->setFrom('from@' . $internaldomain, 'First Last');
$mail->addAddress('valid@' . $externaldomain, 'valid 1');
$mail->AddBCC('bounce@' . $internaldomain, 'valid 3');
$mail->AddBCC('invaliduser@' . $internaldomain, 'invalid user');
$mail->AddBCC('root@' . $internaldomain, 'valid 4');
$mail->Subject = 'PHPMailer SMTP test';
$mail->IsHTML(false);
$mail->Body = "This is test";
if (!$mail->send()) {
echo "Mailer Error: " . $mail->ErrorInfo;
} else {
echo "Message sent!";
}
Run Code Online (Sandbox Code Playgroud)
由于SMTPDebug
已启用,输出包含完整的 SMTP 事务。这个输出类似于上面的例子。
SERVER -> CLIENT: 220 smtp6.example.net ESMTP at your service
CLIENT -> SERVER: EHLO web.example.net
SERVER -> CLIENT: 250-smtp6.example.net
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
CLIENT -> SERVER: MAIL FROM:<from@example.net>
SERVER -> CLIENT: 250 2.1.0 Ok
CLIENT -> SERVER: RCPT TO:<valid@example.org>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: RCPT TO:<bounce@example.net>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: RCPT TO:<invaliduser@example.net>
SERVER -> CLIENT: 550 5.1.1 <invaliduser@example.net>: Recipient address rejected: User unknown in local recipient table
SMTP ERROR: RCPT TO command failed: 550 5.1.1 <invaliduser@example.net>: Recipient address rejected: User unknown in local recipient table
CLIENT -> SERVER: RCPT TO:<root@example.net>
SERVER -> CLIENT: 250 2.1.5 Ok
CLIENT -> SERVER: DATA
SERVER -> CLIENT: 354 End data with <CR><LF>.<CR><LF>
CLIENT -> SERVER: Date: Wed, 19 Nov 2014 09:28:16 +0700
CLIENT -> SERVER: To: valid 1 <valid@example.org>
CLIENT -> SERVER: From: First Last <from@example.net>
CLIENT -> SERVER: Subject: PHPMailer SMTP test
CLIENT -> SERVER: Message-ID: <b67f817cacdff282e92dc17f9c4f406b@web.example.net>
CLIENT -> SERVER: X-Priority: 3
CLIENT -> SERVER: X-Mailer: PHPMailer 5.2.9 (https://github.com/PHPMailer/PHPMailer/)
CLIENT -> SERVER: MIME-Version: 1.0
CLIENT -> SERVER: Content-Type: text/plain; charset=iso-8859-1
CLIENT -> SERVER: Content-Transfer-Encoding: 8bit
CLIENT -> SERVER:
CLIENT -> SERVER: This is test
CLIENT -> SERVER:
CLIENT -> SERVER: .
SERVER -> CLIENT: 250 2.0.0 Ok: queued as D7D3E84403
CLIENT -> SERVER: QUIT
SERVER -> CLIENT: 221 2.0.0 Bye
Run Code Online (Sandbox Code Playgroud)
和邮件日志条目
Nov 19 09:28:16 cache postfix/smtpd[14865]: D7D3E84403: client=unknown[192.168.192.100]
Nov 19 09:28:16 cache postfix/smtpd[14865]: D7D3E84403: reject: RCPT from unknown[192.168.192.100]: 550 5.1.1 <invaliduser@example.net>: Recipient address rejected: User unknown in local recipient table; from=<from@example.net> to=<invaliduser@example.net> proto=ESMTP helo=<web.example.net>
Nov 19 09:28:16 cache postfix/cleanup[14867]: D7D3E84403: message-id=<b67f817cacdff282e92dc17f9c4f406b@web.example.net>
Nov 19 09:28:17 cache postfix/qmgr[1200]: D7D3E84403: from=<from@example.net>, size=617, nrcpt=3 (queue active)
Nov 19 09:28:17 cache postfix/local[14870]: D7D3E84403: to=<root@example.net>, relay=local, delay=0.21, delays=0.21/0/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Nov 19 09:28:17 cache postfix/smtp[14869]: D7D3E84403: to=<valid@example.org>, relay=example.org[192.168.3.3]:25, delay=0.22, delays=0.21/0/0/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 3jj7Hj0pM3z5Twh)
Nov 19 09:28:17 cache postfix/local[14868]: D7D3E84403: to=<zbounce@example.net>, relay=local, delay=0.23, delays=0.21/0/0/0.02, dsn=2.0.0, status=sent (forwarded as 165E084404)
Nov 19 09:28:17 cache postfix/qmgr[1200]: D7D3E84403: removed
Run Code Online (Sandbox Code Playgroud)
看起来在我的盒子里,postfix 和 PHPMailer 在正常情况下表现得很好。您可以使用它来与您的邮箱中的 maillog 进行比较:)
归档时间: |
|
查看次数: |
4662 次 |
最近记录: |