Хотим получать заявки с сайта по почте или другие важные уведомления. Нужно отправить письмо с сайта. Как это сделать?
Есть несколько способов.
Используем сервер SMTP хостера
Делается просто, но не всегда работает :(
- на части хостингов достаточно указывать получателя, на некоторых хостингах предварительно нужно создать служебный ящик и указать его в заголовках $headers
- иногда функция mail() просто отключена, что избежать спамовых почтовых рассылок (необходимо решать с саппортом)
Итого:
- работает, но не всегда
- при переезде сайта на другой хостинг всё может сломаться
Через функцию mail() php
ВАЖНО: функция работает — но все заголовку нужно указывать. Если части заголовков нет (или они собраны неправильно) — письмо конечно отправится, но с гарантией 90% попадет в спам у получателя.
Синтаксис функции очень простой
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), иначе почтовый сервер получателя вообще не примет письмо.
Как пример, параметры авторизации на мастерхосте (откроется в отдельном окне), там же есть и пример функции PHP для использования SMTP
Внутреннюю функцию PHP wp_mail() для WordPress
Аналогично функции PHP mail() — но с некоторыми модификациями.
Функция wp_mail() «умеет» частично заполнять служебные заголовки :)
При сокращенном использовании вида wp_mail($reciever, $subject, $content);
четвертый отсутствующий параметр $headers будет частично заполнен:
«From: WordPress <wordpress@yoursite.com>»
Поэтому письма через wp_mail() все-таки попадают во «Входящие», а не в «СПАМ» (несмотря на то, что пользователь забыл прописать служебные заголовки).
Вероятность 50% на 50%.
Есть соответствующие плагины SMTP для CMS WordPress, которые производят подмену встроенной функции wp_mail() на свою функцию, которая использует внешний почтовый сервер.
Соответственно все другие плагины, которые работали через wp_mail(), будут корректно отправлять письма через SMTP.
С использованием сервера SMTP другой почты
Тут два варианта:
- использование публичных серверов почты (yandex.ru., mail,ru)
- собрать собственный сервер SMTP (и поставить его под стол :)
Для внешних серверов совсем хорошо.
Если у Вас, например, есть ящик на mail.ru — узнаете параметры авторизации на SMTP сервере, прописываете их и можете сами себе от себя отправлять письма с сайта :) Отправка писем не будет зависеть от хостинга.
Как пример, параметры авторизации сервера SMTP mail.ru (откроется в отдельном окне)
По поводу SMTP mail.ru два важных замечания (ВАЖНО):
- ящик отправителя и поле «From:» в заголовках письма должны совпадать (иначе будет выдана ошибка 550)
- название сервера SMTP для mail.ru правильно вот так — ssl://smtp.mail.ru (ибо используется протокол шифрования SSL/TLS и порт 465)
ВАЖНО: при изменениях на сервере STMP со стороны сервиса всё может перестать работать.
Например, MAIL.RU недавно ввела отдельный пароль для приложений.
И теперь основной пароль почты работает только для пользователя почты (аккаунт, интерфейс, отправка и получение). Для приложения (наш случай) необходимо создавать отдельный пароль.
Читаем статью
Пароль для внешних приложений mail.ru
Какой вариант лучше использовать?
Лучше использовать вариант через SMTP сервер
Если Вы сами конструируете свой сайт, то может взять код PHP с сайта мастерхост, например
параметры авторизации на мастерхосте
Если у Вас сайт на WordPress — используйте функцию wp_mail() и дополнительный плагин SMTP, например Post SMTP Mailer/Email Log
Плагин заменит wp_mail() на вариант отправки через SMTP (и еще бонусом будет лог отправленных писем)
ВАЖНО: при использовании SMTP сервера Вы должны контролировать разные изменения на этом сервере. Разработчики могут там что-нибудь изменить — и отправка Вашей почты перестанет работать.
Как правильно заполнить служебные заголовки?
Вот так
$headers = array( 'From: Me Myself <me@example.net>', 'Reply-To: Me Myself <me@example.net>', 'Content-type: text/html', 'Cc: Me Myself <me@example.net>', 'Bcc: Me Myself <me@example.net> );
Поле «Reply-To» критично важно для не попадания в спам — адрес в этом поле используется для кнопки «Ответить» и по хорошему он должен совпадать с полем «From«.
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()
Подпишитесь в VKontakte - нажмите кнопку | ||
Подпишитесь в Telegram - нажмите кнопку | ||
Наша группа ODNOKLASSNIKI |
Вы можете сохранить ссылку на эту страницу себе на компьютер в виде htm файла
Запрос на размещение Вашего рекламного поста (тема и email будут добавлены автоматически в письмо)
В Вашем браузере должна быть настроена обработка ссылок mailto
site_post@bk.ru
или просто скопируйте адрес e-mail
Почитать в разделе
Как отправить e-mail с сайта?

(Читать полностью...)
- Всего статей в разделе: 5
- Показано статей в списке: 5
- Сортировка: название по алфавиту
Загадочные буквы MX, SPF, DKIM для EMAIL

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

(Читать полностью...)
Коды ошибок почтового сервера

(Читать полностью...)
Протокол MailTo

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

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