使用 Office365 SMTP 设置 PHPMailer最后更新:2022年5月

2022-08-30 19:30:35

我正在尝试设置PHPMailer,以便我们的一个客户能够让自动生成的电子邮件来自他们自己的帐户。我已经登录到他们的Office 365帐户,并发现PHPMailer所需的设置是:

Host: smtp.office365.com
Port: 587
Auth: tls

我已经将这些设置应用于PHPMailer,但是没有发送电子邮件(我调用的函数适用于我们自己的邮件,该邮件是从外部服务器发送的(不是为网页提供服务的服务器)发送的)。

"host"      => "smtp.office365.com",
"port"      => 587,
"auth"      => true,
"secure"    => "tls",
"username"  => "clientemail@office365.com",
"password"  => "clientpass",
"to"        => "myemail",
"from"      => "clientemail@office365.com",
"fromname"  => "clientname",
"subject"   => $subject,
"body"      => $body,
"altbody"   => $body,
"message"   => "",
"debug"     => false

有谁知道需要什么设置才能让PHPMailer通过 smtp.office365.com 发送?


答案 1

@nitin的代码对我不起作用,因为它在SMTPSecure参数中缺少“tls”。

这是一个工作版本。我还添加了两个注释掉的行,您可以使用它们来防止某些内容不起作用。

<?php
require 'vendor/phpmailer/phpmailer/PHPMailerAutoload.php';
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'smtp.office365.com';
$mail->Port       = 587;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth   = true;
$mail->Username = 'somebody@somewhere.com';
$mail->Password = 'YourPassword';
$mail->SetFrom('somebody@somewhere.com', 'FromEmail');
$mail->addAddress('recipient@domain.com', 'ToEmail');
//$mail->SMTPDebug  = 3;
//$mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";}; //$mail->Debugoutput = 'echo';
$mail->IsHTML(true);

$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Message has been sent';
}

答案 2

最后更新:2022年5月

所以我在这个问题上非常努力。对于使用Exchange Online的商业帐户和对Microsoft管理中心的访问权限,我可以为此提供答案。

TLDR:转到管理中心,然后选择要发送邮件的用户。然后在“经过身份验证的SMTP”设置之后的“电子邮件和电子邮件应用程序”之后的“设置”下查看,只需启用它即可。

仍然无法正常工作?我让你覆盖了,这就是我如何让它完全工作。

  1. 使用PHP编辑器,实际上节省了大量的工作。
  2. 将您的代码替换为我的代码,并在测试后进行更改
<?php
//Import the PHPMailer class into the global namespace
use PHPMailer\PHPMailer\PHPMailer; //important, on php files with more php stuff move it to the top
use PHPMailer\PHPMailer\SMTP; //important, on php files with more php stuff move it to the top

//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');

require 'path/to/vendor/autoload.php'; //important

//Enable SMTP debugging
// SMTP::DEBUG_OFF = off (for production use)
// SMTP::DEBUG_CLIENT = client messages
// SMTP::DEBUG_SERVER = client and server messages
//$mail->SMTPDebug = SMTP::DEBUG_off;

//SMTP
$mail = new PHPMailer(true); //important
$mail->CharSet = 'UTF-8';  //not important
$mail->isSMTP(); //important
$mail->Host = 'smtp.office365.com'; //important
$mail->Port       = 587; //important
$mail->SMTPSecure = 'tls'; //important
$mail->SMTPAuth   = true; //important, your IP get banned if not using this

//Auth
$mail->Username = 'yourname@mail.org';
$mail->Password = 'your APP password';//Steps mentioned in last are to create App password

//Set who the message is to be sent from, you need permission to that email as 'send as'
$mail->SetFrom('hosting@mail.org', 'Hosting Group Inc.'); //you need "send to" permission on that account, if dont use yourname@mail.org

//Set an alternative reply-to address
$mail->addReplyTo('no-reply@mail.com', 'First Last');

//Set who the message is to be sent to
$mail->addAddress('customer@othermail.com', 'SIMON MÜLLER');
//Set the subject line
$mail->Subject = 'PHPMailer SMTP test';
//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->msgHTML(file_get_contents('replace-with-file.html'), __DIR__);  //you can also use $mail->Body = "</p>This is a <b>body</b> message in html</p>" 
//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';
//Attach an image file
//$mail->addAttachment('../../../images/phpmailer_mini.png');

//send the message, check for errors
if (!$mail->send()) {
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
}
  1. 这可能看起来像你的文件,什么好的,但现在来了容易棘手的部分。就像谷歌一样,微软为SMTP的东西实现了一个“开关”。只需从您的企业帐户转到您的管理中心,或者请询问有权执行该部分的人员:
  • 导航到 https://admin.microsoft.com/AdminPortal/Home#/users
  • 选择要从何处发送电子邮件的用户
  • 在“电子邮件”选项卡下搜索“电子邮件应用程序”,单击“管理电子邮件应用程序”
  • 在这里,您可以选择“经过身份验证的SMTP”,确保选中该选项并保存更改
  1. 如果使用 MFA,请确保使用 https://stackoverflow.com/a/61359150/14148981 中提到的应用密码

  2. 运行脚本

我希望这可以帮助某人。我花了很长时间才在自己身上找到这个选项。

打开应用密码和身份验证的所有步骤的摘要:

  1. 使用管理员帐户:
  • 活动目录 AD -> 属性 -> 安全默认值:关闭。
  • 活动目录门户 ->条件访问 -> 配置 MFA 受信任的 IP -> 允许用户 应用密码:启用
  • 管理页面用户列表 - >目标用户的“多重身份验证”:启用然后强制执行
  • 管理页面 用户列表 -> 用户详细信息 ->邮件 -> “管理电子邮件应用程序” -> “经过身份验证的 SMTP”: 启用
  1. 使用用户帐户:
  • 用户帐户配置文件 -> 安全 -> 添加登录方法:应用专用密码
  1. PHP 邮件程序设置:
  • smtp.office365.com, 587, tls, 电子邮件, 应用密码

推荐