Перейти к содержимому

Php mail error что это

  • автор:

Проблемно работает PHP функция mail(), отправляет письмо через 60 секунд

Столкнулся с проблемой отправки почты с помощью PHP функции mail(). Проблема заключается в том, что при отправке письма скрипт исполняется 60 секунд и затем успешно отправляет письмо. Сервер на Ubuntu 18. С чем это может быть связано? Вот код:

$to /cdn-cgi/l/email-protection" data-cfemail="086571256d65696164486f65696164266b6765">[email protected]"; $subject = "Подтверждение регистрации на Site"; $message = "

Это письмо было отправлено для подтверждения e-mail.

Если это сделали не вы - немедленно обратитесь к администратору сервера.

Это автоматическое письмо, пожалуйста не отвечайте на него.

"; $headers = "Content-type: text/html; UTF-8 \r\n"; $headers . /cdn-cgi/l/email-protection" data-cfemail="1177637e7c51627865743f6364">[email protected]>\r\n"; $headers . /cdn-cgi/l/email-protection" data-cfemail="264f48404966554f5243085453">[email protected]\r\n"; if(mail($to, $subject, $message, $headers) === true) < echo json_encode('success'); >else

Отслеживать

321 2 2 серебряных знака 15 15 бронзовых знаков

задан 5 ноя 2019 в 1:05

phpmailer ошибка

При отправке данных на почту получаю: Ошибка: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting В логах получаю: 2022-06-19 15:56:54 Connection: opening to ssl://smtp.mail.ru:587, timeout=300, options=array() 2022-06-19 15:56:54 Connection failed. Error #2: stream_socket_client(): SSL operation failed with code 1. OpenSSL Error messages:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol [D:\progs\OpenServer\OpenServer\domains\dist\phpmailer\SMTP.php line 394] 2022-06-19 15:56:54 Connection failed. Error #2: stream_socket_client(): Failed to enable crypto [D:\progs\OpenServer\OpenServer\domains\dist\phpmailer\SMTP.php line 394] 2022-06-19 15:56:54 Connection failed. Error #2: stream_socket_client(): unable to connect to ssl://smtp.mail.ru:587 (Unknown error) [D:\progs\OpenServer\OpenServer\domains\dist\phpmailer\SMTP.php line 394] 2022-06-19 15:56:54 SMTP ERROR: Failed to connect to server: (0) SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting Ошибка: SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting php код:

isSMTP(); // Отправка через SMTP $mail->Host = 'smtp.mail.ru'; // Адрес SMTP сервера $mail->SMTPAuth = true; // Enable SMTP authentication $mail->Username = '[email protected]'; $mail->Password = 'prizrak'; // ваш пароль $mail->SMTPSecure = 'ssl'; // шифрование ssl $mail->Port = 587; $mail->SMTPDebug = 4; // порт подключения $mail->setFrom('[email protected]', 'Иван Иванов'); // от кого $mail->addAddress('[email protected]', 'Вася Петров'); // кому $mail->Subject = 'Тест'; $mail->msgHTML(" 

Здравствуйте!

Это тестовое письмо.

"); // Отправляем if ($mail->send()) < echo 'Письмо отправлено!'; >else < echo 'Ошибка: ' . $mail->ErrorInfo; > ?>

mail

Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.

Предостережение

(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.

$text = str_replace ( «\n.» , «\n..» , $text );
?> additional_headers (необязательный)

Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.

Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.

Если передан массив, то его ключи будут именами заголовка, а значения значениями.

Замечание:

До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.

Замечание:

При отправке письмо должно содержать заголовок From . Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .

Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): «sendmail_from» not set in php.ini or custom «From:» header missing . Заголовок From также определяет заголовок Return-Path при отправке напрямую через SMTP (только Windows).

Замечание:

Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.

additional_params (необязательный)

Параметр additional_params может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path . Например, можно установить отправителя письма при использовании sendmail с помощью опции -f .

Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).

Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail — это файл /etc/mail/trusted-users .

Возвращаемые значения

Возвращает true , если письмо было принято для передачи, иначе false .

Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.

Список изменений

Версия Описание
7.2.0 Параметр additional_headers может принимать значения типа массив.

Отправка электронных писем с помощью библиотеки PHPMailer языка PHP

Несмотря на то, что PHPMailer — библиотека PHP с открытым исходным кодом — была создана в далёком 2001 году, она наряду со Swiftmailer остается одним из лучших программных средств для отправки электронных писем, по мнению большинства разработчиков. Расскажем о том, как применять PHPMailer вместо встроенной функции mail() , а также приведём несколько примеров использования этой библиотеки.

