Хотим получать заявки с сайта по почте или другие важные уведомления. Нужно отправить письмо с сайта. Как это сделать?
Есть несколько способов.
1. Через функцию mail() php с использованием почтового сервера хостинга.
Синтаксис функции очень простой
mail($reciever, $subject, $content, $headers, $attachments);
$reciever – получатель (получатели), адреса, строка
$subject – тема письма, строка
$content – тело письма, строка
$headers – служебные заголовки
$attachments – полный адрес приложенного файла
Функция возвращает TRUE
, если письмо было принято для передачи, иначе FALSE
. Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.
Получатель должен соответствовать » RFC 2822. Несколько примеров:
- user@example.com
- user@example.com, anotheruser@example.com
- User <user@example.com>
- User <user@example.com>, Another User <anotheruser@example.com>
Функция mail() может работать с тремя параметрами (на большинстве хостингов)
mail($reciever, $subject, $content);
но из-за отсутствия большей части служебных заголовков на входящей стороне письма будут попадать в папку СПАМ.
Сервер указывает в заголовках только поле “From:” (настройка php.ini), иначе почтовый сервер получателя вообще не примет письмо.
Делается просто, но не всегда работает :(
– на части хостингов достаточно указывать получателя, на некоторых хостингах предварительно нужно создать служебный ящик и указать его в заголовках $headers
– иногда функция mail() просто отключена, что избежать спамовых почтовых рассылок (необходимо решать с саппортом)
Итого:
– работает, но не всегда
– при переезде сайта на другой хостинг всё может сломаться
2. С использованием сервера SMTP хостинга
Уже лучше, все служебные поля заполнены правильно, письмо практически всегда попадает во “Входящие”
Нужна авторизация на сервере SMTP хостинга.
Как пример, параметры авторизации на мастерхосте (откроется в отдельном окне), там же есть и пример функции PHP для использования SMTP
Минус только один – при смене хостинга всё перестанет работать
3. С использованием сервера SMTP другой почты
Вот тут совсем хорошо.
Если у Вас, например, есть ящик на mail.ru – узнаете параметры авторизации на SMTP сервере, прописываете их и можете сами себе от себя отправлять письма с сайта :) Отправка писем не будет зависеть от хостинга.
Как пример, параметры авторизации сервера SMTP mail.ru (откроется в отдельном окне)
По поводу SMTP mail.ru два важных замечания (ВАЖНО):
– ящик отправителя и поле “From:” в заголовках письма должны совпадать (иначе будет выдана ошибка 550)
– название сервера SMTP для mail.ru правильно вот так – ssl://smtp.mail.ru (ибо используется протокол шифрования SSL/TLS и порт 465)
4. Внутреннюю функцию PHP wp_mail() для WordPress
Аналогично функции PHP mail() за исключением того, что для отправки писем используется сервер WordPress, а не сервер хостинга.
Функция wp_mail() “умеет” частично заполнять служебные заголовки :)
При сокращенном использовании вида wp_mail($reciever, $subject, $content);
четвертый отсутствующий параметр $headers будет частично заполнен:
“From: WordPress <wordpress@yoursite.com>”
Поэтому письма, которые отправил сам сервер WordPress через wp_mail() все-таки попадают во “Входящие”, а не в “СПАМ” (несмотря на то, что пользователь забыл прописать служебные заголовки).
Есть соответствующие плагины SMTP для CMS WordPress, которые производят подмену встроенной функции wp_mail() на свою функцию, которая использует внешний почтовый сервер.
Соответственно все другие плагины, которые работали через wp_mail(), будут корректно отправлять письма через SMTP.
Какой вариант лучше использовать?
Лучше использовать вариант через SMTP сервер
Если Вы сами конструируете свой сайт, то может взять код PHP с сайта мастерхост, например
параметры авторизации на мастерхосте
Если у Вас сайт на WordPress – используйте функцию wp_mail() и дополнительный плагин SMTP, например Post SMTP Mailer/Email Log
Плагин заменит wp_mail() на вариант отправки через SMTP (и еще бонусом будет лог отправленных писем)
Как правильно заполнить служебные заголовки?
Вот так
$headers = array(
‘From: Me Myself <me@example.net>’,
‘Content-type: text/html’,
‘Cc: Me Myself <me@example.net>’,
‘Bcc: Me Myself <me@example.net> );
Cc: – some@gmail.com — точная копия (carbon copy) — вторичные получатели письма, которым направляется копия. Они видят и знают о наличии друг друга.
Bcc: – some@gmail.com — скрытая точная копия (blind carbon copy) — скрытые получатели письма, чьи адреса не показываются другим получателям
Или так:
$headers = “MIME-Version: 1.0\r\n”;
$headers .= “Content-type: text/plain; charset=utf-8 \r\n”;
$headers .= “From:Me Myself <me@example.net>\r\n“;
$headers .= “Reply-To:Me Myself <me@example.net>\r\n“;
$headers .= “To: $reciever\r\n“;
$headers .= “Cc: Me Myself <me@example.net>\r\n“;
$headers .= “Bcc: Me Myself <me@example.net>“;
Вот эти все поля – смотрим на нелокализованный Outlook.
Чем отличается указание в заголовках Content-type: text/plain от Content-type: text/html
Вариант Content-type: text/plain подразумевает простой текст, Вам придется тело письма конструировать примерно вот так (что бы были отдельные новые строчки – через спецсимволы “перевод каретки” и “возврат строки”). Каждая строка должна быть отделена символом CRLF (\r\n)
$content = “Текст:\r\n”;
$content .= “$message\r\n”;
$content .= “\r\n”;
Мелкий плюс – если у Вас в тексте есть url – то сервер из него сделает ссылку самостоятельно (и для почтового адреса аналогично).
Для варианта Content-type: text/html можно использовать разметку html
Вы получаете возможность сделать верстку нужной формы (через таблицы, например). И можно использовать картинки! Как для оформления, так и для основного текста.
ВАЖНО: не все почтовые серверы корректно обрабатывают приложенные картинки.
Так мы можем прямо в тексте html закодировать картинку – и браузер её нарисует и покажет :)
Читаем статью
Мелкий минус – если у Вас в тексте есть url – то ссылку придется конструировать самостоятельно по правилам html
<a href=”http://mysite.ru”>Посмотрите мой сайт!</a>
Как отправить письма в несколько адресов?
Добавляйте получателей через запятую
$reciever=’User <user@example.com>, Another User <anotheruser@example.com>’;
Как добавить получателей в копию / скрытую копию?
Аналогично, только получатели добавляются в служебные заголовки
$headers = “MIME-Version: 1.0\r\n”;
$headers .= “Content-type: text/plain; charset=utf-8 \r\n”;
$headers .= “From:Me Myself <me@example.net>\r\n“;
$headers .= “To: $reciever\r\n“;
$headers .= “Cc: Me Myself <me@example.net>\r\n“;
$headers .= “Bcc: Me Myself <me@example.net>“;
Как проверить валидность адреса email с помощью PHP?
С помощью filter_var() — фильтрует переменную с помощью определенного фильтра. Для проверки email используется параметр FILTER_VALIDATE_EMAIL Возвращает отфильтрованные данные или FALSE
, если фильтрация завершилась неудачей.
(PHP 5 >= 5.2.0, PHP 7)
$email = ’email@domen.ru‘;
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false)
{
//ОК, формат email правильный
}
else
{
//проверка email на правильность НЕ пройдена
}
Как использовать эти знания?
Можно написать форму обратной связи. Как сделать форму обратной связи?
А как в этой форме сделать так, что бы введенный адрес email подставлялся для ответа кнопкой “Ответить”?
Используем заголовки и проверку валидации email.
$email = ’email@domen.ru‘; // получено с формы
$name=’John’; // получено с формы
$headers = “MIME-Version: 1.0\r\n”;
$headers .= “Content-type: text/plain; charset=utf-8 \r\n”;
$headers .= “From:Me Myself <me@example.net>\r\n“;
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false)
{
$headers .= “Reply-To:$name <$email>\r\n“;
}
т.е. письмо пришло с нашего STMP сервера, отправитель me@example.net, а при нажатии кнопки “Отправить” будем отвечать в адрес John <email@domen.ru> с помощью поля ‘Reply-To’
ВАЖНО: Кнопка “Ответить” работает не ПО ОТПРАВИТЕЛЮ письма, а по полю “Reply-To” в служебных заголовках письма. Просто для стандартных почтовых программ поля “From:” и “Reply-To:” совпадают. И только у программистов есть возможность прописать там разные адреса с использованием функции mail()
Коды ошибок почтового сервера.
Код SMTP ошибок состоит из 3 цифр, каждая из которых имеет свое значение.
Первая цифра указывает на то, был ли принят и обработан ваш запрос.
Существует 5 значений для первой цифры кода SMTP ошибки
- Сервер принял команду, но не предпринял никаких действий, так как ожидает подтверждения на выполнение запрашиваемых действий.
- Действие было успешно выполнено, и сервер готов принимать новую команду.
- Сервер принял команду, но для её завершения требуется дополнительная информация.
- Возник временный сбой. Если не последует изменений при повторении команды — попробуйте ещё раз.
- Сервер столкнулся с неустранимой ошибкой, ваша команда не будет обработана.
Если код начинается с цифры 2 — ваша команда успешно обработана, если с 4 — есть временный сбой, с 5 — постоянный сбой. В последнем случае ваши письма не будут отправлены, пока вы не устраните ошибку.
Существует 4 значения для второй цифры кода SMTP ошибки
- Синтаксическая ошибка.
- Информационный ответ (запрос информации, например, помощь).
- Обозначает состояние подключения.
- Обозначает состояние почтового сервера или почтовой системы.
Последняя цифра в коде несет более подробную информацию о статусе доставки.
Самые важные коды SMTP ошибок:
211 | System status, or system help reply | Отклик с системной справкой или состоянием системы |
214 | Help message | Информация о работе с сервером или отдельных командах |
220 | Service ready | Служба для указанного домена готова |
221 | Service closing transmission channel | Закрывается канал передачи для указанного домена |
250 | Requested mail action okay, completed | Операция благополучно завершена |
251 | User not local; will forward to | Нелокальный пользователь – почта будет пересылаться по прямому пути |
252 | Cannot VRFY user, but will accept message and attempt delivery | Не удается проверить почтовый ящик, но сообщение принято и сервер попытается его доставить |
354 | Start mail input; end with | Начало ввода данных. Завершение |
421 | Service not available, closing transmission channel | Для указанного домена обслуживание невозможно и канал связи закрывается. Это может быть откликом на любую команду, если известно, что сервис отключен |
450 | Requested mail action not taken: mailbox unavailable | Запрошенная операция невозможна – почтовый ящик недоступен (например, занят) |
451 | Requested action aborted: error in processing | Запрошенная операция прервана в результате ошибки |
452 | Requested action not taken: insufficient system storage | Запрошенная операция не выполнена по причине нехватки пространства (на диске) |
500 | Syntax error, command unrecognized | Синтаксическая ошибка, команда не распознана (это может говорить о слишком длинной команде) |
501 | Syntax error in parameters or arguments | Синтаксическая ошибка в параметрах или аргументах |
502 | Command not implemented | Команда не реализована |
503 | Bad sequence of commands | Некорректный порядок команд |
504 | Command parameter not implemented | Параметры команды не реализованы |
550 | Requested mail action not taken: mailbox unavailable | Запрошенная операция невозможна – почтовый ящик недоступен (например, почтовый ящик не найден, к нему нет доступа или команда отвергнута по соображениям используемой политики, ошибка в заголовках) |
551 | User not local; please try | Нелокальный пользователь – попытайтесь использовать прямой путь |
552 | Requested mail action aborted: exceeded storage allocation | Запрошенная операция прервана по причине превышения выделенного (дискового) пространства |
553 | Requested action not taken: mailbox name not allowed | Запрошенная операция не выполнена – недопустимый почтовый ящик (например, синтаксическая ошибка в имени ящика) |
554 | Transaction failed или No SMTP service here | Отказ транзакции или отсутствие поддержки сервиса SMTP (при попытке соединения) |
Почитать в разделе: EMAIL
- Всего статей в разделе: 3
- Показано статей в списке: 3
- Сортировка: название по алфавиту
Загадочные буквы MX, SPF, DKIM для EMAIL

(Читать полностью...)
Кодировка картинок Base64

(Читать полностью...)
Форма обратной связи

(Читать полностью...)