Хотим получать заявки с сайта по почте или другие важные уведомления. Нужно отправить письмо с сайта. Как это сделать?



Есть несколько способов.

1. Через функцию mail() php с использованием почтового сервера хостинга.


Синтаксис функции очень простой

mail($reciever, $subject, $content, $headers, $attachments);

$reciever - получатель (получатели), адреса, строка
$subject - тема письма, строка
$content - тело письма, строка
$headers - служебные заголовки
$attachments - полный адрес приложенного файла

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

Получатель должен соответствовать » RFC 2822. Несколько примеров:
  • Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра., Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • User <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>
  • User <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>, Another User <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>


Функция 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 <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>"

Поэтому письма, которые отправил сам сервер 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 <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>',
                 'Content-type: text/html',
                 'Cc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>',
                 'Bcc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.> )
;

Cc: - Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.точная копия (carbon copy) — вторичные получатели письма, которым направляется копия. Они видят и знают о наличии друг друга.
Bcc: - Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.скрытая точная копия (blind carbon copy) — скрытые получатели письма, чьи адреса не показываются другим получателям

Или так:

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=utf-8 \r\n";
$headers .= "From:Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\n";
$headers .= "Reply-To:Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\n";
$headers .= "To: $reciever\r\n";
$headers .= "Cc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\n";
$headers .= "Bcc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>";

Вот эти все поля - смотрим на нелокализованный 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

Мелкий минус - если у Вас в тексте есть url - то ссылку придется конструировать самостоятельно по правилам html
<a href="http://mysite.ru">Посмотрите мой сайт!</a>

Как отправить письма в несколько адресов?

Добавляйте получателей через запятую

$reciever='User <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>, Another User <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>';

Как добавить получателей в копию / скрытую копию?

Аналогично, только получатели добавляются в служебные заголовки

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=utf-8 \r\n";
$headers .= "From:Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\nЭтот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
$headers .= "To: $reciever\r\n";
$headers .= "Cc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\n";
$headers .= "Bcc: Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>";


Как проверить валидность адреса email с помощью PHP?

С помощью filter_var() — фильтрует переменную с помощью определенного фильтра. Для проверки email используется параметр FILTER_VALIDATE_EMAIL Возвращает отфильтрованные данные или FALSE, если фильтрация завершилась неудачей.
(PHP 5 >= 5.2.0, PHP 7)


$email = Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.';
if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false)
{
//ОК, формат email правильный
}
else
{
//проверка email на правильность НЕ пройдена
}


Как использовать эти знания?

Можно написать форму обратной связи. Как сделать форму обратной связи?

А как в этой форме сделать так, что бы введенный адрес email подставлялся для ответа кнопкой "Ответить"?

Используем заголовки и проверку валидации email.

$email = Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.'; // получено с формы
$name='John';
// получено с формы

$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/plain; charset=utf-8 \r\n";
$headers .= "From:Me Myself <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.>\r\nЭтот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.

if (filter_var($email, FILTER_VALIDATE_EMAIL) !== false)
{
$headers .= "Reply-To:$name <$email>\r\n";
}

т.е. письмо пришло с нашего STMP сервера, отправитель Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра., а при нажатии кнопки "Отправить" будем отвечать в адрес John <Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.> с помощью поля 'Reply-To'

ВАЖНО: Кнопка "Ответить" работает не ПО ОТПРАВИТЕЛЮ письма, а по полю "Reply-To" в служебных заголовках письма. Просто для стандартных почтовых программ поля "From:" и "Reply-To:" совпадают. И только у программистов есть возможность прописать там разные адреса с использованием функции mail()

Коды ошибок почтового сервера.

Код SMTP ошибок состоит из 3 цифр, каждая из которых имеет свое значение.

Первая цифра указывает на то, был ли принят и обработан ваш запрос.

Существует 5 значений для первой цифры кода SMTP ошибки

  1. Сервер принял команду, но не предпринял никаких действий, так как ожидает подтверждения на выполнение запрашиваемых действий.
  2. Действие было успешно выполнено, и сервер готов принимать новую команду.
  3. Сервер принял команду, но для её завершения требуется дополнительная информация.
  4. Возник временный сбой. Если не последует изменений при повторении команды — попробуйте ещё раз.
  5. Сервер столкнулся с неустранимой ошибкой, ваша команда не будет обработана.

Если код начинается с цифры 2 — ваша команда успешно обработана, если с 4 — есть временный сбой, с 5 — постоянный сбой. В последнем случае ваши письма не будут отправлены, пока вы не устраните ошибку.

Существует 4 значения для второй цифры кода SMTP ошибки

  1. Синтаксическая ошибка.
  2. Информационный ответ (запрос информации, например, помощь).
  3. Обозначает состояние подключения.
  4. Обозначает состояние почтового сервера или почтовой системы.

Последняя цифра в коде несет более подробную информацию о статусе доставки.

Самые важные коды 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 (при попытке соединения)



  • Для чего нужен сайт в интернете (4900)

     Создание сайта (как для фирмы, так и для торговой марки) представляет одно из направлений рекламной политики: - легко запоминающееся имя вида www.имя.ru - удобные ящики электронной почты вида название@имя.ru - размещение на сайте каталога продукции- информация о видах профессионального обучения- независимость...

  • Сервер доменных имен DNS (2191)

    DNS – что это за «зверь» такой? DNS – это Domain Name Server, т.е сервер доменных имен. На этом сервере лежат служебные записи, в которых указано:- на каком сервере лежат файлы сайта (хостинг) - какой используется почтовый сервер- другие полезные настройки для работы сайта В целом обеспечение технической работы сайта состоит из 4-х частей: 1. Регистратор доменного имени, т.е....

  • Выбор хостинга (1422)

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

  • Файл favicon.ico (1263)

    Фавикон - это маленькая иконка рядом с названием сайта (точнее title страницы) в браузере.Вот, например, сайт www.comphome.ru про домашний компьютер. Мы видим картинку с загадочным треугольником.Как она туда попала? Это такой специальный файл favicon.ico для хранения иконки сайта. Он же фавикон.Что бы браузер ее показал,...

  • Как создать домен 3-го уровня (1136)

    Что такое домен третьего уровня?Домен первого уровня .ru -  национальный домен верхнего уровня для России. Домен второго уровня seotable.ru - открывается наш сайтДомен третьего уровня subdomen.seotable.ru - открывается мини-сайт на PHP, смотреть здесьДомен третьего уровня может быть использован...

  • Основные метатэги (907)

    Метатеги (англ. meta tags) — теги, предназначенные для предоставления структурированных метаданных о веб-странице. Как правило, указываются в заголовке, внутри структуры <head></head>Элемент meta принимает как минимум четыре атрибута: content, http-equiv, name и scheme. Из них обязателен только атрибут content и...

  • Как отправить e-mail с сайта? (169)

    Хотим получать заявки с сайта по почте или другие важные уведомления. Нужно отправить письмо с сайта. Как это сделать?Есть несколько способов. 1. Через функцию mail() php с использованием почтового сервера хостинга. Синтаксис функции очень простойmail($reciever, $subject, $content, $headers,...