SwiftMailer 像 PHPMailer 一样强制 SMTPAuth
SwiftMailer force SMTPAuth like PHPMailer
我正在努力使用 Exchange 在线帐户从 Web 发送邮件。
最近,在迁移到 Laravel 时,我发现现有的与 PHPMailer 配合良好的设置不适用于 Laravel 底层 SwiftMailer.
PHPMailer 有效:
$data = new PHPMailer(true);
$data->CharSet = 'UTF-8';
$data->isSMTP();
$data->Host = config('mail.host');
$data->SMTPAuth = true; // apparently this line does the trick
$data->Username = config('mail.username');
$data->Password = config('mail.password');
$data->SMTPSecure = config('mail.encryption');
$data->Port = config('mail.port');
$data->setFrom('site@mydomain.com','site mailer');
$data->addAddress('me@mydomain.com', 'Me');
$data->Subject = 'Wonderful Subject PHPMailer';
$data->Body = 'Here is the message itself PHPMailer';
$data->send();
与 SwiftMailer:
相同的逻辑
$transport = (new Swift_SmtpTransport(config('mail.host'), config("mail.port"), config('mail.encryption')))
->setUsername(config('mail.username'))
->setPassword(config('mail.password'));
$mailer = new Swift_Mailer($transport);
$message = (new Swift_Message('Wonderful Subject'))
->setFrom(['site@mydomain.com'=>'site mailer'])
->setTo(['me@mydomain.com'=>'Me'])
->setBody('Here is the message itself');
$numSent = $mailer->send($message);
Swift邮件程序,给出错误:
530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [xxxxxxxxxxxxx.xxxxxxxx.prod.outlook.com]
两种情况下的 SMTP 服务器相同 smtp-mail.outlook.com
和端口 587
NB 是的,我很清楚其他地方使用 mydomain-com.mail.protection.outlook.com
和端口 25 的建议。但是这样做会导致收到垃圾邮件 "We could not verify the identity of the sender",这是我不能接受的行为。
而且我们说的是小量,所以对other/3rd群发邮件服务不感兴趣。
到目前为止,我的发现是,$phpMailer->SMTPAuth = true;
改变了游戏规则。如果没有这一行,它会产生与 SwiftMailer 相同的错误。
问题是如何在 SwiftMailer
上强制执行相同的行为?
如前所述,我实际上使用的是 Laravel Mail,但出于本示例的目的,我直接提取了 SwiftMailer 调用。
编辑: SwiftMailer 有 $transport->setAuthMode()
,应该与 $phpMailer->AuthType
相同。尝试了两者的可用 CRAM-MD5、LOGIN、PLAIN、XOAUTH2 值。
除了 XOAUTH2 之外,PHPMailer 可以与所有这些一起工作。对于SwiftMailer none 那些改变了什么,仍然报错。
EDIT2:
我有 SPF 记录 (DNS TXT) v=spf1 include:spf.protection.outlook.com -all
已解决: 添加了 tls
到 Swift 交通建设。
显然 PHPMailer 默认为 tls,因为 config('mail.encryption')
是 null
.
在Java中处理发送邮件,但基本问题在这里似乎是一样的:
If you connect via port 587 you initially start a plain connection where you have to start TLS by explicitly sending the STARTTLS-command. You have to tell JavaMail to do that, otherwise it will try to proceed unsecured. The SMTP-server doesn't send any authentication-mechanism-informations unless the TLS-connection is established, so JavaMail is assuming that no authentication is needed and tries to send the mail without.
看来您也需要在此处明确指定您希望这是一个加密连接。
Swift_SmtpTransport 构造函数的第三个参数执行此操作,提供 'ssl' 或 'tls':
new Swift_SmtpTransport('smtp.example.org', 587, 'ssl'); // or
new Swift_SmtpTransport('smtp.example.org', 587, 'tls');
在 phpMailer 版本中,$data->SMTPSecure 负责这部分。
我正在努力使用 Exchange 在线帐户从 Web 发送邮件。 最近,在迁移到 Laravel 时,我发现现有的与 PHPMailer 配合良好的设置不适用于 Laravel 底层 SwiftMailer.
PHPMailer 有效:
$data = new PHPMailer(true);
$data->CharSet = 'UTF-8';
$data->isSMTP();
$data->Host = config('mail.host');
$data->SMTPAuth = true; // apparently this line does the trick
$data->Username = config('mail.username');
$data->Password = config('mail.password');
$data->SMTPSecure = config('mail.encryption');
$data->Port = config('mail.port');
$data->setFrom('site@mydomain.com','site mailer');
$data->addAddress('me@mydomain.com', 'Me');
$data->Subject = 'Wonderful Subject PHPMailer';
$data->Body = 'Here is the message itself PHPMailer';
$data->send();
与 SwiftMailer:
相同的逻辑$transport = (new Swift_SmtpTransport(config('mail.host'), config("mail.port"), config('mail.encryption')))
->setUsername(config('mail.username'))
->setPassword(config('mail.password'));
$mailer = new Swift_Mailer($transport);
$message = (new Swift_Message('Wonderful Subject'))
->setFrom(['site@mydomain.com'=>'site mailer'])
->setTo(['me@mydomain.com'=>'Me'])
->setBody('Here is the message itself');
$numSent = $mailer->send($message);
Swift邮件程序,给出错误:
530 5.7.57 SMTP; Client was not authenticated to send anonymous mail during MAIL FROM [xxxxxxxxxxxxx.xxxxxxxx.prod.outlook.com]
两种情况下的 SMTP 服务器相同 smtp-mail.outlook.com
和端口 587
NB 是的,我很清楚其他地方使用 mydomain-com.mail.protection.outlook.com
和端口 25 的建议。但是这样做会导致收到垃圾邮件 "We could not verify the identity of the sender",这是我不能接受的行为。
而且我们说的是小量,所以对other/3rd群发邮件服务不感兴趣。
到目前为止,我的发现是,$phpMailer->SMTPAuth = true;
改变了游戏规则。如果没有这一行,它会产生与 SwiftMailer 相同的错误。
问题是如何在 SwiftMailer
上强制执行相同的行为?
如前所述,我实际上使用的是 Laravel Mail,但出于本示例的目的,我直接提取了 SwiftMailer 调用。
编辑: SwiftMailer 有 $transport->setAuthMode()
,应该与 $phpMailer->AuthType
相同。尝试了两者的可用 CRAM-MD5、LOGIN、PLAIN、XOAUTH2 值。
除了 XOAUTH2 之外,PHPMailer 可以与所有这些一起工作。对于SwiftMailer none 那些改变了什么,仍然报错。
EDIT2:
我有 SPF 记录 (DNS TXT) v=spf1 include:spf.protection.outlook.com -all
已解决: 添加了 tls
到 Swift 交通建设。
显然 PHPMailer 默认为 tls,因为 config('mail.encryption')
是 null
.
If you connect via port 587 you initially start a plain connection where you have to start TLS by explicitly sending the STARTTLS-command. You have to tell JavaMail to do that, otherwise it will try to proceed unsecured. The SMTP-server doesn't send any authentication-mechanism-informations unless the TLS-connection is established, so JavaMail is assuming that no authentication is needed and tries to send the mail without.
看来您也需要在此处明确指定您希望这是一个加密连接。
Swift_SmtpTransport 构造函数的第三个参数执行此操作,提供 'ssl' 或 'tls':
new Swift_SmtpTransport('smtp.example.org', 587, 'ssl'); // or
new Swift_SmtpTransport('smtp.example.org', 587, 'tls');
在 phpMailer 版本中,$data->SMTPSecure 负责这部分。