Php_libmail 2.11

Отправка почты на внешние SMTP сервера

Это нужно в том случае, если у вас почта на Яндекс, Mail.ru, Gmail и так далее, и вы хотите от её имени отправлять почту с хостинга.

Если у вас VDS или сервер, вы может использовать прямое подключение к SMTP серверам этих служб. Если оно не работает, возможно, вам нужно
обратится в поддержку для того, чтобы вам открыли нужные порты, это бесплатно.

Если вы хотите настроить такую отправку с сайта, то посмотрите раздел личного кабинета «Отправка почты на внешние SMTP сервера». Там вы сможете
зарегистрировать доступ к нужным вам внешним SMTP серверам. Потребуется аренда своего IP, который нужен, чтобы соседи по хостингу не мешали вам
в доступе к этим серверам, вызывая блокировки. Это стоит около 100-200 рублей в месяц (зависит от периода оплаты), нужно добавить в тариф.
Можно воспользоваться IP адресом услуги «SSL / HTTPS, выделенный IP адрес», если она уже есть.

Общая идея отправки писем с сайта

Если отправляете через хостинг, обратный адрес письма (поле FROM) должен быть зарегистрированным ящиком
или псевдонимом на нашем хостинге (направление пересылки не важно). Иначе письмо не дойдет.

Если вы хотите отправлять почту с сайта напрямую через внешние службы почты, типа Яндекс, Mail.ru, и так далее,
посмотрите раздел личного кабинета «Отправка почты на внешние SMTP сервера»

Потребуется аренда своего IP.

Если вы хотите отправлять почту с VDS или сервера напрямую, обратитесь в поддержку для открытия порта 25.

Примеры для популярных языков программирования приведены далее.

Для PHP работает стандартная функция mail(), ничего настраивать не нужно, кроме обратного адреса по схеме выше.

Для других языков программирования или систем, нужно использовать SMTP сервер robots.1gb.ru, порт 25, без авторизации.

Использовать SMTP сервера ящиков хостинга нельзя. Обычные почтовые сервера хостинга — только для людей.

Почтовая программа. Отправка почты на PHP

В двух предыдущих статьях мы настроили сервер и домен для дальнейшей отправки почты. Пришло время написать простую программу, которая и будет осуществлять рассылку. Поскольку реализуем мы все под веб-сервер, то писать скрипт будем на PHP.

Отправить письмо с сервера можно 3-я способами:

  • через функцию mail() — самый простой и менее надежный вариант, его рассматривать не будем, кого интересует данный вид отправки, можете почитать в документации PHP;
  • через SMTP-сервер, как собственный, так и сторонний — самый оптимальный вид отправки сообщений, его подробнее и рассмотрим в данной статье;
  • через сторонние сервисы, такие как Amazon, Mandrill, Mailgun и прочее — хорошее и простое решения, но зачастую использование подобных серверов, может оказаться дороже собственного сервера. Подробнее рассмотрим в другой статье.

Для отправки письма через SMTP-сервер необходимо:

  • данные для доступа к SMTP-серверу;
  • e-mail получателя;
  • письмо и его заголовок;
  • системные заголовки.

С электронным адресом получателя, текстом письма и его заголовком, проблем нету. Данные для доступа мы имеем, обычно это хост, порт и пара логин/пароль. Остается составить системные заголовки, в них то и кроется вся сложность исходной задачи.

Создание системных заголовков

Рассмотрим основной набор заголовков, которое должно иметь письмо претендующее на попадание в папку «Входящие»:

  • Date— дата отправки;
  • Subject— заголовок сообщения перекодированный в base64, чтобы избежать проблем с кодировкой;
  • Reply-To — имя и e-mail для ответа;
  • MIME-Version— версия MIME-стандарта;
  • Content-Type — тип письма и его кодировка, тип письма обычно указывается html либо plain (текстовая версия);
  • Content-Transfer-Encoding — тип конвертации, обычно используется «8bit»;
  • From— имя и e-mail отправителя;
  • To— имя и e-mail получателя;
  • Message-ID — id сообщения в вашей системе;
  • Errors-To — e-mail, куда будут отправлена информация о возникших ошибках;
  • X-Complaints-To — e-mail, куда будут отправлена информация о возникших жалобах;
  • X-Sender — e-mail системного отправителя;
  • List-Unsubscribe — здесь указывается ссылка или e-mail для отписки;
  • List-id — id текущей рассылки, для статистики;
  • Precedence— этот заголовок необходим в случае массовой рассылки, значение ставится bulk.

Класс для отправки почты на PHP

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

Обратный адрес почты ваших писем

Последнее время набирает популярность технология DMARC, которая описана, например, тут:https://habrahabr.ru/company/mailru/blog/282602/.