Является ли PHPMailer альтернативой встроенной функции mail() ?

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

Если PHPMailer поддерживает ООП, то функция mail() уже не применима при объектно-ориентированном подходе в программировании. Также PHP-разработчики не любят использовать строки $headers при отправке писем с помощью функции mail() , поскольку при этом приходится экранировать многие символы. Еще один недостаток стандартной функции отправки писем PHP – «грязный» код (экранирование, кодирование, форматирование) скрипта отправки вложений и писем на HTML. PHPMailer полностью лишён перечисленных недостатков.

Для работы mail() требуется сконфигурированный локальный сервер, в то время как PHPMailer поддерживает протокол SMTP, который могут использовать аутентифицированные пользователи.

Рассмотрим ещё несколько преимуществ использования PHPMailer:

  • отображение сообщений об ошибках отправки писем более чем на 40 различных языках;
  • наличие встроенной поддержки аутентификации через SSL и TSL;
  • возможность отправки обычной текстовой копии письма клиентам, не поддерживающим письма формата HTML;
  • активное сообщество разработчиков, обеспечивающих безопасность библиотеки и выпуск обновлений.

К слову, PHPMailer используют многие CMS, созданные на языке PHP: например, WordPress, Joomla! и Drupal.

Установка библиотеки PHPMailer

Для установки PHPMailer можно использовать менеджер пакетов (композер), выполнив следующую команду:

composer require phpmailer/phpmailer

Отправка электронных писем с локального сервера с помощью PHPMailer

Ниже представлен простой код для отправки электронного письма с локального сервера через библиотеку PHPMailer:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//PHPMailer Object« $mail = new PHPMailer(true); //Argument true in constructor enables exceptions`

//From email address and name
$mail->From = «from@yourdomain.com»;
$mail->FromName = «Full Name»;

//To address and name
$mail->addAddress(«recepient1@example.com», «Recepient Name»);
$mail->addAddress(«recepient1@example.com»); //Recipient name is optional

//Address to which recipient will reply
$mail->addReplyTo(«reply@yourdomain.com», «Reply»);

//CC and BCC
$mail->addCC(«cc@example.com»);
$mail->addBCC(«bcc@example.com»);

//Send HTML or Plain Text email
$mail->isHTML(true);

$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo «Message has been sent successfully»;
> catch (Exception $e) <
⠀⠀⠀⠀ echo «Mailer Error: » . $mail->ErrorInfo;
>

Представленный код с комментариями наглядно демонстрирует все действия, которые нужно выполнить для отправки письма.

Отправка письма с вложениями

В приведённом ниже коде показано, как отправить письмо с вложениями с помощью PHPMailer:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer;

$mail->From = «from@yourdomain.com»;
$mail->FromName = «Full Name»;

$mail->addAddress(«recipient1@example.com», «Recipient Name»);

//Provide file path and name of the attachments
$mail->addAttachment(«file.txt», «File.txt»);
$mail->addAttachment(«images/profile.png»); //Filename is optional

$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo «Message has been sent successfully»;
> catch (Exception $e) <
⠀⠀⠀⠀ echo «Mailer Error: » . $mail->ErrorInfo;
>

К письму были прикреплены два файла: file.txt , расположенный в папке со скриптом, и images/profile.png , который находится в папке images .

Чтобы прикрепить файлы к письму, необходимо вызвать метод addAttachment объекта PHPMailer, который в качестве аргумента принимает строку с адресом файла. Для прикрепления нескольких файлов нужно вызвать этот метод соответствующее число раз.

Устранение проблем в коде

Для отладки кода был использован класс Exception библиотеки PHPMailer, который способен отследить все возможные ошибки. В конструктор объекта PHPMailer был передан аргумент true , который указывает на необходимость отображения полной информации об исключениях.

В зависимости от типа системы, наиболее распространенной ошибкой при использовании встроенной функции mail() в фоновом режиме является следующая:

Mailer Error: Could not instantiate mail function.

Если нужно получить больше сведений о возникшей ошибке, можно добавить следующий код в блок catch<> :

Как правило, ошибки использования функции mail() связаны с тем, что почтовый сервер не был сконфигурирован. В этом случае функция error_get_last вернёт следующее:

