使用 PHP Swiftmailer 时,我们如何解决错误 554 5.5.1(没有有效的收件人)?
How do we solve error 554 5.5.1 (no valid recipients) when using PHP Swiftmailer?
在测试我们的邮件服务器时,我们偶然发现了一个错误,该错误阻止我们通过 PHP 发送邮件,尽管每个 Mail-in-a-box 的常规 sending/receiving 工作没有任何问题。
我们是 运行 一个单独的 Ubuntu 18.04 服务器,它只有 Mail-in-a-box 及其所有需要的组件 运行。
在error.log文本文件中输出
PHP Fatal error: Uncaught Swift_TransportException: Expected response
code 354 but got code "554", with message "554 5.5.1 Error: no valid
recipients\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 和所有组件,并检查所有内容是否存在拼写错误。收件人确实存在于我们的邮件服务器上,可以通过客户端手动收发邮件。[=13=]
554 5.5.1 错误是 SMTP 错误“无有效收件人”。如果您拼错了收件人地址,就会发生这种情况,但如果您没有正确验证发件服务器,也会发生这种情况。
所以问题是 abc.xy 不是注册域,因此您无法向该地址发送电子邮件。我认为这与您的代码无关。
您可以捕获 Swift_TransportException
错误并在您自己的代码库中处理它,例如:
try {
$result = $mailer->send($message);
}
catch (Swift_TransportException $e) {
echo $e->getMessage();
}
我已经解决了这个错误 (554),只需添加到 laravel(.env 文件)这两行:
MAIL_FROM_ADDRESS=you@email.com
MAIL_FROM_NAME="you@email.com"
最后,运行 此命令刷新邮件缓存配置:
php artisan config:cache
我在 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])
// ...
我通过确保在 env 文件中设置的电子邮件地址解决了这个问题
MAIL_USERNAME=example@example.com
与我的自定义通知邮件中的“发件人”地址相同 class' toMail 函数
->from('example@example.com','My app name')
似乎有些电子邮件服务发现奇怪的是,该应用程序使用一个凭据(env 凭据)发送电子邮件,但另一个电子邮件地址被屏蔽为发件人。
更好的解决方案可能是永远不要在通知中设置“发件人”地址 classes。
我可以按照 已经提到的相同方式解决。只需确保您的“发件人”地址与您登录邮件服务器的地址相匹配即可。
在我的例子中,我收到这个错误是因为我忘记在收件人的域上设置 MX 记录,所以应用程序不知道将电子邮件发送到哪里。
另一个原因可能是域被列入黑名单,检查 spamhaus
在测试我们的邮件服务器时,我们偶然发现了一个错误,该错误阻止我们通过 PHP 发送邮件,尽管每个 Mail-in-a-box 的常规 sending/receiving 工作没有任何问题。 我们是 运行 一个单独的 Ubuntu 18.04 服务器,它只有 Mail-in-a-box 及其所有需要的组件 运行。
在error.log文本文件中输出
PHP Fatal error: Uncaught Swift_TransportException: Expected response code 354 but got code "554", with message "554 5.5.1 Error: no valid recipients\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 和所有组件,并检查所有内容是否存在拼写错误。收件人确实存在于我们的邮件服务器上,可以通过客户端手动收发邮件。[=13=]
554 5.5.1 错误是 SMTP 错误“无有效收件人”。如果您拼错了收件人地址,就会发生这种情况,但如果您没有正确验证发件服务器,也会发生这种情况。
所以问题是 abc.xy 不是注册域,因此您无法向该地址发送电子邮件。我认为这与您的代码无关。
您可以捕获 Swift_TransportException
错误并在您自己的代码库中处理它,例如:
try {
$result = $mailer->send($message);
}
catch (Swift_TransportException $e) {
echo $e->getMessage();
}
我已经解决了这个错误 (554),只需添加到 laravel(.env 文件)这两行:
MAIL_FROM_ADDRESS=you@email.com
MAIL_FROM_NAME="you@email.com"
最后,运行 此命令刷新邮件缓存配置:
php artisan config:cache
我在 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])
// ...
我通过确保在 env 文件中设置的电子邮件地址解决了这个问题
MAIL_USERNAME=example@example.com
与我的自定义通知邮件中的“发件人”地址相同 class' toMail 函数
->from('example@example.com','My app name')
似乎有些电子邮件服务发现奇怪的是,该应用程序使用一个凭据(env 凭据)发送电子邮件,但另一个电子邮件地址被屏蔽为发件人。
更好的解决方案可能是永远不要在通知中设置“发件人”地址 classes。
我可以按照
在我的例子中,我收到这个错误是因为我忘记在收件人的域上设置 MX 记录,所以应用程序不知道将电子邮件发送到哪里。
另一个原因可能是域被列入黑名单,检查 spamhaus