Краткая суть в том, что если у вас есть обратный адрес в домене mail.ru (как пример), то отправлять почту вы можете ТОЛЬКО с использованием серверов mail.ru,
иначе ваша почта будет жестко считаться спамом. К сожалению, ни хостинг, ни mail.ru не предлагает никаких средств отправки почты из сайта
с помощью SMTP сервера mail.ru, это не будет нормально работать по множеству разных причин на обоих сторонах.
Это относится не только к mail.ru, провайдер приведен просто как пример.

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

Создаем форму отправки данных в html

На этом этапе нужно создать файл form.php, в него добавить html код формы. Подробности о каждом элементе формы читайте в статье Как сделать форму в HTML для сайта.

Первая строка будет следующей

Вернемся к форме. Вторая строка будет содержать поле для ввода ФИО. Имеет следующий код:

Тип формы text, то есть пользователь сможет ввести или скопировать сюда текст с клавиатуры. Под параметром name содержится название формы. В данном случае это fio, именно под таким именем будет передаваться все, что пользователь введен в данноу поле. Параметр placeholder указывает на то, что будет записано в этом поле в виде пояснения.

Следующая строка:

Следующей строкой будет кнопка «отправить»:

И последней строкой в форме будет тэг </form>

Теперь соберем все вместе.

Теперь сделаем так, чтобы поля в форме стали обязательными для заполнения. Имеем следующий код:

Как корректно отправить письмо в php в кодировке UTF-8

20 декабря 2011
zabey

Что делать, если стандартная функция php mail() отправляет письма в неверной кодировке.

На самом деле она отправляет что дают и совершенно ничего не проверяет. Что же делать?

Немного теории:

 И практика:

Ниже приведен пример простой функции, которая отправляет в требуемой кодировке MIME-совместимые письма на русском языке в виде простого текста или в формате HTML

PHP

<?php

return mail($to, $subject, $body, $headers);
}

function mime_header_encode($str, $data_charset, $send_charset) {
if($data_charset != $send_charset) {
$str = iconv($data_charset, $send_charset, $str);
}
return ‘=?’ . $send_charset . ‘?B?’ . base64_encode($str) . ‘?=’;
}

?>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

<?php
 

functionsend_mime_mail($name_from,// имя отправителя

$email_from,// email отправителя

$name_to,// имя получателя

$email_to,// email получателя

$data_charset,// кодировка переданных данных

$send_charset,// кодировка письма

$subject,// тема письма

$body,// текст письма

$html=FALSE// письмо в виде html или обычного текста

){

$to=mime_header_encode($name_to,$data_charset,$send_charset)

.’ <‘.$email_to.’>’;

$subject=mime_header_encode($subject,$data_charset,$send_charset);

$from=mime_header_encode($name_from,$data_charset,$send_charset)

.’ <‘.$email_from.’>’;

if($data_charset!=$send_charset){

$body=iconv($data_charset,$send_charset,$body);

}

$headers=»From: $from\r\n»;

$type=($html)?’html»plain’;

$headers.=»Content-type: text/$type; charset=$send_charset\r\n»;

$headers.=»Mime-Version: 1.0\r\n»;

returnmail($to,$subject,$body,$headers);

}
 

functionmime_header_encode($str,$data_charset,$send_charset){

if($data_charset!=$send_charset){

$str=iconv($data_charset,$send_charset,$str);

}

return’=?’.$send_charset.’?B?’.base64_encode($str).’?=’;

}
 
?>

Здесь используется еще и вспомогательная функция mime_header_encode() для преобразования каждого заголовка в MIME-совместимый формат. В PHP предусмотрена аналогичная функция mb_encode_mimeheader(), но она не всегда работает некорректно (возвращает неверный результат) и лучше перестраховаться.

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

PHP

<?php
send_mime_mail(‘Backnet’,
[email protected]’,
‘Получатель письма’,
[email protected]’,
‘CP1251’, // кодировка, в которой находятся передаваемые строки
‘KOI8-R’, // кодировка, в которой будет отправлено письмо
‘Письмо-уведомление’,
«Здравствуйте, заходите к нам еще!»);
?>

1
2
3
4
5
6
7
8
9
10

<?php

send_mime_mail(‘Backnet’,

[email protected]’,

‘Получатель письма’,

[email protected]’,

‘CP1251’,// кодировка, в которой находятся передаваемые строки

‘KOI8-R’,// кодировка, в которой будет отправлено письмо

‘Письмо-уведомление’,

«Здравствуйте, заходите к нам еще!»);

?>

Categories: PHP decode, encode, header, mail, utf-8

phMailer

phMailer – это очень простой PHP скрипт обратной связи, который поддерживает функцию прикрепления файла (attachments) благодаря встроенной mail() function языка PHP.

