使用PHP发送邮件:SMTP错误


Sending Mail using PHP : SMTP ERROR

我正在尝试使用php发送邮件。但它给了我错误,

"SMTP错误:无法连接到服务器:连接被拒绝(111)
SMTP连接()失败。https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting
"Mailer错误:SMTP连接()失败。https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting"
"

所以我找了很多找问题的地方。我得到了一个解决方案,我需要更改$mail->IsMail();来自$mail->IsSMTP()

我做到了,邮件被发送了。。。但当我查看邮件时,

我得到了,"此消息可能不是由以下人员发送的:sender@gmail.com"

作为一名开发人员,我明白电子邮件不应该包含这样的行或问题。

我想知道,如果接收者在电子邮件中显示这样的行,可以吗?如果没有,我该怎么办?

我的意思是我应该对代码进行哪些更改。

这是我的php代码:

**

date_default_timezone_set('Etc/UTC');
include 'PHPMailerAutoload.php';
$mail = new PHPMailer();
$mail->IsSMTP();
// $mail->Mailer = "smtp";
$mail->SMTPDebug = 1;
$mail->Debugoutput = 'html';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 465;
$mail->SMTPSecure = 'tls';
$mail->SMTPAuth = true;
$mail->Username = "sender@gmail.com";
$mail->Password = 'senderPassword';
$mail->setFrom("sender@gmail.com", 'sender name');
$mail->addReplyTo('sender@gmail.com', '');
$mail->addAddress($receiver, '');
$mail->Subject = 'Welcome';
$mail->Body    = 'body';
$mail->AltBody = 'This is a plain-text message body';
if (!$mail->send())
{
    return "Mailer Error: " . $mail->ErrorInfo;
}
else
{
    return array('flag' => "1"); 
}

**

isMailisSMTP使用两种不同的发送机制。isMail通过PHP mail()函数提交消息,该函数通过sendmail二进制文件将邮件传递到本地邮件服务器。然后,此本地邮件服务器尝试将邮件传递给其最终收件人。这个本地服务器可能会接受一条稍后被拒绝的消息,而这对您的脚本来说已经太晚了。

isMail:

script -> local mail server -> gmail

isSMTP:

script -> gmail

使用isMail,您不需要进行身份验证(通常允许localhost进行中继),消息会从服务器发送到gmail。使用isSMTP,您的消息会从gmail发送到gmail,并且需要身份验证。

当直接通过gmail发送时,您需要使用gmail进行身份验证,这有其自身的一系列问题(这将是您的脚本不起作用的原因),在PHPMailer文档、SO上的示例和问题中都有详细介绍。

当通过服务器发送时,你说你是从gmail用户发送的,但它是由你的服务器发送的,而不是由gmail SPF记录中列出的服务器发送。这是伪造的,这就是为什么你会看到"这条消息可能不是由…发送的"消息。如果你从自己的域中的地址发送,它不会这么说。

解决方案是修复你的gmail身份验证并直接通过gmail发送。您的代码基于PHPMailer提供的gmail示例,而不是您正在使用的旧的、过时的代码,并阅读文档。

这是用于邮寄目的的代码。尝试设置SMTPDebug模式3并检查输出。

$mail = new PHPMailer;
$mail->SMTPDebug = 3;
$mail->isSMTP();
$mail->Host = 'smtp.office365.com';
$mail->SMTPAuth = true;
$mail->Username = 'xxxxxxxxxxxxxxx';
$mail->Password = 'xxxxxxxxxxxxx';
$mail->SMTPSecure = 'tls';
$mail->Port = 587;
$mail->From = 'xxxxxxxxxxxxxx';
$mail->FromName = 'xxxxxxxxxxxxxxxxx';
$mail->addAddress(xxxxxxxxxxxxxx);
$mail->addReplyTo('xxxxxxxxxxxxxxxxxxxxxxx', 'xxxxxxxxxxxxxxxxxxxxx');
$mail->isHTML(true);
$mail->Subject = '';
$mail->Body    = "";
$mail->send();