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

Данный код отправляет письмо в кодировке UTF-8 функцией mb_send_mail(), поэтому предварительно нужно настроить mbstring:

mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');
mb_language('uni');
 
date_default_timezone_set('Europe/Moscow');
header('Content-type: text/html; charset=utf-8');
PHP

Кодировка файла .php должна быть UTF-8 без BOM.

// Кому.
$to = '=?UTF-8?B?' . base64_encode('Вася Пупкин') . '?= <site@site.com>';
 
// От кого.
$from = '=?UTF-8?B?' . base64_encode('Иван Петров') . '?= <support@snipp.ru>';
 
$subject = 'Тема письма';
$body    = 'Текст письма';
 
// Массив с файлами.
$files = array(
	__DIR__ . '/logo.png',
	__DIR__ . '/image.png',
);
 
$boundary = md5(uniqid(time()));
 
// Формирование заголовка письма.
$headers = array(
	'Content-Type: multipart/mixed; boundary="' . $boundary . '"',
	'Content-Transfer-Encoding: 7bit',
	'MIME-Version: 1.0',
	'From: ' . $from,
	'Date: ' . date('r')
);
 
// Формирование текста письма.
$message = array(
	'--' . $boundary,
	'Content-Type: text/html; charset=UTF-8',
	'Content-Transfer-Encoding: base64',
	'',
	chunk_split(base64_encode($body))
);
 
// Формирование файлов.
foreach ($files as $row) {
	if (is_file($row)) {
		$name = basename($row);
		$fp   = fopen($row, 'rb');
		$file = fread($fp, filesize($row));
		fclose($fp);
 
		$message[] =  '';
		$message[] =  '--' . $boundary;
		$message[] = 'Content-Type: application/octet-stream; name="' . $name . '"';
		$message[] = 'Content-Transfer-Encoding: base64';
		$message[] = 'Content-Disposition: attachment; filename="' . $name . '"';
		$message[] = '';
		$message[] = chunk_split(base64_encode($file));
	}
}
 
$message[] = '';
$message[] = "--" . $boundary . '--';
 
$headers = implode("\r\n", $headers);
$message = implode("\r\n", $message);
 
// Отправка.
mb_send_mail($to, $subject, $message, $headers);
PHP

Максимальный размер вложенных файлов

  • Яндекс – 25 Мб.
  • Mail.ru – 25 Мб.
  • Gmail – 25 Мб.
  • Rambler – 20 Мб.

Письма не приходят на Mail.ru

Причина этого в том что Mail.ru принял политику безопасности DMARC – https://corp.mail.ru/ru/press/releases/9593/

Это происходит когда в адресе «от кого» указан почтовый ящик @mail.ru (также inbox.ru, list.ru, bk.ru).

Если письмо отправляется от Яндекса, Gmail и т.д. такой проблемы нет. Если письмо отправляется от своего домена то в нем нужно настроить SPF и DKIM записи.

Письма не приходят на Яндекс

Проблема возникает если в заголовках письма есть следующее записи:

Reply-To: mail@site.com
Return-Path: mail@site.com
17.11.2016, обновлено 19.09.2019 1876
Предыдущая запись Когда обновляются DNS сервера?
Следующая запись PHP класс для отправки E-mail

Поделится

Темы

E-mail PHP

Другие публикации

Список почтовых серверов популярных хостингов и бесплатных сервисов для настройки почтовых клиентов и скриптов отправки...
09.09.2019 116
Ниже приведён список MIME-заголовков и расширений файлов.
11.07.2019 297
Примеры как зарегистрировать бота в Телеграм, описание и взаимодействие с основными методами API.
17.11.2018 8185
Изображения нужно сжимать для ускорения скорости загрузки сайта, но как это сделать? На многих хостингах нет...
26.10.2018 2094
К сожалению разработчики прекратили поддержку и разработку проекта, но PHPExcel все равно остается популярной...
12.06.2019 2456