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

9
当我们测试邮件服务器时,发现了一个错误,它阻止我们通过PHP发送邮件,尽管Mail-in-a-box的常规发送/接收没有任何问题。我们正在运行一个单独的Ubuntu 18.04服务器,只有Mail-in-a-box和所有必需的组件在运行。 错误日志文本文件输出: PHP致命错误:Uncaught 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 是否都指向同一个域名。 - Tariqul Islam
7个回答

18

我已经解决了这个错误(554),只需在 Laravel 的 .env 文件中添加以下两行:

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

最后,运行此命令以清除邮件缓存配置:

Finally, run this command to flush mail cache config:

php artisan config:cache

12

554 5.5.1 错误是SMTP错误"没有有效的收件人"。如果您拼写收件人地址有误,它可能会发生,但如果您未正确验证发件服务器,则也可能会发生。

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

您可以捕获Swift_TransportException错误,并像下面这样在自己的代码库中处理它:

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

2
身份验证失败! 我通过服务器发送电子邮件,该服务器将根据源IP和发件人地址的存在进行身份验证。我的发件人地址有问题,因此未被视为经过身份验证。 - Chris
我有同样的问题,对我来说似乎是由发件人名称中的重音字符引起的。 - Tofandel
我也遇到了同样的错误,但是在启用SMTP日志记录后,发现服务器IP地址被垃圾邮件过滤器列入黑名单:554 5.7.1服务不可用;客户端主机[<已隐藏的IP>]被b.barracudacentral.org阻止;http://www.barracudanetworks.com/reputation/?pr=1&ip= - Andis

6

我在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秒就搞定了...太感谢了,伙计。 - ylerjen

3

我通过确保env文件中设置的电子邮件地址

MAIL_USERNAME=example@example.com

与我的自定义通知邮件类toMail函数中“from”地址相同,解决了此问题。

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

似乎有些电子邮件服务会觉得应用程序使用一个凭据(env凭据)发送电子邮件,但是不同的电子邮件地址被掩盖为发送者,这很奇怪。

更好的解决方案可能是在您的通知类中从不设置“from”地址。


0
在我的情况下,.env文件中的MAIL_FROM_NAME值与我的Laravel代码中的'name'不同。 例如: 在.env文件中: MAIL_FROM_NAME=mymail@dot.com 在我的Laravel代码中: $m->from('mymail@dot.com', 'myOther@mail.com'); 当我输入'mymail@dot.com'或文本(例如:'MAIL SENDER NAME')而不是'myOther@mail.com'时,它能正常工作!

0

还有一件事是,你的代码可能没问题,但收件人地址根本不存在。我们有很多来自其他公司的客户,随着时间的推移,人们会改变工作,使用的电子邮件地址也会被删除。

"receiver email address doesn't exist anymore"

所以,如果您尝试发送电子邮件到不存在的电子邮件地址,则会收到相同的错误信息。


-1
在我的情况下,我之所以会出现这个错误,是因为我忘记在收件人的域上设置MX记录,因此应用程序不知道该将电子邮件发送到哪里。 另一个原因可能是该域被列入黑名单,请检查spamhaus。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,