G|Translate: English EN Français FR Deutsch DE Italiano IT Русский RU Español ES

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

4.4/5 - (7 голосов)

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

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

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

Используем сервер SMTP хостера

Делается просто, но не всегда работает :(

  • на части хостингов достаточно указывать получателя, на некоторых хостингах предварительно нужно создать служебный ящик и указать его в заголовках $headers
  • иногда функция mail() просто отключена, что избежать спамовых почтовых рассылок (необходимо решать с саппортом)

Итого:

  • работает, но не всегда
  • при переезде сайта на другой хостинг всё может сломаться

Через функцию mail() php 

ВАЖНО: функция работает — но все заголовку нужно указывать. Если части заголовков нет (или они собраны неправильно) — письмо конечно отправится, но с гарантией 90% попадет в спам у получателя.

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

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

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

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

Получатель должен соответствовать » RFC 2822. Несколько примеров:

 

Функция 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%.

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

Есть соответствующие плагины 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.

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

Чем отличается указание в заголовках 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 закодировать картинку — и браузер её нарисует и покажет :)

Читаем статью

Кодировка картинок Base64

Мелкий минус — если у Вас в тексте есть 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 с сайта?

Хотим получать заявки с сайта по почте или другие важные уведомления. Нужно отправить письмо с сайта. Как это сделать? Есть несколько способов. Используем сервер SMTP хостера Делается просто, но не всегда работает :( на части хостингов достаточно указывать получателя, на некоторых хостингах предварительно нужно создать служебный ящик и указать его в заголовках $headers иногда функция mail() просто отключена, что избежать спамовых почтовых рассылок (необходимо решать с саппортом) Итого: работает, но не всегда при переезде сайта на другой хостинг всё может сломаться Через функцию mail() php  ВАЖНО: функция работает - но все заголовку нужно указывать. Если части...
(Читать полностью...)

  • Всего статей в разделе: 5
  • Показано статей в списке: 5
  • Сортировка: название по алфавиту

Загадочные буквы MX, SPF, DKIM для EMAIL

Вот такая сложная картинка Вся эта красота нужна для того, что бы получатель письма email мог проверить истинность отправителя. Настраивается у хостера в разделе "записи DNS" для текущего домена. Лень спамеров всё это заполнять - позволяет сервисам электронной почты отправлять кривые письма сразу в папку СПАМ. По самим терминам: MX запись  (от англ. Mail eXchanger) — тип DNS-записи, предназначенный для маршрутизации электронной почты с использованием протокола SMTP. DMARC (Domain-based Message Authentication, Reporting and Conformance) -  идентификация сообщений, создание отчётов и определение соответствия по доменному имени — это техническая спецификация, созданная группой...
(Читать полностью...)

Кодировка картинок Base64

Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII.   Алфавит кодирования содержит  латинские символы A-Z, a-z и 0-9 (62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются 4 символами (увеличение на ¹⁄₃). Вот пример. Слева закодированный текст в Base64 - справа его расшифровка. Это конечно здорово, но возникает вопрос Зачем нужна кодировка Base64 Объем данных  увеличивается на 1/3. Да, это как бы делает не читаемым  текстом для человека - но это же просто кодировка. Декодеров полно. А где еще у нас есть двоичные данные? Изображения и картинки! Вот, например самая первая картинка,...
(Читать полностью...)

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

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

Протокол MailTo

Это волшебство, позволяющее одним кликом мышки на сайте написать письмо Вспомним HTML для ссылок MailTo Базовая конструкция HTML для создания ссылки email <a href="mailto:info@mydomen.ru">Напишите нам</a> Вы сразу получаете бланк нового письма с указанными адресом email   Поддерживается расширенный формат - можно дополнительно указывать все остальные параметры письма после знака "?" Тема письма <a href="mailto:info@mydomen.ru?subject=Тестовое письмо">Напишите нам</a> Получатели письма в  копии (и скрытые получатели тоже) <a...
(Читать полностью...)

Форма обратной связи

Рассмотрим самый простой вариант формы обратной связи. Как сделать форму обратной связи на HTML? Вот такую? Работу формы можно посмотреть на сайте www.titovsergei.ru Честный ответ - никак, HTML - это язык разметки (т.е. можно сделать только "скелет" формы), а нам нужны действия с данными. Как минимум нужна связка HTML+PHP. Причем данная связка будет работать только на сервере хостера (где есть поддержка PHP) и не будет работать на локальном ПК (нужна установка как минимум Denwer). Итого наша форма будет в виде связки HTML+PHP. Из Java (на стороне пользователя) только событие onclick для подтверждения отправки формы. Все проверки и обработки происходят на сервере...
(Читать полностью...)

X

    Please prove you are human by selecting the Car.