Одной из самых востребованных функций на сайте является форма заявки или заказа, данные из которой отправляются на почту владельцу сайта. Как правило такие формы являются простыми и состоят из двух трех полей для ввода данных. Как же создать такую форму заказа? Здесь потребуется использование языка разметки HTML и языка программирования PHP.

Язык разметки HTML сам по себе несложен, нужно всего лишь разобраться в том как и где ставить те или иные теги. С языком программирования PHP все немного сложнее.

Для программиста создать такую форму не составит труда, а вот HTML верстальщику может показаться сложным некоторые действия.

Что может PHPMailer

На момент написания этого обучающего курса PHP Mailer умел:

  • посылать письма с множественными: адресатами (TO), копиями (CC), BCC и REPLY-TO;
  • избыточные SMTP серверы;
  • многослойные/альтернативные сообщения для клиентов, которые не могут читать HTML письма;
  • поддержка 8 бит, base64, бинарного режима, и пригодного для печати формата;
  • Использовать все теже самые методы, что и популярный AspEmail активный сервер (COM);
  • авторизация SMTP;
  • перенос слов (word wrap);
  • сообщения в виде HTML;
  • библиотека проверена на множестве SMTP серверах: Sendmail, qmail, Postfix, Imail, Exchange, Mercury, Courier;
  • работает на любой win32 и *nix платформе;
  • гибкость отладки;
  • определяемые вручную заголовки писем;
  • совмещение нескольких сообщений и вложений;
  • встроенная поддержка изображений.

Работаем с телом письма

Продолжаем постепенно формировать наш массив с обработанными данными письма и теперь для получения тела нам необходимо воспользоваться двумя функциями:

В первой переменной $msg_structure находится структура письма – это объект, в котором можно найти массу полезной информации, пример части этого объекта представлен ниже:

Что важно для решения нашей задачи:

  • type – первичный тип тела письма, в зависимости от того, что к нам приходит на почту он может меняться от 0 до 7 (каждой цифре советует свой вид контента который находиться в теле письма);
  • encoding – кодировка трансфера тела, меняется от 0 до 5 (0 — 7BIT, 1 — 8BIT, 2 – BINARY, 3 — BASE64, 4 — QUOTED-PRINTABLE, 5 — OTHER);
  • parts – массив частей письма, который соответствует структуре объекта уровнем выше.

Немного подробнее рассмотрим свойство parts. Первое, что нужно сказать это то, что в нулевой ячейке этого массива находиться информация, соответствующая именно тексту письма, а начиная с первого – вложенным файлам. Также в каждом объекте указывается type и в parameters кодировка в явном и в не явном виде.

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

Вторая функция imap_fetchbody() извлекает определённую часть письма, чаще всего в закодированном виде.

Теперь добавим переменную, в которую будем сохранять обработанную версию тела письма:

Вернёмся в файл functions.php и напишем рекурсивную функцию:

Функция recursive_search() принимает один параметр – структуру письма, где последовательно проверяет свойства и достает три параметра: encoding, charset, subtype. Точкой выхода из рекурсии является отсутствие свойства parts с нулевой ячейкой. Больше пояснять тут особо нечего, из кода я думаю понятно, что и как происходит.

Добавим ещё одну функцию для переконвертации тела письма, которая нам потребуется в дальнейшем:

Двигаемся дальше и возвращаемся в файл index.php, где пишем следующий код:

После того, как мы получили данные из рекурсии, постепенно проверяем кодировку трансфера и, в зависимости от этого, вызываем функцию structure_encoding() с соответствующими параметрами. В последнем условном операторе учитываем, то, что мы работает в UTF-8 и если после всех манипуляций у нас получится отличное от кодировки, перекодируем.

Осталось подвести черту:

В теле письма может оказаться, как и обычный текст, так и HTML разметка со своими стилями. Кодируем в BASE64, чтобы при визуализации не поехала уже наша верстка.

Указать получателя или отправителя письма в свойствах элемента Отправить email

Выбрать отправителя письма

Значением поля От является почтовый ящик. Вы можете выбрать любой из почтовых ящиков, синхронизированных с приложением Creatio, т. е. любой почтовый адрес c логином и паролем, зарегистрированный в Creatio. Например, можно настроить отдельный “Почтовый ящик для отправки подтверждения о регистрации”, чтобы отправлять уведомления в ходе бизнес-процесса, а затем указать его в поле От (Рис. 19).

Рис. 19 — Выбор почтового ящика

На заметку. Для работы с почтой в Creatio должна быть выполнена интеграция с почтовым провайдером. Убедитесь, что все пользователи, которые должны запускать процесс, имеют права доступа к почтовому ящику, указанному в поле От. Подробнее: Настроить права доступа на запись.

