Отправка писем с вложенными картинками на PHP


Содержание

Отправка писем с помощью PHPMailer

PHPMailer — очень удобная и популярная библиотека для отправки e-mail сообщений с вашего сайта. В этой статье рассказаны основные настройки библиотеки и приведены примеры кода для отправки сообщений. PHPMailer имеет в своем ассортименте пожалуй всё, что можно пожелать от работы с почтой: отправка разными способами, через разные серверы в т.ч. через smtp, возможность шифровать и подписывать ваши письма, чтобы не попадали в спам и многое другое.

Скачать библиотеку PHPMailer можно с https://github.com/PHPMailer/PHPMailer (кнопка «Clone or download»).

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

Отправка писем через функцию mail() с помощью PHPMailer

Если вы хотите отправлять письма со своего хостинга через свой почтовый сервер, то всё довольно просто и будет выглядеть примерно так:

Как видим, всё довольно просто: подключаем библиотеку, заполняем от кого, кому, тему и текст письма и отправляем. Отправка писем таким способом будет работать только с почтовых адресов вашего домена (если только они не привязаны к другим почтовикам).

Отправка писем через SMTP с помощью PHPMailer на примере Yandex и Google

Можно так же отправить письмо через другой почтовик, например, через Яндекс. Код будет выглядеть примерно так:

Отправка писем через Google имеет один нюанс: нужно в аккаунте google разрешить доступ ненадежным приложениям. Для этого нужно зайти в свой аккаунт https://myaccount.google.com, перейти в безопасность, зайти в раздел «Ненадежные приложения, у которых есть доступ к аккаунту» и там переключить в «Разрешено». На момент написания статьи это страница https://myaccount.google.com/u/0/lesssecureapps.

Дальше в php-программе отправка писем через PHPMailer происходит аналогично как через yandex, нужно только заменить настройки SMTP так:

Если первый раз запускаете программу отправки через smtp, тогда желательно перед отправкой дополнительно использовать $mail->SMTPDebug = 1; чтобы получать все сообщения клиента и smtp-сервера, т.е. на экран выведется весь процесс подключения, авторизации и т.д., что очень полезно для отладки вашей программы.

Отправка письма с вложением с помощью PHPMailer

Здесь всё довольно просто, нужно лишь использовать метод addAttachment. Приведу пример, заодно продемонстрировав еще несколько дополнительных возможностей:

Адресов получателей можно добавить несколько с помощью addAddress. Или, если необходимо, можно наоборот, очистить все адреса получателей методом clearAddresses(). Очистить все вложения можно с помощью clearAttachments().

Так же можно использовать AddEmbeddedImage чтобы добавить в письмо вложение (обычно изображения), которое предназначено для использования в html-коде и не будет доступно для скачивания. Пример использования картинки в письме, не доступной для скачивания:

Таким образом, вы можете отправлять письма с изображениями, которые есть только в теле письма, но их нельзя скачать как вложение. Эти изображения можно использовать в любом месте html-кода письма, нужно лишь указывать вместо url-адреса cid изображения, который вы использовали в AddEmbeddedImage.

Отправка подписанного и зашифрованного письма через PHPMailer

По-умолчанию, PHPMailer шифрует все отправляемые письма. Отключить шифрование письма можно только при отправке писем через SMTP использовав код:

Чтобы подписать письмо подписью DKIM, необходимо выполнить несколько действий:

  • Сгенерировать приватный (private) и публичный (public) ключи для вашего домена
  • Добавить DNS-запись для домена типа TXT с публичным ключом
  • Настроить DKIM подпись в PHPMailer перед отправкой письма

Теперь опишу каждый шаг немного подробнее.

Генерация приватного и публичного ключей

Если у вас Linux-хостинг и есть доступ в Shell, то сгенерировать файлы ключей проще простого, нужно выполнить всего 2 команды с обычными правами своего пользователя:

Соответственно, test-private.pem и test-public.pem — это приватный и публичный ключи. Сохранить их нужно в папке, которая будет не доступна посетителям сайта или кому-то еще кроме вас.

Если нет возможности выполнить команды в shell, тогда чтобы сгенерировать приватный (private) и публичный (public) ключи и сохранить их в файлы, можно воспользоваться следующим кодом:

Внимание! Не забудьте убедиться, что папка, в которую будут сохраняться файлы, доступна для записи.

Добавление DNS-записи с публичным ключом

