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



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

错误.log文本文件中的输出

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

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和所有组件,并检查所有拼写错误。Ricipient确实存在于我们的邮件服务器上,可以通过客户端手动接收和发送邮件。

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

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

最后,运行以下命令以刷新邮件缓存配置:

php artisan config:cache

554 5.5.1 错误是 SMTP 错误">没有有效的收件人"。 如果收件人地址拼写错误,则可能会发生这种情况,但如果未正确向发送服务器进行身份验证,也会发生这种情况。

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

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

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

我在Laravel中遇到了同样的问题,并通过将"from"更改为"replyTo"来修复它。我相信问题是当发件人和应用程序服务器的域不同时。

// in Laravel
// ...
namespace AppNotifications;
// ...
    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])
// ...

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

MAIL_USERNAME=example@example.com

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

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

似乎某些电子邮件服务发现应用程序使用一个凭据(env 凭据(发送电子邮件,但另一个电子邮件地址被屏蔽为发件人,这似乎很奇怪。

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

还有一件事是,你的代码可能一切正常,但接收方地址根本不存在。我们有很多来自其他公司的客户,随着时间的推移,人们只需更换工作,他们使用的电子邮件地址就会被删除

"receiver email address doesn't exist anymore"

因此,如果您尝试向不存在的电子邮件地址发送电子邮件,则会收到相同的错误。

在我的

例子中,.env 文件中的MAIL_FROM_NAME值与我的 laravel 代码中的"name"不同。前任:

  • 在 .env 中MAIL_FROM_NAME=mymail@dot.com

  • 在我的拉拉维尔代码中

    $m->from('mymail@dot.com"、"myOther@mail.com"(;

当我输入'mymail@dot.com'或文本(例如:"邮件发件人姓名"(而不是'myOther@mail.com'时,它工作正常!

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

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

相关内容