我要升级到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()为什么不发送电子邮件吗?
答案 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');
}