【问题标题】:Setting up PHPMailer with Office365 SMTP使用 Office365 SMTP 设置 PHPMailer
【发布时间】:2014-09-16 19:38:41
【问题描述】:

我正在尝试设置 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

有谁知道通过 smtp.office365.com 发送 PHPMailer 需要哪些设置?

【问题讨论】:

  • phpmail错误函数返回什么?
  • @Dagon 没什么,我的 apache 崩溃并开始在端口 43 和 56252 或附近的端口上提供服务。
  • 您的设置看起来不错,但您需要查看错误代码,否则我们无法为您提供帮助,如果您发布实际代码会有所帮助。从您的测试中消除 Apache - 从命令行运行脚本并设置 SMTPDebug = 3 以获取 SMTP 脚本。 Office 365 SMTP 不可靠 - 我有几个关于它失败的报告。
  • 要检查的另一件事是您的 smtp 服务器实际上已打开,否则 php 将无法通过 smtp 发送任何电子邮件。例如。如果你在 debian/ubuntu 中使用 postfixps aux | grep postfix,如果没有输出:sudo /etc/init.d/postfix start。您还可以查看未送达的电子邮件,如下所示:sudo mailq。如果正在发送电子邮件,这将为空。

标签: php email ssl phpmailer office365


【解决方案1】:

当我们从 Gmail 迁移到 Office365 时,我遇到了同样的问题。

您必须先设置连接器(打开的 SMTP 中继或客户端发送)。阅读本文,它将告诉您有关允许 Office365 发送电子邮件的所有信息:

https://technet.microsoft.com/en-us/library/dn554323.aspx

【讨论】:

  • 嗯,我完成了所有步骤,但我仍然收到 SMTP:连接失败
  • 好的,中继已设置,但我可以让它工作的唯一方法是使用原始的smtp.office365.com 端口 587 和 tls。说明说要使用 MX 条目的目标......这是错误的。
【解决方案2】:

试试这个,对我来说很好用,我已经用了这么久了

$mail = new PHPMailer(true);
$mail->Host = "smtp.office365.com";
$mail->Port       = 587;
$mail->SMTPSecure = '';
$mail->SMTPAuth   = true;
$mail->Username = "email";   
$mail->Password = "password";
$mail->SetFrom('email', 'Name');
$mail->addReplyTo('email', 'Name');
$mail->SMTPDebug  = 2;
$mail->IsHTML(true);
$mail->MsgHTML($message);
$mail->Send();

