laravel 中的 swiftmailer 替代品
Alternative to swiftmailer in laravel
我对 using swiftmailer with the client's SMTP microsoft exchange server 有疑问。
为了排除故障,我正在考虑用其他东西更换 swiftmailer。
我的整个设置都在内部网络上。所以根本没有 mailgun 或 sendgrid。
如何在 Laravel 中使用 swiftmailer 的替代库来进行故障排除?
这也是我在 Laravel
上尝试使用 swiftmailer 时得到的日志
<< 250-xxx.internal.abc.com Hello [xxx.xx.xxx.xx]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XSHADOW
>> STARTTLS
<< 500 5.3.3 Unrecognized command
!! Expected response code 220 but got code "500", with message "500 5.3.3 Unrecognized command
我尝试的部分 (I)
有人让我尝试 MAIL_ENCRYPTION 到 null 和 dd(config('mail.encryption')),所以下面是答案:
代码:
try {
Mail::send('emails.test', [], function ($m) {
$m->from('xxx@client.com', 'Your Application')->to('me@me.com');
dd(config('mail.encryption'));
var_dump('executed');
});
} catch (Exception $e) {
var_dump($e->getMessage());
var_dump($e->getTraceAsString());
}
结果:
null
被打印出来 字符串 executed
不是。
我尝试的部分 (II):
明确使用加密设置为空的 swiftmailer 传输
try {
// Create the Transport
$transport = \Swift_SmtpTransport::newInstance();
$transport->setUsername('xxx@client.com')
->setPort(25)
->setHost('smtp.internal.client.com')
->setEncryption(null);
// Create the Mailer using your created Transport
$mailer = \Swift_Mailer::newInstance($transport);
$logger = new \Swift_Plugins_Loggers_ArrayLogger();
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));
$message = new \Swift_Message('Wonderful Subject');
$message->setFrom(['xxx@client.com' => 'John Doe']);
$message->setTo(['me@me.com'])->setBody('Here is the message itself');
// // Send the message
$numSent = $mailer->send($message);
} catch(\Swift_TransportException $e) {
var_dump('test');
var_dump($e->getMessage());
var_dump($e->getTraceAsString());
}
结果:
www-data@server:~/html/laravel-app$ php artisan email:send
string(4) "test"
string(127) "Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators"
string(2503) "#0 /var/www/html/a3qp/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php(332): Swift_Transport_Esmtp_AuthHandler->afterEhlo(Object(Swift_SmtpTransport))
我尝试的第 (III) 部分:
与第二部分相同,但明确将加密设置为 'tls'。我在最顶部收到与原始错误消息相同的错误消息。
我尝试的第 (IV) 部分:
有人让我把第一部分的dd那行去掉,我就这样了
string(8) "executed"
[Swift_TransportException]
Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators
更新
- 我正在使用 SMTP 连接到我客户基础结构中的 MS Exchange 服务器。我无权访问该服务器的 SMTP 日志,因此很难排除故障。代码完全是内网的。无法访问外部互联网服务,我不应该使用 mailgun 或任何其他 smtp 云服务来发送客户用于内部消费的交易电子邮件。
- 我有另一个代码使用旧版 cakephp 2 系统,它可以毫无问题地与同一个 SMTP 邮件服务器一起工作。
- 我已经在 google 邮件上测试了我的 laravel SMTP 设置。它工作正常。
- 我的下一步故障排除是查看问题所在的是 swiftmailer 还是 laravel 的其余部分。因此这个 post.
- 是的,我正在尝试联系负责 Exchange 服务器的 IT 团队,但他们在另一个国家/地区。不过我还在努力。
- 我知道我在重复第 2 点,但评论表明这一点不够明确。我在旧版 cakephp 2 系统上使用 完全相同的 SMTP 设置 发送电子邮件,没有问题。因为我无法联系到负责交换服务器的 IT 团队,加上 SMTP 设置 为另一个 cakephp 2 系统工作 ,我觉得我应该尝试在 laravel 系统确定。
- 我已通过更改 .env 文件尝试 PHP mail 和 sendmail。我没有触发任何错误消息,但我似乎也没有收到任何电子邮件。
- 有关用于测试 SMTP 的代码的详细信息,请参阅我尝试过的第一部分、第二部分、第三部分、第四部分
您尝试连接的 SMTP 服务器不理解 STARTTLS
命令。为防止尝试执行 STARTTLS
命令,您必须通过在 .env
文件中将 MAIL_ENCRYPTION
环境变量设置为 null
来禁用加密。
下一个问题是,根据 EHLO
响应,SMTP 服务器不接受任何身份验证方法。如果是,行 250-AUTH
也将包括它接受的方法(例如 250-AUTH PLAIN DIGEST-MD5
)。
要防止身份验证尝试,您必须在 .env
文件中将 MAIL_USERNAME
环境变量设置为 null
。
总而言之,您的 .env
文件应包含以下行:
MAIL_ENCRYPTION=null
MAIL_USERNAME=null
这将禁用 tls 加密并禁用身份验证。
我对 using swiftmailer with the client's SMTP microsoft exchange server 有疑问。
为了排除故障,我正在考虑用其他东西更换 swiftmailer。
我的整个设置都在内部网络上。所以根本没有 mailgun 或 sendgrid。
如何在 Laravel 中使用 swiftmailer 的替代库来进行故障排除?
这也是我在 Laravel
上尝试使用 swiftmailer 时得到的日志<< 250-xxx.internal.abc.com Hello [xxx.xx.xxx.xx]
250-SIZE 36700160
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-AUTH
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250 XSHADOW
>> STARTTLS
<< 500 5.3.3 Unrecognized command
!! Expected response code 220 but got code "500", with message "500 5.3.3 Unrecognized command
我尝试的部分 (I)
有人让我尝试 MAIL_ENCRYPTION 到 null 和 dd(config('mail.encryption')),所以下面是答案:
代码:
try {
Mail::send('emails.test', [], function ($m) {
$m->from('xxx@client.com', 'Your Application')->to('me@me.com');
dd(config('mail.encryption'));
var_dump('executed');
});
} catch (Exception $e) {
var_dump($e->getMessage());
var_dump($e->getTraceAsString());
}
结果:
null
被打印出来 字符串 executed
不是。
我尝试的部分 (II):
明确使用加密设置为空的 swiftmailer 传输
try {
// Create the Transport
$transport = \Swift_SmtpTransport::newInstance();
$transport->setUsername('xxx@client.com')
->setPort(25)
->setHost('smtp.internal.client.com')
->setEncryption(null);
// Create the Mailer using your created Transport
$mailer = \Swift_Mailer::newInstance($transport);
$logger = new \Swift_Plugins_Loggers_ArrayLogger();
$mailer->registerPlugin(new \Swift_Plugins_LoggerPlugin($logger));
$message = new \Swift_Message('Wonderful Subject');
$message->setFrom(['xxx@client.com' => 'John Doe']);
$message->setTo(['me@me.com'])->setBody('Here is the message itself');
// // Send the message
$numSent = $mailer->send($message);
} catch(\Swift_TransportException $e) {
var_dump('test');
var_dump($e->getMessage());
var_dump($e->getTraceAsString());
}
结果:
www-data@server:~/html/laravel-app$ php artisan email:send
string(4) "test"
string(127) "Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators"
string(2503) "#0 /var/www/html/a3qp/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Transport/EsmtpTransport.php(332): Swift_Transport_Esmtp_AuthHandler->afterEhlo(Object(Swift_SmtpTransport))
我尝试的第 (III) 部分:
与第二部分相同,但明确将加密设置为 'tls'。我在最顶部收到与原始错误消息相同的错误消息。
我尝试的第 (IV) 部分:
有人让我把第一部分的dd那行去掉,我就这样了
string(8) "executed"
[Swift_TransportException]
Failed to authenticate on SMTP server with username "xxx@client.com" using 0 possible authenticators
更新
- 我正在使用 SMTP 连接到我客户基础结构中的 MS Exchange 服务器。我无权访问该服务器的 SMTP 日志,因此很难排除故障。代码完全是内网的。无法访问外部互联网服务,我不应该使用 mailgun 或任何其他 smtp 云服务来发送客户用于内部消费的交易电子邮件。
- 我有另一个代码使用旧版 cakephp 2 系统,它可以毫无问题地与同一个 SMTP 邮件服务器一起工作。
- 我已经在 google 邮件上测试了我的 laravel SMTP 设置。它工作正常。
- 我的下一步故障排除是查看问题所在的是 swiftmailer 还是 laravel 的其余部分。因此这个 post.
- 是的,我正在尝试联系负责 Exchange 服务器的 IT 团队,但他们在另一个国家/地区。不过我还在努力。
- 我知道我在重复第 2 点,但评论表明这一点不够明确。我在旧版 cakephp 2 系统上使用 完全相同的 SMTP 设置 发送电子邮件,没有问题。因为我无法联系到负责交换服务器的 IT 团队,加上 SMTP 设置 为另一个 cakephp 2 系统工作 ,我觉得我应该尝试在 laravel 系统确定。
- 我已通过更改 .env 文件尝试 PHP mail 和 sendmail。我没有触发任何错误消息,但我似乎也没有收到任何电子邮件。
- 有关用于测试 SMTP 的代码的详细信息,请参阅我尝试过的第一部分、第二部分、第三部分、第四部分
您尝试连接的 SMTP 服务器不理解 STARTTLS
命令。为防止尝试执行 STARTTLS
命令,您必须通过在 .env
文件中将 MAIL_ENCRYPTION
环境变量设置为 null
来禁用加密。
下一个问题是,根据 EHLO
响应,SMTP 服务器不接受任何身份验证方法。如果是,行 250-AUTH
也将包括它接受的方法(例如 250-AUTH PLAIN DIGEST-MD5
)。
要防止身份验证尝试,您必须在 .env
文件中将 MAIL_USERNAME
环境变量设置为 null
。
总而言之,您的 .env
文件应包含以下行:
MAIL_ENCRYPTION=null
MAIL_USERNAME=null
这将禁用 tls 加密并禁用身份验证。