警告:mail() [function.mail]:SMTP服务器响应:553我们不中继非本地邮件,抱歉。

8
以下脚本使用mail函数发送电子邮件。但我无法发送电子邮件。单击submit后,会显示以下内容:
Warning: mail() [function.mail]: SMTP server response: 553 We do not relay non-local mail, sorry. in E:\xampp\htdocs\feedback.php on line 19
mail sent successfully

脚本

<?php 
if( isset( $_REQUEST['email'] ) ) {
    $email = $_REQUEST['email'];
    $subject = $_REQUEST['subject'];
    $message = $_REQUEST['message'];
    mail("me@gmail.com" , $subject , $message , "From:".$email );
    echo "mail sent successfully";
}  else {
     echo "<form method = 'post' action = 'feedback.php'>
     Email of sender : <input name = 'email' type = 'text' /> <br/>
     Subject : <input name = 'subject' type = 'text'/> <br/>
     Enter your feedback here : <textarea name = 'message' rows = 15 cols = 40 > </textarea> <br/>
     <input type = 'submit'/>
     </form>";
   }
?>

我正在使用Apache作为php服务器。
同时告诉我为什么我们在邮件参数中必须写上$subject、$message,即带上$符号,因为我们已经在上面声明了$email、$message等。为什么不能只写消息、电子邮件等,不加美元符号?

2
你在这里提出了两个完全无关的问题。请将其分开。 - Ignacio Vazquez-Abrams
4
关于你的第二个问题,那是关于PHP中变量使用的内容。 - Simon
6个回答

20

解决方法: 在 Xampp 菜单中,
进入 Mercury 管理界面-->配置菜单-->MercuryS SMTP 服务器-->连接控制。在该窗口中,取消选中复选框。如下图所示:

图片描述

然后在 php.ini 文件中:

[mail function]
SMTP=127.0.0.1 <------------------将 localhost 改为本地 IP

smtp_port=25


5
您正在使用默认带有Mercury的XAMPP,但默认情况下它无法将邮件发送到不同的服务器。它基本上是用于调试。确实存在配置说明来配置它这样做,但在我的经验中,Windows + Apache通常最好仅用作调试环境。
PHP变量都带有$符号,这被称为sigil。它可以使它们与常量、类定义和函数区分开来。如果您想分配一个值然后将其发送到函数中,则需要使用变量。如果重要的话,您可以使用define设置常量,但相信我,这种情况很少,您通常应避免使用它们。
您也可以这样做:
mail("me@gmail.com" , 
      $_REQUEST['subject'] , 
      $_REQUEST['message'] , 
      "From:".$_REQUEST['email'] );

即使将其托管到Web服务器上,我仍然无法收到电子邮件。这可能是什么原因。这是脚本 - Suhail Gupta
你确认你的服务器有邮件服务器吗?你是否将电子邮件发送到已知的电子邮件地址?当你调用 $res = mail(<你的电子邮件>,'主题','正文'); echo $res? 'mail returned true':'mail returned false'; 时会发生什么? - cwallenpoole
你链接的帖子“解决此问题的指令”已经失效了,@cwallenpoole。 - Pie
@Pie已修复。现在它引用互联网档案馆。 - cwallenpoole

5

警告:mail() [function.mail]:SMTP服务器响应:553 We do not relay non-local mail, sorry. in E:\xampp\htdocs\feedback.php on line 19 邮件发送成功

这意味着您的服务器配置不正确。它应该能够通过一些允许从您的系统中继的smarthost发送邮件。在真正的服务器上,这很可能是运行在localhost上的MTA。

还要说明为什么我们必须在邮件参数中使用$subject,$message,即使我们已经在上面声明了$email,$message等变量。为什么我们不能只写message,email,..而不带美元符号?

这是因为PHP中的变量前缀为$


即使将其托管到Web服务器上,我仍然无法收到电子邮件。这可能是什么原因。这是脚本 - Suhail Gupta

1
以下脚本使用邮件函数发送电子邮件。 但我无法发送电子邮件。单击提交后,将显示以下内容:
SMTP服务器阻止从非本地计算机/域发送邮件。
这是为了防止垃圾邮件发送者使用SMTP服务器发送邮件(开放中继)。
同时告诉我们为什么在邮件参数中必须写$subject、$message,即带有$符号,因为我们刚刚声明了$email、$message等。为什么不能只写消息、电子邮件等,而不带美元符号? 您不必使用变量。
mail('me@gmail.com' , 'subject', 'test', 'From: someone@example.com');

完全没问题。

你也可以这样做:

mail("me@gmail.com" , $_REQUEST['subject'] , $_REQUEST['message'] , "From:".$_REQUEST['email'] );

如果他想使用用户在表单中提交的数据,则必须这样做。 - Lightness Races in Orbit
@PeeHaa:请修正你的第二部分。它可能会导致错误的想法。 - Cem Kalyoncu
@Cem Kalyoncu:什么第二部分?我刚刚改变的那一部分吗?:P - PeeHaa
即使将其托管到Web服务器上,我仍然无法收到电子邮件。这可能是什么原因。这是脚本 - Suhail Gupta

0

这个问题是由于您的服务器配置引起的。 现在,服务器停止了开放中继消息的方法,而我们在核心PHP中使用的发送邮件的方法是一种开放式中继方法。停止开放式中继可以减少垃圾邮件。 这就是您收到此错误消息的原因,请尝试使用像Swift Mail这样的邮件库从您的SMTP发送邮件。


0
如果您正在使用Windows + Xampp安装: 这是因为Mercury服务已经在运行,无法将电子邮件发送到本地主机之外。 转到Xammp控制面板并停止Mercury服务。希望能有所帮助。

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