电子邮件未通过PHPMailer 6发送

时间:2019-06-13 14:08:48

标签: php phpmailer

我要升级到phpmailer 6并测试我的表单。

如果我使用以下代码,它将无法正常工作:

$mail = new PHPMailer;

$mail->ContentType = 'text/plain'; 
$mail->IsHTML(false);
$mail->Sender = 'example@mydomain.com';
$mail->setFrom($_POST['email'], $_POST['name'], false);
$mail->addReplyTo($_POST['email'], $_POST['name']);

$mail->addAddress($to);

我已经尝试过使用setFrom进行各种组合(例如,删除布尔标志,省略$ mail-> Sender部分,省略addReplyTo),并且在使用setFrom()时永远无效。

但是,如果我使用此代码,它确实可以工作:

$mail = new PHPMailer;

$mail->ContentType = 'text/plain'; 
$mail->IsHTML(false);
$mail->From = $_POST['email'];
$mail->FromName = $_POST['name'];
$mail->addAddress($to);

您知道setFrom()为什么不发送电子邮件吗?

1 个答案:

答案 0 :(得分:1)

您没有说“不起作用”的意思。它会引发错误,根本不发送,还是什么?看到SMTP副本(设置SMTPDebug = 2)会有所帮助。

除了问题,这是一个坏主意:

$mail->setFrom($_POST['email'], $_POST['name'], false);

这是伪造的,会导致您的邮件被拒绝或垃圾邮件过滤,因为这会破坏DMARC的对齐方式。设置$mail->Sender = 'example@mydomain.com';会有所帮助,因为您的信封发件人可以,但是一般来说不要这样做,因为这样对交付性没有帮助。

setFrom()与直接设置From属性相比,有一个不同之处在于,它立即验证了地址,您可以看到结果-尝试以下操作:

if (!$mail->setFrom($_POST['email'], $_POST['name'], false)) {
    die('bad address');
}

如果您给它一个错误的地址,则发送将失败,但是如果直接设置该属性,仍可能会尝试发送-这可能解释了您所看到的差异。

我建议您以这种方式进行设置,即不要伪造发件人地址或信封发件人,但仍应将表单提交的答复发送给提交者:

setFrom('example@mydomain.com');
if (!$mail->addReplyTo($_POST['email'], $_POST['name'])) {
    die('bad address');
}