Я пытаюсь отправить сообщение HTML при использовании SMTP-аутентификации в Gmail на PHP. Вот сценарий, который я использую:
require_once "Mail.php"; require_once 'Mail/mime.php'; $from = "Some Name <myemail@gmail.com>"; $to = "Other Name <otheremail@gmail.com>"; $subject = "This is a test"; $crlf = "\n"; $host = "ssl://smtp.gmail.com"; $port = "465"; $username = "myemail@gmail.com"; $password = "mypass"; $headers = array ('From' => $from, 'Return-Path' => $from, 'Subject' => $subject); $smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password)); $mime = new Mail_mime($crlf); $mime->setTXTBody("This is a test email message"); $mime->setHTMLBody($body); $body = $mime->get(); $headers = $mime->headers($headers); $mail = $smtp->send($to, $headers, $body); if (PEAR::isError($mail)) { echo("<p>" . $mail->getMessage() . "</p>"); } else { echo("<p>Message successfully sent!</p>"); }
Примечание. $body
– это таблица HTML с изображениями и другой информацией.
Когда я выполняю сценарий, он терпит неудачу со следующей ошибкой:
Не удалось установить отправителя: Некоторое имя [SMTP: неверный код ответа, полученный от сервера (код: 555, ответ: 5.5.2 Синтаксическая ошибка. C6sm20541406obd.22)]
Вот что я пытался понять, что происходит не так: 1. Используя тот же скрипт, используя «Mail» вместо «smtp», т.е.
$smtp = Mail::factory('Mail');
Это прекрасно работает. 2. Используя тот же скрипт без mime.php , это также работает, но не позволяет отправлять HTML-письмо.
Кто-нибудь знает, как я могу объединить эти два, чтобы я все еще использовал аутентификацию SMTP и отправлял сообщение HTML?
EDIT: Здесь дамп $mime->headers()
:
[MIME-Version] => 1.0 [From] => Some Name [Return-Path] => Some Name [Subject] => This is a test [Content-Type] => multipart/alternative; boundary="=_8662996a1f586248545d9f01f48e916d"
См. Приведенный ниже URL. Я думаю, что это очень помогает вам.
Как отправить HTML-адрес электронной почты с помощью SMTP в PHP
Адрес SMTP-сервера Gmail – SMTP.GOOGLEMAIL.COM, а не SMTP.GMAIL.COM .
Поэтому ваши настройки должны быть:
// ... $smtp=array(); $smtp['host']='ssl://smtp.googlemail.com';
См. Другой пример:
Отправить HTML и обычный текст электронной почты с использованием SMTP-сервера с PHP и PEAR
Попробуйте включить имена в двойные кавычки, например:
$from = '"Some Name" <myemail@gmail.com>'; $to = '"Other Name" <otheremail@gmail.com>';
попробуйте и расскажите об этом.
Обновление :
Хорошо, выше не работает, поэтому я просто расскажу вам, что он работает для меня на моих php-страницах для отправки электронной почты через smtp gmail.
поэтому на основе этого вы можете попытаться изменить свой конфиг:
$host = "tls://smtp.gmail.com"; $port = "587";
вы можете увидеть здесь, как отправлять почту через gmail с помощью phpmailer.
Выяснил это сам наконец.
Спасибо Абиду Хусейну за предоставленную ссылку на пример здесь: http://tonyvirelli.com/slider/php-html-email-using-smtp/
Решение:
'Return-Path' => $from
из массива заголовков. To => $to
в массив заголовков (без этого заголовком полученного письма является Undisclosed recipients ) У меня была эта проблема, и с помощью отладки удалось получить всевозможные различные ошибки (см. Ниже). Самое странное, что он полностью прекратил работать около 11/2/2017. Я не делал никаких обновлений. Раньше это было бы случайным образом работать, поэтому я поставил повтор, и ему всегда удавалось <5 попыток, до второго. Странный.
Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Invalid response code received from server (code: -1, response: )] fsockopen(): Failed to enable crypto fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error) SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed
(и так далее)
В другом случае мы использовали этот шаг по устранению неполадок, который помог мне получить больше ошибок, чтобы я мог больше Google объяснить, что может быть причиной:
$result = fsockopen('ssl://smtp.gmail.com', 465, $error_no, $error_message, 5); if($result === false) { echo "error no: $error_no error message: $error_message"; echo print_r($result,true); }else{ echo 'success\n\n'; }
Мое исправление заключалось в том, чтобы добавить файл с пакетом CA, поскольку в PHP не удалось проверить сертификат Google: