使用 PHP Swiftmailer 时,我们如何解决错误 554 5.5.1(无有效收件人)?

Posted

技术标签:

【中文标题】使用 PHP Swiftmailer 时,我们如何解决错误 554 5.5.1(无有效收件人)?【英文标题】:How do we solve error 554 5.5.1 (no valid recipients) when using PHP Swiftmailer? 【发布时间】:2019-07-04 03:06:48 【问题描述】:

在测试我们的邮件服务器时,我们偶然发现了一个错误,该错误阻止我们通过 php 发送邮件,尽管每个 Mail-in-a-box 的常规发送/接收工作没有任何问题。 我们正在运行一个单独的 Ubuntu 18.04 服务器,该服务器只有 Mail-in-a-box,所有需要的组件都在运行。

error.log 文本文件中的输出

PHP 致命错误:未捕获的 Swift_TransportException:预期响应 代码 354 但得到代码“554”,消息“554 5.5.1 错误:无效 收件人\r\n"

PHP 文件

$request_email = $_POST['request-email'];
$request_name = $_POST['request-name'];
$request_text = $_POST['request-text'];

$transport = (new Swift_SmtpTransport('data.abc.xy', 587, 'tls'))
    ->setUsername('contact@abc.xy')
    ->setPassword('*******')
    ->setStreamOptions(array('ssl' => array('allow_self_signed' => true, 'verify_peer' => false)));

$mailer = (new Swift_Mailer($transport));

$message = (new Swift_Message('Name: '. $request_name))
    ->setFrom(['' . $request_email => '' . $request_name])
    ->setTo(['contact@abc.xy'])
    ->setBody('E-Mail: ' . $request_email . $request_text)
    ->setContentType("text/html");

$result = $mailer->send($message);

我们尝试的是重新安装所有 Mail-in-a-box 和所有组件,并检查所有内容是否有拼写错误。收件人确实存在于我们的邮件服务器上,并且可以通过客户端手动接收和发送邮件。

【问题讨论】:

还要检查 MAIL_USERNAMEMAIL_FROM_ADDRESS 是否都指向同一个域。 【参考方案1】:

就我而言,我收到此错误是因为我忘记在收件人的域中设置 MX 记录,因此应用程序不知道将电子邮件发送到哪里。

另一个原因可能是域名被列入黑名单,检查垃圾邮件

【讨论】:

【参考方案2】:

我可以用Oludre 已经提到的相同方式解决。只需确保您的“发件人”地址与您登录到邮件服务器的地址匹配即可。

【讨论】:

【参考方案3】:

我通过确保在 env 文件中设置的电子邮件地址解决了这个问题

MAIL_USERNAME=example@example.com

与我的自定义通知邮件类的 toMail 函数中的“发件人”地址相同

->from('example@example.com','My app name')

似乎有些电子邮件服务觉得奇怪的是,应用程序使用一个凭据(环境凭据)发送电子邮件,但另一个电子邮件地址被屏蔽为发件人。

更好的解决方案可能是永远不要在通知类中设置“发件人”地址。

【讨论】:

【参考方案4】:

我在 Laravel 中遇到了同样的问题,并通过将“from”更改为“replyTo”来解决它。 我认为问题在于发件人和应用服务器的域不同时。

// in Laravel
// ...
namespace App\Notifications;
// ...
    public function __construct(User $from, string $body)
    
        $this->from = $from;
        $this->body = $body;
    
// ...
    public function toMail($notifiable)
    
        $message = new MailMessage;
        $message->subject('some subject');

        // "no valid recipients" error:
        // $message->from($this->from->email, $this->from->name_full);
        
        // works:
        // sender globally set in .env (MAIL_FROM_NAME, MAIL_FROM_ADDRESS)
        $message->replyTo($this->from->email, $this->from->name_full);
        
        $message->line(new HtmlString(nl2br($this->body)));

        return $message;
    
// Swiftmailer respectively
// ...
$message = (new Swift_Message('Name: '. $request_name))
    ->setFrom(['contact@abc.xy' => 'contact'])
    ->setReplyTo([$request_email => $request_name])
// ...

【讨论】:

该死,我试图解决这个问题已经很久了,现在我刚刚得到了你的答案,它在 2 秒内解决了它......非常感谢伙计?【参考方案5】:

我已经解决了这个错误(554),只需将这两行添加到 laravel(.env 文件):

MAIL_FROM_ADDRESS=you@email.com
MAIL_FROM_NAME="you@email.com"

在此之后运行此命令以刷新邮件缓存配置:

php artisan config:cache

【讨论】:

【参考方案6】:

554 5.5.1 错误是 SMTP 错误“没有有效的收件人”。如果您拼错了收件人地址,则可能会发生这种情况,但如果您未正确对传出服务器进行身份验证,也可能会发生这种情况。

所以问题在于 abc.xy 不是注册域,因此您无法向该地址发送电子邮件。我认为这与您的代码无关。

您可以捕获Swift_TransportException 错误并在您自己的代码库中处理它,例如:

try 
    $result = $mailer->send($message);
 
catch (Swift_TransportException $e) 
    echo $e->getMessage();

【讨论】:

认证错误!我正在通过服务器发送电子邮件,该服务器将根据源 IP 和 From-address 的存在进行身份验证。我的发件人地址不正确,因此未被视为经过身份验证。 我有同样的问题,对我来说,这似乎是由发件人姓名中的重音字符引起的

以上是关于使用 PHP Swiftmailer 时,我们如何解决错误 554 5.5.1(无有效收件人)?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swiftmailer 时如何设置回复

使用 SwiftMailer 的 PHP 附件

php发邮件:swiftmailer, php邮件库——swiftmailer

PHP - 使用 STARTTLS 和自签名证书的 Swiftmailer

使用 Swiftmailer 的 PHP 驱动的 HTML 联系表单有多安全?

使用 php、gmail 和 swiftmailer 发送电子邮件会导致与 SSL 相关的错误