【问题标题】:Expected response code 250 but got code "554", with message "554 Message rejected | Laravel Using TO Email预期的响应代码为 250,但得到代码“554”,消息为“554 消息被拒绝 | Laravel 使用 TO 电子邮件
【发布时间】:2021-07-02 23:56:56
【问题描述】:
  • Laravel 版本:8.27
  • PHP 版本$ php --version:PHP 8.0.3 (cli)
  • 数据库驱动和版本 $mysql --version: mysql Ver 8.0.23-0ubuntu0.20.04.1

问题陈述:

我收到 TO 电子邮件 FROM 电子邮件当然不会在 POST 的 Amazon SES 中验证> password/email.


说明:

to@example2.com 将通过电子邮件请求密码重置链接。一般from@example1.com会发送密码重置链接。但是,在我的情况下,to@example2.com 正在尝试向自身发送密码重置链接。

在 Amazon SES 中,我们需要验证电子邮件才能通过 SES 服务发送邮件。所以我已经验证了from@example1.com

注意:两个域是不同的 example1.comexample2.comexample1.com 在 Amazon SES 上设置。


例外:

Swift_TransportException (554)

预期响应代码为 250,但收到代码“554”,消息为“554 消息被拒绝:电子邮件地址未验证。以下身份在区域 REGION 中未通过检查:to@example2.com”


配置:

$ php artisan route:list
+--------+----------+-----------------------------------------------+------------------------------------+-------------------------------------------------------------------------------+-------------------------------------------------------+
| Domain | Method   | URI                                           | Name                               | Action                                                                        | Middleware                                            |
+--------+----------+-----------------------------------------------+------------------------------------+-------------------------------------------------------------------------------+-------------------------------------------------------+
|        | POST     | password/email                                | password.email                     | App\Http\Controllers\Auth\ForgotPasswordController@sendResetLinkEmail         | web                                                   |

App\Http\Controllers\Auth\ForgotPasswordController.php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;

class ForgotPasswordController extends Controller
{

    use SendsPasswordResetEmails;

vendor\laravel\ui\auth-backend\SendsPasswordResetEmails.php

namespace Illuminate\Foundation\Auth;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
use Illuminate\Validation\ValidationException;

trait SendsPasswordResetEmails
{
 

    public function sendResetLinkEmail(Request $request)
    {
        $this->validateEmail($request);

        $response = $this->broker()->sendResetLink(
            $this->credentials($request)
        );

        return $response == Password::RESET_LINK_SENT
                    ? $this->sendResetLinkResponse($request, $response)
                    : $this->sendResetLinkFailedResponse($request, $response);
    }

vendor\laravel\framework\src\illuminate\Auth\Passwords\PasswordBroker.php

namespace Illuminate\Auth\Passwords;

use Closure;
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
use Illuminate\Contracts\Auth\PasswordBroker as PasswordBrokerContract;
use Illuminate\Contracts\Auth\UserProvider;
use Illuminate\Support\Arr;
use UnexpectedValueException;

class PasswordBroker implements PasswordBrokerContract
{

    public function sendResetLink(array $credentials, Closure $callback = null)
    {

        $user = $this->getUser($credentials);

        if (is_null($user)) {
            return static::INVALID_USER;
        }

        if ($this->tokens->recentlyCreatedToken($user)) {
            return static::RESET_THROTTLED;
        }

        $token = $this->tokens->create($user);

        if ($callback) {
            $callback($user, $token);
        } else {

            $user->sendPasswordResetNotification($token);
        }

        return static::RESET_LINK_SENT;
    

.env

MAIL_DRIVER="smtp"
MAIL_HOST="test-smtp.region.amazonaws.com"
MAIL_PORT="25"
MAIL_USERNAME="USER..."
MAIL_PASSWORD="PASS..."
MAIL_ENCRYPTION="tls"
MAIL_FROM_ADDRESS="from@example2.com"
MAIL_FROM_NAME="foo"

【问题讨论】:

  • 请分享更多细节。如果您的邮件服务器拒绝该邮件,我认为这与 PHP 或 Laravel 无关
  • @NicoHaase,我添加了我的 .env,你可以看到我的设置是正确的。
  • 这就是我写的:你的设置很好。您需要向您正在使用的邮件服务器的管理员询问正确的拒绝原因
  • @NicoHaase,我是否需要向 AWS 询问这个问题。因为,我使用的是 Amazon SES。

标签: php laravel laravel-authentication


【解决方案1】:

在我看来,您的 AWS 邮件服务或 Laravel 设置不正确

https://aws.amazon.com/premiumsupport/knowledge-center/ses-554-400-message-rejected-error/

您可以尝试使用开箱即用的 mailtrap.io 进行测试。

当应该发送电子邮件的服务器拒绝它时,通常会引发这种异常。通常是 SMTP 或 AWS SES 的情况。您还可能尝试通过 SMTP 通过 Outlook 帐户发送邮件,而安全策略不允许您发送邮件。

但是,如果我做对了,您希望像人们自己发送电子邮件一样发送电子邮件。这是不可能的,因为您无法验证所有电子邮件。 *@*

作为一种解决方案,您可以使用reply-to 选项,如果您不希望用户能够回复,则可以使用no-reply 作为发件人。

如果您不尝试以to@ 发送邮件,而是以from@ 发送邮件,请确保在 env 中正确设置了 MAIL_FROM_EMAIL。

不应在未加密的情况下发送电子邮件

要使用的电子邮件端口:

Protocol    Security Setting    Port Number(s)
SMTP (sending mail)     Encrypted - TLS/STARTTLS    465
SMTP (sending mail)     Encrypted - SSL             465
SMTP (sending mail)     Unencrypted                 25* (or 26)

POP3 (receiving mail)   Encrypted - TLS             995
POP3 (receiving mail)   Encrypted - SSL             995
POP3 (receiving mail)   Unencrypted                 110
IMAP (receiving mail)   Encrypted - TLS             993
IMAP (receiving mail)   Encrypted - SSL             993
IMAP (receiving mail)   Unencrypted                 143

https://billing.precedence.com.au/billing/knowledgebase/70/Mail-Ports-for-POP3-IMAP-and-SMTP.html

【讨论】:

  • 我已经添加了我的.env,你可以看到我的设置是正确的。
  • 1.我确定 AWS 不会让您使用端口 25,因为它不安全。请改用 465。 2. 您也可以使用 SES 驱动程序代替 SMTP。在我的回复中添加了端口
猜你喜欢
  • 2019-03-16
  • 1970-01-01
  • 2016-08-14
  • 2018-05-03
  • 2017-02-12
  • 2019-05-07
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多