【问题标题】:PHPMailer works with request from localhost but not from outside my machinePHPMailer 适用于来自本地主机的请求,但不适用于来自我机器外部的请求
【发布时间】:2020-12-19 21:55:35
【问题描述】:

有很多帖子试图弄清楚 PHPmailer 可以在 localhost 但不能在服务器中工作,但我的问题更奇怪!

我有一个脚本在我的本地机器上运行良好(osx 上的 XAMP)。我在我的服务器上使用 SMTP,一切正常!

    <?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

include 'PHPMailer/src/PHPMailer.php';
include 'PHPMailer/src/Exception.php';
include 'PHPMailer/src/SMTP.php';

    $serverEmail = 'alarm_api@mydomain.com';
    $email1 =  $_GET['el1'];

    $mail = new PHPMailer(true);

    // SMTP config
    $mail->isSMTP();
    $mail->Host = 'lx14.hoststar.hosting';
    $mail->SMTPAuth = true;
    $mail->Username = $serverEmail; 
    $mail->Password = '***********'; 
    $mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;
    $mail->Port = 465;
    /* Disable some SSL checks. */
    $mail->SMTPOptions = array(
        'ssl' => array(
        'verify_peer' => false,
        'verify_peer_name' => false,
        'allow_self_signed' => true
        )
    );

    // Headers
    $mail->setFrom($serverEmail, 'Alarm system');
    $mail->addReplyTo($serverEmail, 'Alarm system');
    $mail->addAddress($email1, $email1); 
    $mail->Subject = 'Something is wrong';
    $mail->isHTML(true);

    $mailContent = 'Some information..';

    $mail->Body = $mailContent;

    if($mail->send()){
        print_r("Sending: OK".$br);
    }else{
        print_r("Sending: ERROR".$br);
    }
?>

所以我的网址是 localhost/api.php?el1=email@server.com 并且运行良好。

问题!

如果我从其他来源(例如我的手机或本地网络上的另一台计算机)调用相同的 php 文件,我将执行 10.0.0.8/api.php?el1=email@server.com 之类的操作,基本上是一样的。

但它失败了!各种错误都会弹出,例如:

致命错误:未捕获异常 'PHPMailer\PHPMailer\Exception' 并带有消息“以下发件人地址失败:alarm_api@mydomain.com.br : MAIL FROM 命令失败,访问被拒绝 - HELO 名称无效(请参阅 RFC2821 4.1.3) ,550,SMTP 服务器错误:MAIL FROM 命令失败详细信息:访问被拒绝 - HELO 名称无效(请参阅 RFC2821 4.1.3) SMTP 代码:/Users/myself/eclipse-php/PHPMailer/src/PHPMailer.php:1869 中的 550'堆栈跟踪:#0 /Users/myself/eclipse-php/PHPMailer/src/PHPMailer.php(1601): PHPMailer\PHPMailer\PHPMailer->smtpSend('Date: Mon, 31 A...',

等等。

当从不同的机器调用脚本时,什么可能导致脚本失败?相同的 apache、相同的 php、相同的 PHPmailer、相同的文件、相同的 SMTP 服务器访问权限、相同的凭据...

那是相当长的。谢谢大家的时间!

【问题讨论】:

  • 当配置为电子邮件发件人身份的一部分的 SMTP 域与发件人的电子邮件地址不匹配时,通常会发生“550 访问被拒绝 - HELO 名称无效”SMTP 错误。

标签: php smtp phpmailer


【解决方案1】:

问题在于 HELO 名称。如果您没有明确设置它,PHPMailer 会尝试在this code 中创建一个。在 10.0.0.0/8 等专用网络上,它可能以 IP 地址作为 HELO 名称结束,这本身是不允许的,但是,您可以按照 RFC5321 § 4.1.3 将其括在方括号中。 PHPMailer 不会为您执行此操作,但您可以通过 Helo 属性显式设置 HELO 名称:

$mail->Helo = 'localhost.localdomain';

$mail->Helo = '[10.0.0.8]';

试试看。

【讨论】:

  • 完美!那真的奏效了。秘诀是将 Helo 添加为同一个 smtp 主机服务器:在我的情况下,$mail->Helo = 'lx14.hoststar.hosting'
  • 非常感谢。到目前为止,我还没有在我读过的任何示例、帖子或教程中找到 Helo 配置。好电话!
猜你喜欢
  • 2010-11-04
  • 2012-10-25
  • 1970-01-01
  • 2023-02-03
  • 2013-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多