Laravel 5.7:通过 AWS SES 的按需电子邮件通知将我的收件人电子邮件视为发件人电子邮件,并希望它是经过验证的地址

Posted

技术标签:

【中文标题】Laravel 5.7:通过 AWS SES 的按需电子邮件通知将我的收件人电子邮件视为发件人电子邮件,并希望它是经过验证的地址【英文标题】:Laravel 5.7: On-Demand e-mail Notification via AWS SES treats my recipient e-mail as a sender e-mail and wants it to be verified address 【发布时间】:2019-05-23 10:17:22 【问题描述】:

我想在 Laravel 5.7 中发送一个简单的on-demand e-mail notification。

我去了 AWS SES,并在电子邮件地址下添加了do-not-reply@foo 作为发件人。然后我点击do-not-reply@foo上的验证链接进行确认。

我配置了我的.env

MAIL_FROM_ADDRESS=do-not-reply@foo
MAIL_FROM_NAME="Foo System"
MAIL_DRIVER=smtp
MAIL_HOST=email-smtp.us-west-2.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=xxx
MAIL_PASSWORD=xxx
MAIL_ENCRYPTION=tls

我从这里获取了用户名和密码:

我做了php artisan config:clearphp artisan cache:clear

现在就我的 PHP 代码而言:

$this->notificationClass = (new ReflectionClass($notificationClass))->getShortName();
$this->notificationData = $notificationData;
$this->notification
    ->route('slack', config('logging.channels.slack.url')) // slack works great all the time
    ->route('mail', 'my-inbox-address-123@gmail.com') // this is address where I want notification to be sent
    ->notify(new $notificationClass(
        $this->getNotificationTitle(),
        $this->getNotificationContent()
    ));

$notificationClass的内容是:

<?php

namespace App\Notifications\Sync;

use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Notifications\Messages\SlackMessage;

class SyncSuccessfullyCompletedNotification extends AbstractBaseSyncNotification

    public function toSlack()
    
        return (new SlackMessage)
            ->success()
            ->content(sprintf('*Synchronization Successful*```%s```', $this->message));
    

    public function toMail()
    
        return (new MailMessage)
            ->from(config('mail.from.address'), config('mail.from.name'))
            ->subject($this->title)
            ->view('mail.notifications.sync_successfully_completed_notification', [
                'content' => sprintf('<pre>%s</pre>', $this->message),
            ]);
    

所以my-inbox-address-123@gmail.com 只是我的 gmail 公司收件箱。当我执行负责做某事并发送此通知的工匠命令时,我得到:

Swift_TransportException:预期的响应代码为 250,但得到了代码 “554”,带有消息“554 消息被拒绝:电子邮件地址不是 已验证。以下身份未通过区域签入 US-WEST-2: my-inbox-address-123@gmail.com "

在 /home/vagrant/Code/iosportal/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:457 453| $this->eventDispatcher->dispatchEvent($evt, 'responseReceived'); 454| 455| 456| if (!$valid)

457| $this->throwException(new Swift_TransportException('预期响应码'.implode('/', $通缉)。但是得到了代码“'.$code.'”,带有消息“'.$response.'”', $代码)); 458| 459| 460| 461| /** 使用序列号获取完整的多行响应 */

异常跟踪:

1 Swift_Transport_AbstractSmtpTransport::assertResponseCode("554 邮件被拒绝:电子邮件地址未经过验证。下列 身份在 US-WEST-2 区域中未通过检查: 我的收件箱地址 123@gmail.com") /home/vagrant/Code/iosportal/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/AbstractSmtpTransport.php:341

2 Swift_Transport_AbstractSmtpTransport::executeCommand(" . ", []) /home/vagrant/Code/iosportal/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php:305

请使用参数 -v 查看更多详细信息。

为什么?我不明白这个。我的发件人已验证,为什么要验证收件人?

确实,当我从经过验证的帐户向同一个经过验证的帐户发送此邮件时,电子邮件会正确到达,但这是无稽之谈。

【问题讨论】:

【参考方案1】:

您的帐户必须处于sandbox 模式,这意味着必须验证每个电子邮件地址。

检查您是否处于沙盒模式:

    登录AWS Management Console。 选择您所在的地区。 在电子邮件发送下选择发送统计信息。 如果您处于沙盒模式,您会看到一条横幅告诉您。

退出沙盒模式:

    登录AWS Management Console。 在支持中心打开SES Sending Limit Increase 案例。 填写表格。如果您计划从多个地区发送,请为每个地区重复。

【讨论】:

谢谢约翰。我已经向 AWS 支持提出了一张票,他们关闭了沙盒模式。一切正常。 ?

以上是关于Laravel 5.7:通过 AWS SES 的按需电子邮件通知将我的收件人电子邮件视为发件人电子邮件,并希望它是经过验证的地址的主要内容,如果未能解决你的问题,请参考以下文章

通过 SMTP 使用 AWS SES 发送电子邮件,错误 421

通过 aws ses 在 node.js 中发送带有附件的邮件

SES AWS 错误代码:SignatureDoesNotMatch,状态代码:403

编码错误:在通过 AWS SES 的 MIME 文件数据中

让 Spring Boot 应用程序通过 AWS SES 发送简单电子邮件需要哪些配置步骤?

AWS-SES 电子邮件地址未经验证。邮箱帐户