【问题标题】:PHPMailer Contact form doesn't work on server, but does on localhost?PHPMailer 联系表单在服务器上不起作用,但在本地主机上起作用?
【发布时间】:2017-01-01 22:08:41
【问题描述】:

我有一个 PHPMailer 联系表格,可以将数据发送到一个 GMail 帐户。当站点在本地主机上运行时,它会成功执行此操作,但是当我将网页上传到服务器并尝试使用联系表单时出现以下错误:无法发送消息。邮件程序错误:SMTP 连接()失败.

我正在通过 Plesk 将文件上传到服务器,但我怀疑这是否相关。代码如下:

<form action="currentFile.php" method="POST">
Full Name:<input required type="text" name="fullname"/>
<input type="submit"/>
</form>

<?php
require 'phpmailer/PHPMailerAutoload.php';

$mail = new PHPMailer;

$mail->isSMTP();                                      
$mail->Host = 'smtp.gmail.com';  
$mail->SMTPAuth = true;                                
$mail->Username = 'mail@gmail.com';                 
$mail->Password = 'pass';                          
$mail->SMTPSecure = 'tls';                             
$mail->Port = 587;                                    

$mail->addAddress('mail@gmail.com');     

$mail->Subject = 'Contact Form';
$mail->Body    = "Test";
$mail->AltBody = "Test";

if(!$mail->send()) {
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message has been sent';
}
?>

我相信将$mail-&gt;isSMTP(); 更改为$mail-&gt;isMAIL(); 没有区别。当网站在线(在我的服务器上)时,我该怎么做才能将表单数据发送到电子邮件?

注意:使用的 gmail 帐户和密码在下面的代码中是“假的”。我确实打算以 GMail 帐户为目标,并且我已成功输入 Google Mail 地址和密码,因此脚本在 localhost 上成功运行。

谢谢。

【问题讨论】:

  • 您确定您的服务器中的端口 587 已打开(对传出连接)吗?
  • @Dekel 我从一家公司租用服务器,我需要联系他们吗?我尝试使用端口 25 和端口 465,GMail 的替代选项,它们在服务器上也不起作用。同时,25 和 587 在 localhost 上工作得很好。
  • 否,如果它是租用的服务器,您应该具有 root 访问权限才能在防火墙中打开端口。其方法取决于安装的操作系统、控制面板等。例如 ubuntu 使用 ufw,任何安装了 WHM/Cpanel 的操作系统都应该能够安装可通过 WHM 面板访问的 CSF(ConfigServerFirewall)
  • @H3ll0 如果您不打算使用它的值来处理它,为什么还要使用带有输入的表单?顺便说一句,action="currentFile.php" 的操作属于&lt;form&gt;,不是输入,而是使用 GET/POST 方法。很确定这就是解决方案,或者至少是其中很大一部分。
  • 遵循 PHPMailer 故障排除指南。它会告诉你什么被阻止了。我希望是您的托管公司阻止出站邮件 - 这很常见。

标签: php forms server phpmailer


【解决方案1】:

“@Fred-ii- 感谢这帮助解决了我的问题。请作为答案发布,以便我给予信任。- H3ll0 10 分钟前”

动作action="currentFile.php"属于&lt;form&gt;,不是输入,使用GET/POST方法。

您还需要使用任一方法并为输入分配/使用数组。

即:

$var = $_POST['var']; // or $_GET depending on the preferred method.

标题中还应该有一个From:,因为这可能会将您的邮件发送到垃圾邮件或完全拒绝。

即:

$mail->setFrom('from@example.com', 'First Last');

故障排除参考链接:

这里是 PHPMailer 的 github:


如果您没有 SPF 记录(发件人政策框架),创建一个会很有帮助。

【讨论】:

  • 答案实际上与GMail相关,使用调试发现。由于您提供的链接,影响添加调试,谢谢。
  • @H3ll0 好的,很高兴听到问题得到解决,干杯
猜你喜欢
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多