DNS-запись нужна, чтобы почтовые серверы, которые будут получать ваши письма, смогли проверить подпись на письме, прочитав DNS-запись вашего домена. Как правило, DNS-запись можно добавить в панели управления вашим доменом, либо в панели управления хостингом. Если не знаете, как добавить запись, обратитесь в поддержку вашего хостинг-провайдера.

Илон Маск рекомендует:  Анимированая тень с помощью свойства CSS3 text-shadow и javascript

Нужно добавить DNS-запись следующего вида:

Имя записи: mail._domainkey.test.ru. (в конце точка «.»)

TTL: 3600 (или какое будет по-умолчанию)

Тип записи: TXT

Значение: v=DKIM1; h=sha256; t=s; p=ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ

В имени записи test.ru нужно заменить на имя вашего домена. Слова «ВАШ_ПУБЛИЧНЫЙ_КЛЮЧ» вы заменяете на текст, который вы получили на предыдущем шаге после «Public key», без «——BEGIN PUBLIC KEY——» и «——END PUBLIC KEY——«, только сам ключ. При этом все строчки ключа нужно соединить в одну длинную строку, чтобы переводов строки не было.

Настройка подписи DKIM в PHPMailer и отправка письма

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

Разумеется, test.ru вы должны поменять на имя своего домена, а test-private.pem на полный путь и имя файла приватного ключа, который был создан на этапе генерации ключей.

Теперь, ваши письма, отправляемые через PHPMailer будут подписаны подписью DKIM вашим приватным ключом.

Формы, часть 4, «Форма отправки писем со вложениями»

12 ноября 2009 28 Рубрика: PHP

« Предыдущая запись
+7 AJAX галерей для jQuery
Следующая запись »
Как прижимать футер к низу страницы

В некоторых, не очень частых случаях, требуется отправлять с сервера письмо со вложением: например какая-то рассылка, или отправка каких-то прайсов, или ещё что. Иными словами нам нужно поле, которое бы позволяло прикрепить файл к письму. Сейчас мы и посмотрим как это делается.

Возьмём для начала ту форму, что мы сделали ранее в статье Формы, часть 2, “Проверка формы на PHP”. Прежде всего подправим html-код, поместив после поля сообщения следующий код:

А также не забываем тегу form прописать свойство:

Отправка писем на php. Сборник рецептов

Отправка писем в php осуществляется с помощью функции mail()

to — емайл получателя
subject — заголовок письма
message — текст письма, сообщение
mailheaders — почтовые заголовки

Отправка обычного текстового письма

Это самый простой способ отправки писем. Вы просто указываете емайл получателя, отправителя и формат text/plain в заголовке. Далее идет пример

Отправка html-письма, в которое можно вставлять таблицы, рисунки, различные шрифты, стили оформления

Отправка писем в html формате почти ничем не отличается от отправки писем в текстовом формате. В заголовке вы указываете формат письма text/html а в самом письме вместо обычного текста помещаете html-код.

Рассмотрим на примере

Отправка письма с вложением

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

Отправка писем сразу нескольким адресатам

Чтобы отправить письмо сразу нескольким адресатам, лучше всего использовать заголовок Bcc: который отправляет копию письма на указанный емайл

Snip Code

Отправка почты с вложением файла (картинки) на PHP

Задача: отправить письмо и вложить к него картинку (файл).

Решение

$to = array ( ‘Вася Иванов’ , ‘ivanov@gmail.com’ ) ; // кому отправляем
$subject = ‘Тема письма’ ; // Тема письма
$from = array ( «SnipCode» , «snipcode@snipcode.ru» ) ; // От кого отправляем

// Формируем заголовок
$random_hash = md5 ( date ( ‘r’ , time ( ) ) ) ;
$mime_boundary = «==Multipart_Boundary_x<$random_hash>x» ;
$headers = ‘MIME-Version: 1.0’ . » \r \n » ;
$headers .= ‘Content-Type: multipart/mixed; boundary=»‘ . $mime_boundary . ‘»‘ . » \r \n » ;
$headers .= ‘To: ‘ . $to [ 0 ] . ‘ . $to [ 1 ] . ‘>’ . » \r \n » ;
$headers .= ‘From: ‘ . $from [ 0 ] . ‘ . $from [ 1 ] . ‘>’ . » \r \n » ;

$message = «— <$mime_boundary>\n » .
«Content-Type:text/html; charset= \» utf-8 \» \n » .
«Content-Transfer-Encoding: 7bit \n \n » ;
// Тут текст письма. Может содержать html теги
$message .= ‘Привет Вася я прислал тебе картинку!’ . » \n \n » ;