【讨论】:

    【解决方案3】:

    @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';
    }
    

    【讨论】:

    • 嗨,这段代码对我不起作用。当我启用调试时,它说:“SMTP -> 错误:服务器不接受密码:”我显然仔细检查了凭据。
    • 这对我有用,问题是我缺少 STMPSecure = 'tls',谢谢!
    • 不要这样做。目前(2018 年 8 月和 2018 年 9 月)如果他们使用 365 托管他们的电子邮件,则使用 Microsoft Office SMTP 服务器发送的任何电子邮件都会在收件人方面进入垃圾邮件。您无法阻止这种情况发生,即使收件人声明您的电子邮件不是垃圾邮件,直到它们脸色发青,它们仍然会变成垃圾邮件。这显然与微软希望你使用 Graph(咳咳)无关,顺便说一句,它愚蠢地限制在 4mb 的电子邮件大小(手掌)。
    • 我已经尝试过了,它在 2020 年 3 月有效。这是我正在使用的现有帐户,而不是来自地址的虚假不回复。
    【解决方案4】:

    您需要启用应用密码和多因素身份验证才能使用 office365 stmp 从第三方应用程序发送邮件。谷歌它以获取更多信息

    【讨论】:

    • 您的答案(“需要应用密码并启用多重身份验证”)并不总是需要。这只是配置 Office 365 以从第三方应用程序发送电子邮件的可选方法之一。而且您对“Google it”的解释没有帮助。其他答案参考此参考:docs.microsoft.com/en-us/exchange/mail-flow-best-practices/…。该文档可以帮助您决定您的设置是否应使用应用密码。
    【解决方案5】:

    更新:2020 年 4 月

    使用 Office 365 发送电子邮件的公认答案很有可能不起作用,因为 Microsoft 正在推动他们的 Microsoft Graph(目前唯一支持的 PHP 框架是 Laravel)。如果幸运的是您仍然能够使其在您的应用程序中运行,电子邮件将进入收件人的垃圾邮件、垃圾邮件或垃圾邮件文件夹,这是您不希望发生的。

    我遇到的常见错误是:

    Failed to authenticate password. // REALLY FRUSTRATED WITH THIS ERROR! WHY IS MY PASSWORD WRONG?!
    

    Failed to send AUTH LOGIN command.
    

    Unable to send email using PHP SMTP. Your server might not be configured to send mail using this method.
    

    为了让它仍然适用于接受的答案,我们只需更改一行,即密码参数行:

    $mail->Password = 'YourOffice365Password';
    

    不要使用登录 Office365 帐户时使用的密码设置密码,而必须使用 应用密码


    创建应用密码

    • 首先,为了创建应用密码,应启用您的 Office 365 帐户的Multi-Factor Authentication(您可能需要联系您的管理员才能启用此功能)。

    • 之后,在您喜欢的浏览器中登录您的 Office 365

    • 转到我的帐户页面(点击右上角您姓名的首字母即可看到此页面的链接)
    • 选择安全和隐私,然后选择附加安全验证
    • 在页面顶部,选择应用密码
    • 选择创建获取应用密码
    • 如果出现提示,请输入您的应用密码名称,然后单击下一步
    • 然后您将看到 Office 365 生成的密码作为您的应用密码
    • 复制密码

    复制密码后,返回您的工作代码并将密码参数替换为复制的密码。您的应用程序现在应该能够使用 Office 365 正确发送电子邮件了。


    参考:

    Create an app password for Microsoft 365

    【讨论】:

    • 谢谢。我刚刚将两个客户端从标准 sendMail 迁移到 phpMailer,两个客户端都使用 365 云电子邮件。两者都不起作用,所以我只能假设他们都需要创建应用程序密码。我已将这些请求传递给他们的电子邮件 IT 人员进行设置。
    • 嗨。我已经在 Office 365 上设置了我的应用程序密码,但它仍然无法使用。它说password command failed。有什么想法吗?
    • 好兄弟,我所要做的就是在我的地址上创建一个应用程序。
    【解决方案6】:

    更新:2020 年 8 月

    所以我非常努力地解决这个问题。对于使用 Exchange Online 并可以访问 Microsoft 管理中心的企业帐户,我可以为此提供答案。

    TLDR:转到管理中心并选择您要发送邮件的用户。然后在设置“authenticated SMTP”后的E-Mail和E-Mail Apps后的settings下,开启即可。

    还是不行?我得到了你的保障,这就是我如何让它充分发挥作用。

    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 = 'yourpassword';
    
    //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
    • 选择要从中发送电子邮件的用户
    • 在“E-Mail”标签下搜索“E-Mail-Apps”,点击“manage E-Mail-Apps”
    • 您可以在此处选择“经过身份验证的 SMTP”,确保选中该选项并保存更改
    1. 如果您使用 MFA,请确保使用 https://stackoverflow.com/a/61359150/14148981 中提到的应用密码

    2. 运行脚本

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

    【讨论】:

    • 如果您通过 GoDaddy 使用 Office 365,您将没有 Microsoft 的“管理员”页面,而是有一个用于管理此设置的 GoDaddy 页面。关于如何打开或关闭它的说明可以在这里找到:Enable SMTP Authentication
    【解决方案7】:

    更新:2020 年 12 月

    我通过设置应用密码和 MFA(禁用它!)解决了这个问题。

    我通过在以下位置禁用 MS 安全默认设置来做到这一点

    • Microsoft 365 管理中心
    • Azure Active Directory 管理中心
    • Azure 活动目录
    • Properties
    • 管理安全默认设置
    • 启用安全默认值
    • 没有

    设置后,使用您的 Office365 用户名(电子邮件地址)和密码(不是应用程序密码)发送电子邮件

    【讨论】:

    • 在这里您禁用了所有“安全默认值”。您可能知道禁用哪个默认选项使其工作正常吗?理想情况下,我们能够准确地调整该选项并让安全默认值保持打开 - 为了我们的安全。 :)
    • 关闭安全性“更容易”,但这并不意味着它更好。最好的做法是使用 App Password 和 MFA,即使它更难工作。但是,为了帮助用户了解关闭安全默认值的后果,它基本上只是为所有帐户打开多因素身份验证 (MFA)。当您关闭安全默认值时,您可以在每个帐户上单独管理 MFA。您可以在大多数帐户上启用 MFA,并在用于从您的应用程序发送邮件的帐户上禁用它。希望这能回答@userfuser 的问题。
    【解决方案8】:

    2021 年 9 月更新

    截至 2022 年 9 月(从现在起只有一年),Microsoft 将弃用并关闭他们所谓的基本身份验证。这包括但不限于 SMTP。他们后来宣布租户管理员将能够重新启用 SMTP_AUTH,但(在我看来)它为永久禁用该功能打开了大门。

    目前,Microsoft 并未禁用它,但他们鼓励您以不同的方式进行身份验证。他们在the documentation site 上发出警告,告诉你这一点。

    今天我将对如何使用这种新方法进行一些研究。对于我的应用程序(PHP、CodeIgniter),我找到了this Microsoft package。我将尝试使用这个包发送我的邮件,我希望这将是一个顺利的体验,但我担心这将是一个地狱般的旅程......我会及时通知你们。

    【讨论】:

    • 您找到解决方案了吗?
    • 我设法改变了我的整个应用程序工作流程。工作量很大,我仍然不知道我所做的所有更改以及它为什么起作用,但我的应用程序现在使用的是 Microsoft Graph API。
    【解决方案9】:

    我在使用 Outlook SMTP 配置 PHPMailer 5.2 stable 时遇到了这个错误。我发现了这个:

    SMTP 错误:

    • 密码命令失败,身份验证失败,租户的 SmtpClientAuthentication 被禁用。

    • SMTP connect() 失败。

    经过一些研究,我通过启用Authenticated SMTP

    解决了这个问题

    Use the Microsoft 365 admin center to enable or disable SMTP AUTH on specific mailboxes

    1. 打开 Microsoft 365 管理中心并转到用户 > 活动用户。
    2. 选择用户,然后在出现的浮出控件中单击邮件。
    3. 在“电子邮件应用”部分,单击“管理电子邮件应用”。
    4. 验证已验证的 SMTP 设置:未选中 = 禁用,选中 = 启用。
    5. 完成后,点击保存更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-26
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 2011-09-06
      • 1970-01-01
      • 2020-01-13
      相关资源
      最近更新 更多