Array (
⠀⠀⠀⠀ [type] => 2
⠀⠀⠀⠀ [message] => mail(): Failed to connect to mailserver at «localhost» port 25, verify your «SMTP» and «smtp_port» setting in php.ini or use ini_set()
⠀⠀⠀⠀ [file] => OUR_PATH \vendor\phpmailer\phpmailer\src\PHPMailer.php
⠀⠀⠀⠀ [line] => 863
`)

Чтобы избежать этой весьма распространённой проблемы, рекомендуется использовать протокол SMTP.

Отображение сообщений об ошибках на требуемом языке

Свойство $ mail-> ErrorInfo отображает сведения о возникающих ошибках на 43 различных языках. Для этого нужно скопировать каталог с языками из исходного кода библиотеки PHPMailer в каталог проекта. Например, чтобы сообщения об ошибках отображались на русском языке, нужно установить соответствующий язык объекта PHPMailer с помощью метода setLanguage() с аргументом “ru” как показано ниже:

В папку language также можно добавить любой другой язык из 43 доступных.

Использование протокола SMTP

Для отправки электронных писем можно использовать почтовый сервер другого хоста, но сперва необходимо пройти аутентификацию. То есть для отправки писем через почтовый сервер Gmail необходимо иметь учётную запись в этом сервисе.

SMTP – протокол запроса на отправку электронного письма, используемый почтовыми клиентами. После того, как почтовый сервер проверит электронное письмо, он отправит его на указанный почтовый сервер.

Ниже приведен пример отправки письма через почтовый сервер Gmail с клиентского домена. Поскольку мы используем SMTP-протокол, локальный почтовый сервер не требуется:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;

$mail = new PHPMailer(true);

//Enable SMTP debugging.
$mail->SMTPDebug = 3;
//Set PHPMailer to use SMTP.
$mail->isSMTP();
//Set SMTP host name
$mail->Host = «smtp.gmail.com»;
//Set this to true if SMTP host requires authentication to send email
$mail->SMTPAuth = true;
//Provide username and password
$mail->Username = «name@gmail.com»;
$mail->Password = «super_secret_password»;
//If SMTP requires TLS encryption then set it
$mail->SMTPSecure = «tls»;
//Set TCP port to connect to
$mail->Port = 587;

$mail->From = «name@gmail.com»;
$mail->FromName = «Full Name»;

$mail->addAddress(«name@example.com», «Recepient Name»);

$mail->Subject = «Subject Text»;
$mail->Body = «Mail body in HTML«;
$mail->AltBody = «This is the plain text version of the email content»;

try <
⠀⠀⠀⠀ $mail->send();
⠀⠀⠀⠀ echo «Message has been sent successfully»;
> catch (Exception $e) <
⠀⠀⠀⠀ echo «Mailer Error: » . $mail->ErrorInfo;
>

Сервер Gmail использует TSL-шифрование поверх SMTP, поэтому в коде было установлено соответствующее значение для свойства объекта PHPMailer. Перед отправкой по протоколу SMTP необходимо указать имя хоста, номер порта, тип шифрования и пройти аутентификацию, а также предоставить имя пользователя и пароль. Если в Gmail была включена функция двухфакторной аутентификации, доступ к SMTP через имя пользователя и пароль будет закрыт. Для получения доступа необходимо внести дополнительные настройки.

Одно из преимуществ использования удалённого SMTP в сравнении с локальным почтовым сервером состоит в том, что при отправке электронной почты функцией mail() с любым адресом отправителя ( from ), кроме имени локального домена (имени сервера), сервер-получатель пометит письмо как спам. Например, если письмо будет отправлено с сервера с именем хоста example.com , используя адрес отправителя name@gmail.com , на адрес name@yahoo.com , почтовый сервер Yahoo пометит письмо как спам или отобразит уведомление с предупреждением. Так как имя сервера, с которого было отправлено письмо – example.com . Адрес name@gmail.com принадлежит этому же пользователю, но Yahoo никак не сможет это проверить.

Извлечение писем через протокол POP3

Библиотека PHPMailer поддерживает отправку писем по методу аутентификации POP перед SMTP. Иначе говоря, вы сможете пройти аутентификацию через POP и отправлять почту через SMTP. К сожалению, в PHPMailer реализована только возможность отправки электронных писем, поэтому получать почту по протоколу POP3 с использованием библиотеки не получится.

Заключение

Если вы являетесь PHP-разработчиком, вы будете часто сталкиваться с необходимостью программной отправки электронных писем. Конечно, можно использовать сторонние сервисы (Mandrill или SendGrid) или написать свою собственную библиотеку, но лучшим инструментом для решения этой задачи пока по-прежнему остаётся PHPMailer.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

https://kodirovanie.vyvod-iz-zapoya-na-domu-moskva-snp.ru/