PHP

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

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

<?php
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 должна быть UTF-8 без BOM.

<?php
// Кому.
$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);

UPDATE: Исправлена ошибка в PHP 5.4 приводящая к:
Warning: mb_send_mail(): Multiple or malformed newlines found in additional_header.

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

  • Яндекс – 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 ноября 2016
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS....
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...