$fileatt = ‘image.jpg’ ; // путь к файлу, который хотим отправить
$fileatt_type = «application/octet-stream» ;
$fileatt_name = ‘image_for_you.jpg’ ; // Имя файла, которое увидит получатель

// Читаем вложенный файл
$file = fopen ( $fileatt , ‘rb’ ) ;
$data = fread ( $file , filesize ( $fileatt ) ) ;
fclose ( $file ) ;

$data = chunk_split ( base64_encode ( $data ) ) ; // Кодируем наш файлик

// Вкладываем файл в письмо
$message .= «— <$mime_boundary>\n » .
«Content-Type: <$fileatt_type>; \n » .
» name= \» <$fileatt_name>\» \n » .
«Content-Transfer-Encoding: base64 \n \n » .
$data . » \n \n » .
«— <$mime_boundary>\n » ;
unset ( $data ) ;
unset ( $file ) ;
unset ( $fileatt ) ;
unset ( $fileatt_type ) ;
unset ( $fileatt_name ) ;

// отправляем письмо
mail ( $to [ 1 ] , $subject , $message , $headers ) ;
?>

Все комментарии в коде. Если есть вопросы, ниже форма для комментариев.

Отправка писем с вложенными картинками на PHP

Наверняка Вам приходилось отправлять почту из php? И наверняка зачастую хотелось присобачить какие-нить файлы, показать картинку?
Окей. Сейчас расскажу немножко про отправку почты и один интерессный класс — mail_mime.

Первая часть — обычное письмо.

Самый простой способ отправить письмо при помощи PHP — воспользоваться стандартной функцией mail.
Она имеет следующий синтаксис:
mail(email , тема , сообщение , дополнительные заголовки, дополнительные параметры)
вернет true, если письмо было принято к доставке (не означает что доставлено).

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

Илон Маск рекомендует:  Что такое код mb_language

