Ответ SMTP-сервера: 501 Необходимо указать по адресу <address> - PullRequest
0 голосов
/ 29 августа 2011

Не могу понять, почему я получаю эту ошибку - оба адреса электронной почты и с адресов действительны (я использую их ежедневно), поэтому не могу понять, как это происходит - любая помощь будет оценена.

ПРИМЕЧАНИЕ. Это работает на производстве, но выдает ошибки в dev. У меня есть более строгий конфиг в dev. ПРИМЕЧАНИЕ: я тестирую локально на ПК, используя smtp4dev

    $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 ():

mail(<myemail@mydomain.com.au>, Company - Invoice#12451, "",
MIME-Version: 1.0 
To: <myemail@mydomain.com.au> 
Cc:
From: Customer Service <myemail@mydomain.com.au> 
Content-Type: multipart/mixed;
boundary="2c88ff549e67c83e7a6e3df0bffe9dc9"

This is a multi-part message in MIME format.
--2c88ff549e67c83e7a6e3df0bffe9dc9 Content-type:text/html;
charset=iso-8859-1 Content-Transfer-Encoding: 7bit

---> html message body stripped <---


--2c88ff549e67c83e7a6e3df0bffe9dc9 Content-Type: application/pdf;
name="Invoice#12451.pdf" Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Invoice#12451.pdf"

--> pdf attachment stripped <--


--2c88ff549e67c83e7a6e3df0bffe9dc9--)

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

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>
1 голос
/ 01 сентября 2011

(Автор smtp4dev здесь)

Это обновленный ответ - я не смог воспроизвести проблему с кодом, который вы выложили, но я заметил, что ваш второй вывод показывает, что иногда вы нене имеет CC-адреса.

Этот код воспроизводит проблему и приводит к ошибке 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 просматривает заголовки сообщений для адресов 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

Таким образом, исправление заключается в том, что вам вообще не нужно включать заголовок CC: если у вас нет адреса CC для отправки на:

<?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);
?>

У меня сработало нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...