Дополнительно в поле От вы можете передать любой параметр процесса, значение которого выбирается из справочника Настройки синхронизации с почтой. Подробнее: Параметры процесса.

Выбрать получателя письма

В поле Кому вы можете указать получателей следующими способами:

Вручную. Например, “[email protected]

Обратите внимание, указать несколько адресов в одном поле невозможно. Для добавления еще одного получателя нажмите + и введите новый адрес в появившемся поле.

Передать параметр справочного типа, который использует справочник Контакт или Контрагент

Для этого нажмите кнопку в поле Кому и выберите Контакт/Контрагент —> “Параметр процесса”. Например, можно выбрать параметр Контакт, из предшествующего шага процесса “Встреча” (Рис. 20). Электронный адрес будет получен с детали Средства связи страницы контакта.

Рис. 20— Выбор параметра Контакт из элемента процесса “Встреча”

Выбрать определенный контакт или контрагента. Для этого нажмите кнопку в поле Кому и выберите Контакт/Контрагент —> “Значение справочника” . Затем выберите нужный контакт или контрагента из списка.

Длинные строки в письмах («письмо обрезается» итд)

Часто допускаемой ошибкой является создание сообщений с большой длиной строк. Такие сообщения могут доходить в искаженном или обрезанном виде.
Особенно часто это правило нарушается при некорректном создании HTML сообщений — перенос строк там кодируется символами <br>, таким образом,
символы переноса строк в исходном тексте сообщения могут вообще отсутствовать.

Помните, что по MIME и RFC стандартам, которые используются для передачи почтового сообщения, длина строки сообщения не может превышать 80 символов
(ориентировочно). Вам необходимо вставлять переносы строк искусственно, если ваше сообщение содержит длинные строки.

Это относится к кодировке сообщения 8bit, когда тело сообщения передается без кодировки.
В том случае, если тело сообщения кодируется (например, base64), длина итоговых строк может быть любой, но длина строки, используемый для передачи сообщения
(т.е. содержащая данные в base64) опять же не может превышать 80 символов.

Отправить email вручную

Рис. 1 — Процесс проведения встречи

Пример. В ходе процесса необходимо отправить письмо с протоколом встречи клиенту. Для этого нужно отобразить для пользователя страницу редактирования письма, где можно добавить вложение и выполнить отправку.

    1. Чтобы письмо было отправлено с корпоративного почтового ящика, в поле От кого выберите пункт меню Значения справочника. На открывшейся странице выбора значения укажите учетную запись корпоративного почтового ящика. Если поле От кого оставить незаполненным, то ответственный сотрудник будет должен на странице редактирования email-сообщения в поле От кого указать email-адрес, с которого будет отправлено письмо.
    2. Если необходимо отправить копии протокола нескольким контактам, то нажмите кнопку и добавьте поля Копия и Скрытая копия. В появившихся полях укажите контакты, которым необходимо отправить копии протокола.

    3. В поле Какое сообщение отправить укажите способ формирования контента “Письмо пользователя”.

  1. Подготовьте письмо.

    1. В области тела письма нажмите кнопку .

    2. В открывшемся дизайнере контента сформируйте письмо.

    3. Сохраните изменения.

    4. В поле Тема введите тему письма, например, “Протокол встречи”.

    5. В поле Контрагент блока Связи активности укажите контрагента из активности “Провести встречу”. Для этого кликните в области поля и выберите пункт “Параметр процесса” в меню значений параметра. В окне выбора параметра выделите элемент “Провести встречу” и его параметр Контрагент. Отправленное сообщение отобразится на вкладке История контрагента, с которым проводилась встреча.

В результате при выполнении процесса откроется страница письма, на которой можно внести необходимые изменения и добавить протокол встречи (Рис. 4).

Обработка шапки письма

Для получения шапки письма необходимо воспользоваться функцией imap_header(), вторым параметром которой являет номер письма:

На данном этапе мы получим объект, из которого и будем вытягивать нужные нам данные, сохраняя в массив $mails_data. Вот пример одного из писем:

На этом скриншоте видно, что все данные дублируются, но это особой роли не играет, тянем, то, что удобнее. Намного важнее — кодировка темы письма. Она может быть какой угодно и этот момент надо контролировать. Такая же ситуация и с телом письма и с вложенными файлами.

Названия говорящие и, я думаю, стоит пояснить только последнюю функцию. Она принимает закодированную строку и при помощи imap_mime_header_decode() декодирует ее, в результате чего возвращается массив объектов, у каждого из которых есть два свойства charset (кодировка) и text (текст темы). Дальше всё просто: в цикле проверяя кодировку, приводим к UTF-8 и склеиваем тему в единый заголовок и возвращаем его.

Теперь вернёмся в файл index.php и вытянем последний параметр:

На этом обработка шапки письма будет завершена.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: