Php SMTP服务器响应:501必须指定收件人地址&;书信电报;地址及;燃气轮机;

Php SMTP服务器响应:501必须指定收件人地址&;书信电报;地址及;燃气轮机;,php,email,smtp,Php,Email,Smtp,无法理解我为什么会出现此错误-往来电子邮件地址都是有效的(我每天都使用它们),因此无法了解这是如何发生的-请提供任何帮助 注意:这在生产环境中工作,但在开发环境中抛出错误。我在开发环境中有更严格的配置。 注意:我正在使用smtp4dev在PC上进行本地测试 $to = 'myemail@mydomain.com.au'; $cc = 'myemail@mydomain.com.au'; $from = 'myemail@mydomain.com.au'; $fil

无法理解我为什么会出现此错误-往来电子邮件地址都是有效的(我每天都使用它们),因此无法了解这是如何发生的-请提供任何帮助

注意:这在生产环境中工作,但在开发环境中抛出错误。我在开发环境中有更严格的配置。 注意:我正在使用smtp4dev在PC上进行本地测试

    $to = 'myemail@mydomain.com.au';
    $cc = 'myemail@mydomain.com.au';
    $from = 'myemail@mydomain.com.au';
    $filename = 'Invoice#'.$order_id.'.pdf';
    $message = file_get_contents(ROOT_DIR.'admin/include/email-body.html');
    $content = chunk_split(base64_encode($pdf_file));
    $uid = md5(uniqid(time()));

    $headers  = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'To: '. $to . "\r\n";
    $headers .= 'Cc: '. $cc . "\r\n";
    $headers .= 'From: '. $from . "\r\n";
    $headers .= "Content-Type: multipart/mixed; boundary=\"".$uid."\"\r\n\r\n";
    $headers .= "This is a multi-part message in MIME format.\r\n";
    $headers .= "--".$uid."\r\n";
    $headers .= "Content-type:text/html; charset=iso-8859-1\r\n";
    $headers .= "Content-Transfer-Encoding: 7bit\r\n\r\n";
    $headers .= $message."\r\n\r\n";
    $headers .= "--".$uid."\r\n";
    $headers .= "Content-Type: application/pdf; name=\"".$filename."\"\r\n";
    $headers .= "Content-Transfer-Encoding: base64\r\n";
    $headers .= "Content-Disposition: attachment; filename=\"".$filename."\"\r\n\r\n";
    $headers .= $content."\r\n\r\n";
    $headers .= "--".$uid."--";

    if (mail($to, $subject, $message, $headers)) {
      print "SUCCESS";
    } else {
      print "FALIED";
    }
如果我在mail()行打印变量,结果如下:

邮件(,公司-发票#12451,”,
MIME版本:1.0
致:
复写的副本:
发件人:客户服务部
内容类型:多部分/混合;
边界=“2c88ff549e67c83e7a6e3df0bffe9dc9”
这是MIME格式的多部分消息。
--2c88ff549e67c83e7a6e3df0bffe9dc9内容类型:text/html;
字符集=iso-8859-1内容传输编码:7bit
--->html邮件正文剥离pdf附件剥离(这里是smtp4dev的作者)

这是一个更新的答案-我最初无法重现您发布的代码的问题,但我注意到,您的第二位输出显示,有时您没有抄送地址

此代码再现问题并导致501错误

<?php
    $to = 'myemail@mydomain.com.au';   
    $cc = '';  
    $from = 'myemail@mydomain.com.au';
    $headers .= 'To: '. $to . "\r\n";
    $headers .= 'Cc: '. $cc . "\r\n";
    $headers .= 'From: '. $from . "\r\n";

    mail($to, $subject, $message, $headers);
?>

在Windows上,PHP mail函数查看TO/CC地址的邮件标题,并将每个标题转换为SMTP RCPT TO命令。不幸的是,即使标题没有值,它也会这样做:

220 localhost smtp4dev ready
HELO Computer
250 Nice to meet you
MAIL FROM:<myemail@mydomain.com.au>
250 Okey dokey
RCPT TO:<myemail@mydomain.com.au>
250 Recipient accepted
RCPT TO:<>
501 Must specify to address <address>
QUIT
221 See you later aligator
220本地主机smtp4dev就绪
直升机计算机
很高兴认识你
邮寄地址:
250好的
RCPT至:
接受250名收件人
RCPT至:
501必须指定地址
退出
221再见,阿利盖特
因此,修复方法是,如果您没有要发送到的CC地址,则根本不需要包含CC:header:

<?php
    $to = 'myemail@mydomain.com.au';   
    $cc = '';  
    $from = 'myemail@mydomain.com.au';
    $headers .= 'To: '. $to . "\r\n";

    if ($cc) {
        $headers .= 'Cc: '. $cc . "\r\n";
    }
    $headers .= 'From: '. $from . "\r\n";

    mail($to, $subject, $message, $headers);
?>

这对我来说很好。

(这里是smtp4dev的作者)

这是一个更新的答案-我最初无法重现您发布的代码的问题,但我注意到,您的第二位输出显示,有时您没有抄送地址

此代码再现问题并导致501错误

<?php
    $to = 'myemail@mydomain.com.au';   
    $cc = '';  
    $from = 'myemail@mydomain.com.au';
    $headers .= 'To: '. $to . "\r\n";
    $headers .= 'Cc: '. $cc . "\r\n";
    $headers .= 'From: '. $from . "\r\n";

    mail($to, $subject, $message, $headers);
?>

在Windows上,PHP mail函数查看TO/CC地址的邮件标题,并将每个标题转换为SMTP RCPT TO命令。不幸的是,即使标题没有值,它也会这样做:

220 localhost smtp4dev ready
HELO Computer
250 Nice to meet you
MAIL FROM:<myemail@mydomain.com.au>
250 Okey dokey
RCPT TO:<myemail@mydomain.com.au>
250 Recipient accepted
RCPT TO:<>
501 Must specify to address <address>
QUIT
221 See you later aligator
220本地主机smtp4dev就绪
直升机计算机
很高兴认识你
邮寄地址:
250好的
RCPT至:
接受250名收件人
RCPT至:
501必须指定地址
退出
221再见,阿利盖特
因此,修复方法是,如果您没有要发送到的CC地址,则根本不需要包含CC:header:

<?php
    $to = 'myemail@mydomain.com.au';   
    $cc = '';  
    $from = 'myemail@mydomain.com.au';
    $headers .= 'To: '. $to . "\r\n";

    if ($cc) {
        $headers .= 'Cc: '. $cc . "\r\n";
    }
    $headers .= 'From: '. $from . "\r\n";

    mail($to, $subject, $message, $headers);
?>


这对我来说效果很好。

smtp4dev只是比大多数实际的SMTP中继对收件人的格式有点挑剔

不起作用:

helo me
mail from: me@here.com
rcpt to: somebody@mydomain.tld
作品:

helo me
mail from: me@here.com
rcpt to: <somebody@mydomain.tld>
helo me
邮寄地址:me@here.com
rcpt至:

smtp4dev在收件人格式方面比大多数实际的SMTP中继稍微挑剔一点

不起作用:

helo me
mail from: me@here.com
rcpt to: somebody@mydomain.tld
作品:

helo me
mail from: me@here.com
rcpt to: <somebody@mydomain.tld>
helo me
邮寄地址:me@here.com
rcpt至:

您可能希望编写和发送邮件,而不是使用字符串连接/mail()。这确实使电子邮件相关的事情变得更加顺畅。尝试将回复添加到标题。达哈泽:这是一个转移视线的问题。回复:标题是完全可选的,当然不会影响信封
RCPT to
的可接受性。如果smtp4dev不符合RFC,它可能需要包含to:标题,就像e中所说的那样错误消息。$to和$from最初在括号中。删除了它们,因为我认为这可能是问题所在-只是替换了它们,没有任何效果-仍然会出现相同的错误-因此该错误并没有真正起到帮助作用!您可能希望使用类似的内容来撰写和发送邮件,而不是使用字符串连接/mail()。这确实使电子邮件相关的事情变得更加顺畅。尝试将回复添加到标题。达哈泽:这是一个转移视线的问题。回复:标题是完全可选的,当然不会影响信封
RCPT to
的可接受性。如果smtp4dev不符合RFC,它可能需要包含to:标题,就像e中所说的那样错误消息。$to和$from最初在括号中。删除了它们,因为我认为这可能是问题所在-只是替换了它们,没有任何效果-仍然得到相同的错误-因此错误并没有真正起到帮助作用!你就是那个人!我实际上已经解决了这个问题,但我从来没有弄清楚如何…最终删除$to、$cc和$from并使用邮件中的$to()调用(而不是在附加标题中),将$from添加到php.ini中,并将$cc连接到$to,这就是它存在的原因…现在您已经解释了,这就是问题所在!虽然我有您-您可以在smtp4dev中帮助处理空白电子邮件吗?如果我查看消息源,内容就在那里,如果我通过外部实时smtp服务器发送,它会显示良好,但它不会显示在中smtp4dev邮件查看器窗口。它有带pdf附件的html正文-smtp4dev中有任何限制吗?@tripleee-我知道它是如何工作的-感谢你如此屈尊!我不想这么做-我想得到smtp4dev作者的反馈你就是那个人!我实际上已经解决了这个问题,但我从来没有弄明白…最终如何删除$to、$cc和$from以及usi在mail()调用中调用$to(而不是在附加标题中),将$from添加到php.ini中,并将$cc连接到$to,这就是它存在的原因…现在您已经解释了,这就是问题所在!虽然我有您-您可以在smtp4dev中帮助处理空白电子邮件吗?如果我查看消息源,内容就在那里,如果我通过外部实时smtp服务器发送,它会显示良好,但它不会显示在中smtp4dev邮件查看器窗口。它有带有pdf附件的html正文-smtp4dev中有任何限制吗?@tripleee-我知道它是如何工作的-谢谢你这么屈尊!我不想这么做-我想得到smtp4dev作者的反馈