Но вместо сообщения у получателя скорее всего отобразятся иероглифы =(

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

Теперь текст сообщения должен отобразиться нормально. НО тема письма всё равно останется в кракозябрах =(
Дело в том, что тема письма должна быть записана следующим образом:
=? ?B? ?=

Изменим наш код с учётом этого:

Теперь всё должно отобразиться корректно.

Теперь про mail_mime.

Для начала, скачайте последнюю версию и распакуйте к себе на сайт в папку Mail.
Далее привожу пример использования:

Что бы теперь отобразить саму картинку в html версии письма, достаточно прописать:

На этом пока что всё. Надеюсь будет полезно.

В этой статье хочу рассказать о том, как отправлять почту с вложениями стандартными средствами PHP

Статья написана очень давно — 06.06.2010

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

Начнем с азов. Отправка почты в php выполняется с помощью функции mail:

В простейшем виде это выглядит так:

Если результатом работы вышепреведенного скрипта будет ошибка, значит в вашей сборке PHP нет поддержки mail, советую обратиться к администратору.

Теперь разберёмся с дополнительными заголовками. Что вообще такое, заголовок письма? Это, согласно стандарту RFC-822, одна из частей электронного письма. То есть, письмо состоит из заголовков и тела (также и из «конверта», но это нам сейчас не нужно). Заголовок всегда находится перед телом и отделен от него пустой строкой. Заголовок состоит из имени и содержания, разделённых двоеточием. Между собой заголовки разделяются так: каждый заголовок начинается с новой строки. Но, лучше смотреть на примере:

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

Отправка письма в HTML-формате

Большинству задач вышеприведённого скрипта отправки mail`ов хватает, но мы пойдём дальше, и научимся отправлять письма в HTML-формате. В этом также нет ничего сложного:

Обратите внимание! После каждого заголовка стоит конструкция \r\n — это так обозначается перенос строки. А тот перенос, что вы видите — это обычное выравнивание, дабы удобно было читать код. Т.е. смело можно написать так:

И ещё обратите внимание на то, что escape-последовательности (а именно так называются конструкции вида \r\n) работают только с двойными кавычками!
Что же нового в этом скрипте? Ну, во-первых, мы в заголовках указали тип содержимого (HTML) и кодировку. Во-вторых, просто в теле написали нужный нам html-код. Всё просто!

Отправка писем с вложениями

Вот мы вплотную подошли к отправке писем на php с вложениями.

Всё сложно? Неправда, давайте разбираться. Для начала, мы создали уникальный идентификатор $un, с его помощью мы сможем разделять между собой вложенные файлы, а также тело письма. Далее, мы читаем содержимое подключаемого файла и заносим его в переменную $file.

Но как происходит отправка? В заголовках мы указываем тип содержимого и наш уникальный разделитель (Content-Type: multipart/alternative;boundary=\»———-«.$un.»\»). А в теле письма, разделяя разделителем, пишем сначала текст, потом вложенный файл:

Пишем, естественно, с указанием типа содержимого (Content-Type) и типа конвертации (Content-Transfer-Encoding).
chunk_split(base64_encode($file)) — это и есть вложение нашего файла (помните, мы в переменную $file внесли содержимое?), предварительно его конвертировав в base64

Готовая функция отправки почты с вложением

Если терпеливый читатель дочитал до этого места, то вот универсальная функция отправки почты с вложением:

С полученными знаниями, Вы без труда разберетесь в работе этой функции. Надеюсь, она Вам пригодится!

Отправка письма в HTML формате с картинками

Хотел написать этот раздел сразу после «Отправки письма в HTML-формате», и это было бы логично. Но. Раздел бы получился очень громоздким, а пользуясь функцией, которую я описал выше, можно легко передавать письма в формате HTML да ещё и с картинками. Скажу лишь о том, что сами картинки должны являтся частью html кода, а вместо ссылок на них — использоваться cid — идентификаторы

Вот мы и разобрали, как с помощью простого php отправлять e-mail`ы, отправлять в HTML-формате, отправлять с вложениями. Удачи!

Получение почты через IMAP в PHP

В PHP без проблем можно работать с почтой через IMAP, для этого есть все необходимые функции, подробнее на php.net.

Получение писем

Принцип работы следующий:

$imap = imap_open(«адрес», «e-mail», «пароль») – создает подключение к почтовому ящику. Далее, функция imap_search($imap, ‘ALL’) получает массив c индикаторами писем.

ALL Все сообщения
UNSEEN Непрочитанные сообщения
SEEN Прочтенные сообщения (установлен флаг seen)
NEW Новые сообщения (впервые появилось в ящике в ходе текущей сессии)
OLD Старые сообщения
ANSWERED Сообщения с флагом answered (отвеченный)
UNANSWERED Неотвеченные сообщения
DELETED Удаленные сообщения
UNDELETED Не удаленные сообщения
FLAGGED Сообщения с установленным флагом flagged (важное)
RECENT Сообщения с флагом recent (недавнее сообщение)
UNFLAGGED Сообщения без установленных флагов
ON «date» Сообщения с датой, равной « date »
BEFORE «date» Сообщения с датой, до « date »
SINCE «date» Сообщения с датой, после « date »
FROM «string» Сообщения в поле From: которых присутствует «string »
TO «string» Сообщения в поле To: которых присутствует «string »
SUBJECT «string» Сообщения, у которых присутствует «string » в поле Subject
BODY «string» Сообщения содержащие «string » в теле
TEXT «string» Сообщения с текстом «string »
KEYWORD «string» Сообщения с ключевым словом «string»
UNKEYWORD «string» Сообщения, не имеющие ключевого слова «string »
Илон Маск рекомендует:  Borland delphi 4 0 для начинающих библиотеки типов

Далее массив обрабатывается в цикле, в примере происходит обход по всем письмам.

Как видно в примере, тема письма и другие данные закодированы в base64 ( ?UTF-8?B?SGVsbyBXb3JsZA==?= ), декодировать их можно с помощью функции mb_decode_mimeheader() .

$body = imap_body($imap, $num) – тело письма, обычный текст.

Может быть закодировано в quoted-printable (= D0=94=D0=BE=D0=B1=D1=80=D1=8B=D0=B9 ), раскодировать можно функцией quoted_printable_decode() .

Установка флагов

imap_setflag_full ($imap, $num, $flag) – установит письму флаг, возможны значения:

seen Сообщение прочитано
answered На сообщение отправлен ответ
flagged Сообщение отмечено как «важное»
deleted Сообщение отмечено как удалённое
draft Сообщение отмечено как черновик
recent Недавнее сообщение

Можно установить сразу несколько флагов, разделяя их пробелами.

В примере, письмам, у которых в теме письма есть слово «заявка» устанавливается флаг «важное».

Удаление писем

В цикле, письмо помечается функцией imap_delete() , после этого вызывается функция imap_expunge() , которая выполняет удаление всех помеченных писем.

Отправка почты в PHP с вложениями

Добрый день дорогие читатели блога pyrko.com.ua !

Отправка почты в PHP с вложениями


Сегодня мы расмотримп ример полностью рабочей самописной функции отправки писем, с вложениями на PHP:

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

  • $charset — кодировка письма, строковый тип данных. Примеры кодировок: windows-1251, koi8-r, utf-8.
  • $to — получатели, их ящики, также строковый тип данных.
  • $from — отправитель, от кого письмо придет получателям, строка.
  • $subject — тема письма, строкового типа данных.
  • $message — текст сообщения, тело письма. Может содержать как простой текст, так и разметку на HTML.
  • $files — массив с файлами. Пример: array(‘text.txt’, ‘readme.md’, ‘archive.zip’); .

Коды ошибок, которые возвращает моя самописная функция:

  • -1 — все в порядке, письмо отправлено по назначению.
  • 0 — какого-то из файлов или файла не существует.
  • 1 — файл(ы) не удалось открыть по каким-то причинам.
  • 2 — по неизвестным причинам письмо отправить не получилось.

maziukwork / send_mail.php

/*
* Отправка письма с несколькими вложениями.
* @param: email — string (адрес получателя)
* @param: subject — string (тема письма)
* @param: message — string (тело документа с html тегами)
* @param: from — string (подсталяется в поле от кого)
* @param: files — array (массив с файлами)
* Array
* (
* [0] => Array
* (
* [name] => filename.jpg
* [type] => image/jpeg
* [tmp_name] => /var/www/patch/mod-tmp/php8c4Gy0
* [error] => 0
* [size] => 0
* )
*
* [1] => Array
* (
* .
* )
* )
*
* @return: bool (результат работы ф-ции mail)
*/
private function send_mail ( $email , $subject , $message , $from , $files ) <
$headers = ‘ ‘ ;
$EOL = » \n » ; // ограничитель строк, некоторые почтовые сервера требуют \n — подобрать опытным путём
$boundary = » — » . md5 ( uniqid ( time ())); // строка разделитель.
$filepart = ‘ ‘ ;
// Заголовки.
$headers .= » MIME-Version: 1.0; $EOL » ;
$headers .= » Content-Type: multipart/mixed; boundary= \» $boundary \» $EOL » ;
$headers .= » From: $from » . $EOL ;
$multipart = » — $boundary$EOL » ;
$multipart .= » Content-Type: text/html; charset=UTF-8 $EOL » ;
$multipart .= » Content-Transfer-Encoding: base64 $EOL » ;
$multipart .= $EOL ; // раздел между заголовками и телом html-части
$multipart .= chunk_split ( base64_encode ( $message ));
/*
* Работа с файлами.
*/
if ( ! empty ( $files )) <
foreach ( $files as $key => $filesData ) <
$path = $filesData [ ‘ tmp_name ‘ ];
if ( $path ) <
$fp = fopen ( $path , » rb » );
if ( ! $fp ) <
print » Cannot open file » ;
exit ();
>
$file = fread ( $fp , filesize ( $path ));
fclose ( $fp );
$name = $filesData [ ‘ name ‘ ];
$filetype = $filesData [ ‘ type ‘ ];
$filepart .= » $EOL — $boundary$EOL » ;
$filepart .= » Content-Disposition: attachment; filename= \» $name \» $EOL » ;
$filepart .= » Content-Type: $filetype ; name= \» $name \» $EOL » ;
$filepart .= » Content-Transfer-Encoding: base64 $EOL » ;
$filepart .= $EOL ; // разделитель между заголовками и телом прикрепленного файла
$filepart .= chunk_split ( base64_encode ( $file ));
>
>
>
// Добавляем в письмо файлы, если есть.
$filepart .= » $EOL — $boundary — $EOL » ;
$multipart .= $filepart ;
// Отправляем письмо.
if ( mail ( $email , $subject , $multipart , $headers )) return true ;
return false ;
>
  • © 2020 GitHub , Inc.
  • Terms
  • Privacy
  • Security
  • Status
  • Help

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Отправить картинку по email PHP

PHPMailer очень функциональный класс для отправки электронных писем средствами PHP.

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

На момент написания этой заметки актуальная версия PHPMailer 5.2.4.

Страница проекта на Google Code: PHPMailer.

UPD (10.11.14): Прошло много времени, проект переехал на гит: PHPMailer.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL