PHPMailer,使用Gmail时出现SMTP connect()连接失败错误

4

我正在尝试制作一个联系表单,使用的是PHPMailer。我在本地主机上使用xampp测试过,一切都很完美。但是当我上传到我的托管主机时,出现了SMTP connect() failed错误。

以下是我的代码:

$m = new PHPMailer;

$m->isSMTP();
$m->SMTPAuth = true;

$m->Host = "smtp.gmail.com";
$m->Username = "mymail@gmail.com";
$m->Password = "mypass";
$m->SMTPSecure = "ssl";
$m->Port = "465";

$m->isHTML();

$m->Subject = "Hello world";
$m->Body = "Some content";

$m->FromName = "Contact";

$m->addAddress('mymail@gmail.com', 'Test');

我尝试将端口更改为587并将SMTPsecure更改为tls(以及所有组合),但都无法正常工作。有什么建议可以解决这个问题吗?
谢谢。

可能是PHPMailer无法发送电子邮件的重复问题。 - Synchro
2个回答

4
这个答案对我有用:https://dev59.com/w2Ag5IYBdhLWcg3w_vSF#47205296 我使用:
$mail->Host = 'tls://smtp.gmail.com:587';
$mail->SMTPOptions = array(
   'ssl' => array(
     'verify_peer' => false,
     'verify_peer_name' => false,
     'allow_self_signed' => true
    )
);

不要这样做。这可能是为了掩盖您的服务器TLS配置出现问题(可能是过时的CA证书包),或者是因为有人(很可能是您的托管提供商)将您的SMTP流量重定向到其他地方(中间人攻击),而TLS正是为了防止这种情况而设计的。 - Synchro

3
您可能需要指定消息发送的地址,如下所示:

$mail->From = 'user@domain.com';

我建议您为isHTML参数添加一个值,可以是true或false:
$m->isHTML(true);

另一个选择是尝试完全删除端口规范。还有其他一些参数可能会对您有用。以下示例是我测试过的代码,请尝试适应您的需求:
$mail = new PHPMailer;
$mail->isSMTP();/*Set mailer to use SMTP*/
$mail->Host = 'mail.domain.com';/*Specify main and backup SMTP servers*/
$mail->Port = 587;
$mail->SMTPAuth = true;/*Enable SMTP authentication*/
$mail->Username = $username;/*SMTP username*/
$mail->Password = $password;/*SMTP password*/
/*$mail->SMTPSecure = 'tls';*//*Enable encryption, 'ssl' also accepted*/
$mail->From = 'user@domain.com';
$mail->FromName = $name;
$mail->addAddress($to, 'Recipients Name');/*Add a recipient*/
$mail->addReplyTo($email, $name);
/*$mail->addCC('cc@example.com');*/
/*$mail->addBCC('bcc@example.com');*/
$mail->WordWrap = 70;/*DEFAULT = Set word wrap to 50 characters*/
$mail->addAttachment('../tmp/' . $varfile, $varfile);/*Add attachments*/
/*$mail->addAttachment('/tmp/image.jpg', 'new.jpg');*/
/*$mail->addAttachment('/tmp/image.jpg', 'new.jpg');*/
$mail->isHTML(false);/*Set email format to HTML (default = true)*/
$mail->Subject = $subject;
$mail->Body    = $message;
$mail->AltBody = $message;
if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    header("Location: ../docs/confirmSubmit.html");
}

希望这能给你一些帮助!

1
我还必须添加 $mail->Port = 587;,这样它才能正常工作。 - Devilquest
有趣的是,我能够在不指定端口的情况下运行它。可能是我部署它的GoDaddy服务器自动设置了默认端口,或者可能是因为消息是从同一台服务器生成和发送的?我现在很好奇,但我很高兴你让代码工作了 :) 干杯! - CH3M
我已经添加了端口规范以提供更完整的答案 :) - CH3M
最后,你将使用的端口取决于你连接的邮件服务器,因此除非你是服务器的系统管理员,否则你可能会被迫使用服务器配置为发送/接收的任何端口。只是提供信息。 - CH3M
你好 @CH3M,我正在使用phpmailer向我的gmail账户发送电子邮件,但是我遇到了这个错误:: Mailer Error: SMTP connect() failed。我尝试了你的代码,但是仍然出现相同的错误。 - always-a-learner
@ankitsuthar 你记得将主机更改为Gmail的SMTP地址了吗?另外,在上面的代码块执行之前,请确保$username和$password已经正确设置。 - CH3M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接