Функция mail()

Некоторые особенности

При работе возникает много нюансов. Они зависят от используемой платформы ОС и других настроек и параметров. Рассмотрим самые основные:

  • При отправке письма заголовок Form нужно задать через необязательный параметр «additional_headers». При его отсутствии может возникнуть ошибка при отправлении;
  • Заголовки разделите символами перевода на новую строку и каретки (\r\n);
  • Длина строки не более семидесяти знаков. Ее регулируйте (\r\n).

Что делать если функция не отправляет письма

Даже с учетом всех перечисленных выше моментов, mail может не работать. При этом на локальном сервере все отправляется как следует. Одной из причин почему так происходит — неправильная настройка функции на хостинге. Поэтому нужно обратиться к конфигурационному файлу php.ini, в котором посмотрите функцию «disable_functions».

Для проверки работоспособности напишите такой несложный код и разместите его в корне созданного интернет-проекта.

<?
print mail("name@my.ru","header","text");
?>

Если все работает правильно, то на экране браузера появится цифра один «1». Ее возвратит «print» после выполнения.

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

Рассмотрим пример, как отсылать сообщения с прикрепленным файлом. Для этого используется функция sendMailAttachment(). Рассмотрим, как это работает на примере:

<?
$file = "./files/test.txt"; // прописываем путь к файлу, который нужно отправить
$mailTo = "test@gmail.com"; // адрес отправителя
$from = "test@files.com"; // от кого
$subject = "Test file"; // тема
$message = "Текст с вложением"; // контент письма
$r = sendMailAttachment($mailTo, $from, $subject, $message, $file); // отправка письма c вложением
echo ($r)?Отправлено':'Ошибка. Не отправлено!';
//$r = sendMailAttachment($mailTo, $from, $subject, $message); // отправка письма без вложения
//echo ($r)?Отправлено''Ошибка. Не отправлено!';
?>

Проблемы с кодировкой

Иногда сообщения приходят в виде вопросов «?» или непонятных символов. От того насколько правильно оно будет перекодировано, зависит прочтет ли его получатель. При стандартных способах отправки php не учитывает кодировку. На эту тему на моем блоге уже была статья «UTF-8 и Windows 1251». Сам контент сообщения может быть любой кодировки. Вся сложность заключается в заголовке From. По стандарту они должны быть в US-ASCII. Есть две формы кодирования —BASE64 и Quoted-Printable. Первая — более универсальная и работает с UTF-8, поэтому используете ее. Например,

<?
$to = "Адрес куда отправлять";
$from = "От кого";
$subject = "Тема";
$message = '
<html><head>
<title>Привет</title>
</head><body>
Текст
</body></html>';
$headers  = "Content-type: text/html; charset= UTF-8 \r\n";
$headers .= "From: Любой текст <$from>\r\n";
mail($to, $subject, $message, $headers);
?>

При таком варианте заголовки могут быть нечитаемые. Чтобы решить данную проблему напишите заголовок в таком виде:

$subject = '=?UTF-8?B?'.base64_encode('Обратная связь').'?=';

Важно! Используйте исключительно UTF-8. Остались еще вопросы? Рекомендую вам ознакомиться с хорошим курсом Русакова  «Создание движка на PHP и MySQL 2.0»

Изучив его вы не только разберетесь с веб-программированием, но и научитесь писать собственный движок сайта

Остались еще вопросы? Рекомендую вам ознакомиться с хорошим курсом Русакова  «Создание движка на PHP и MySQL 2.0». Изучив его вы не только разберетесь с веб-программированием, но и научитесь писать собственный движок сайта.

Как настроить подключение SMTP

Чтобы настроить нормальную отправку писем, нужно установить плагин WP Mail SMTP. Он позволяет переконфигурировать стандартный PHP Mailer так, чтобы была возможность подключаться к SMTP серверу. Также, советую использовать его, если вы пользуетесь локальным сервером.

Настройка WP Mail SMTP

А вот описание опций

  • From Email — email отправителя. Вводим логин от почты полностью как на изображении вверху
  • From Name — Имя отправителя. Можете поставить сюда что хотите, например, адрес вашего сайта
  • Mailer — выбираем
  • Return Path — оставляем пустым
  • SMTP Host — адрес SMTP сервера. Вводим
  • SMTP Port — порт SMTP сервера. Вводим
  • Шифрование— тип шифровки писем. Выбираем
  • Авторизация— авторизация. Выбираем
  • Username — логин от почты. Значение должно совпадать с From Email
  • Password — пароль от почты

Что это такое

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

Настройка функции происходит в конфигурационном файле php.ini. В нем прописывают путь к лог-файлам, задают значение порта и так далее.

Mail принимает пять аргументов из которых три — обязательные:

  • Адрес отправителя;
  • Тайтл письма;
  • Текст сообщения.

Например, напишем такие строки кода

<?php
mail("test@yandex.ru", "Заголовок", "Текст сообщения");
?>

Если вы пользуетесь Денвером, то информация, которую вы отправили, сохранится на виртуальном диске Z папке «tmp\!sendmail». Если вы забыли, как установить данный локальный сервер, то советую почитать статью «Как быстро установить Denver».

Отправка почты php через SMTP-настройка скрипта

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

<?php
 mail('to', 'subject', 'message');
 ?>

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

Пример моего скрипта:

<?php
 mail('bunakov@mail.ru', 'Тема письма', 'Отправка почты через локальный сервер openserver');
 ?>

Можно конечно немного расширить функционал и сделать так, чтобы скрипт выдавал сообщение об отправки почты. Хоть на самом деле отправку производит именно SMTP-сервер, а скрипт лишь формирует сообщение.

Для примера можно написать так:

<?php
 if(mail('bunakov@mail.ru', 'Тема письма', 'Отправка почты через локальный сервер openserver') ) {echo'Письмо успешно отправлено';
 }else{echo 'Ошибка';}
 ?>

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

Например: domains/send/index.php и приступать к настройке отправки почты через SMTP opensrerver.

Простой скрипт отправки писем PHP

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
< ?php
$to = "<myemail@example.com>";
$email = $_POST'email';
$subject = $_POST"theme";
$page = 'Страница спасибо за комментарий'; 
$message = '
<html>
<body>
<center>	
<table border=1 cellpadding=6 cellspacing=0 width=90% bordercolor="#DBDBDB">
 <tr><td colspan=2 align=center bgcolor="#E4E4E4"><b>Информация</b></td></tr>
 <tr>
  <td><b>Откуда</b></td>
  <td>'.$page.'</td>
 </tr>
 <tr>
  <td><b>Адресат</b></td>
  <td><a href="mailto:'.$email.'">'.$email.'</a></td>
 </tr>
 <tr>
  <td><b>Тема</b></td>
  <td>'.$subject.'</td>
 </tr>
 <tr>
  <td><b>Сообщение</b></td>
  <td>'.$_POST'message'.'</td>
 </tr>
</table>
</center>	
</body>
</html>'; 
$headers  = "Content-type: text/html; charset=utf-8\r\n";
if (!empty($email) && !empty($subject) && !empty($message)) {
$result = mail($to, $subject, $message, $headers);
}	
if ($result) {
	echo '<div class="alert alert-success alert-dismissible fade show" role="alert">
  <strong>Сообщение успешно отправлено!</strong> Вы можете закрыть это сообщение.
  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
    <span aria-hidden="true">&times;</span>
  </button>
</div>';
}else{
	echo '<div class="alert alert-danger alert-dismissible fade show" role="alert">
  <strong>Сообщение не отправлено!</strong> Попробуйте еще раз.
  <button type="button" class="close" data-dismiss="alert" aria-label="Close">
    <span aria-hidden="true">&times;</span>
  </button>
</div>';
}
?>

c 7 по 31 строки — шаблон HTML письма

32 — указание типа письма и его кодировка

33 — проверка на пустые поля

С 36 строки и до конца идет условие. Если произошла успешная отправка, то будет выведено уведомление об успешной отправке в виде зеленого алерта (бутстрап). В противном случае будет выведено сообщение об ошибке.

Troubleshooting Common PHP Mail and PHPMailer Errors

Errors can occur from time to time while using PHP mail or PHPMailer. Here’s a list of the most common issues and ways how you can fix them.

Gmail Couldn’t Verify That YourDomain.com Sent This Message

If you see this warning when testing a PHP mail script, it could mean one of the following:

  • Your SPF record is not enabled. You can find the steps on how to add one here.
  • You’ve sent an email from an address that does not exist or does not belong to you. Make sure to use valid SMTP authentication details.

Mail Goes to the Spam Folder

There are various reasons why a PHP mail can turn up as spam. Here are some of the most common ones:

  • Misleading or spam-like subject. A few examples of that would be “test” or “testing”, “hello“, “urgent” or anything similar. Make sure that you set a clear intent in your message subject.
  • You’re using an incorrect sender address that invokes the security measures to filter your email. This is done as prevention from email spoofing and scams.
  • You are using spam trigger words. This category includes phrases like “great offer” “click here” “special promotion” “this is not spam” and so on. Try changing up your message content to see if that’s the case.
  • Your mailing list does not have an unsubscribe button. When there are a lot of people who report your emails as spam, you will find it difficult to avoid the spam filter. Having an unsubscribe button is a great way to prevent this and invoke more trust from your readers.

Отправка почты из формы

По-видимому, одной из наиболее распространенных областей применения функции mail() языка PHP является отправка почты из формы. Такой вариант предоставляет значительно более широкие функциональные возможности по сравнению с дескриптором ссылки mailto языка HTML, использование которого, безусловно, приводит к отправке электронной почты из почтовой программы клиентского компьютера. Ниже приведен простой пример формы такого типа, который часто применяется для отправки электронной почты:

Код PHP

При использовании любых переменных $_POST в связи с отправкой почты необходимо в первую очередь учитывать возможные отрицательные последствия с точки зрения безопасности. Недобросовестные лица могут использовать эту форму для рассылки спама. В частности, взломщик получает возможность оформить некоторое сообщение в виде значения переменных суперглобального массива $_POST, которые затем вставляются в сообщение. В данном примере я опустил дополнительные проверки и обеззараживание введенных данных для простоты примера, более подробную информацию вы можете найти в статье «Безопасность в PHP».

Создаем файл, принимающий данные из HTML формы

Это будет файл с именем send.php

В файле на первом этапе нужно принять данные из пост массива. Для этого создаем две переменные:

Перед названиями переменных в php ставится знак $, в конце каждой строки ставиться точка с запятой. $_POST это массив в который передаются данный из формы. В форме html при этом указан метод отправки method=»post». Так, приняты две переменные из формы html. Для целей защиты своего сайта нужно провести эти переменные через несколько фильтров — функций php.

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

При этом новые переменные в php не создаются, а используются уже имеющиеся. Что сделает фильтр, он преобразует символ «<» в ‘&lt;’. Также он поступить с другими символами, встречающимися в html коде.

Вторая функция декодирует url, если пользователь попытается его добавить в форму.

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

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

Проверка данных, передаваемых от HTML формы в файл PHP

Для того, чтобы проверить, работает ли этот код, передаются ли данные можно просто их вывести на экран при помощи функции echo:

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

Отправка почты через smtp mail ru

Для того, чтобы настроить отправку почты через SMTP mail ru, необходимо просто заменить параметры яндекса на параметры mail ru.

А чтобы не перестраивать каждый раз локальные сервер, лучше всего настроить разные профили openserver. Как это сделать показано в видеоуроке Openserver настройка php с помощью профилей.

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

Для каждого профиля (совсем не важно как он будет называться), должны быть сделаны свои настройки, если конечно планируется использование разных по своим параметрам скриптов, cms-систем и приложений. Если нет, то можно обойтись и настройками по умолчанию

Что касается SMTP mail ru, то здесь все эдентично.

Меняются данные яндекса на данные mail ru

История изменений

версия 2.11 (28.06.2016)

Устранение ошибки. В теме сообщения и в именах адресатов подчерк «_» заменялся на пробел » «. Например «Тема_2» менялось на «Тема 2». То же самое было и в именах адресатов.
Сейчас эту ошибку устранил — сделал кодирование заголовков с помощью base64.

версия 2.1 (17.11.2014)версия 2.0 (18.10.2013)

Решил уйти от совместимости со старыми версиями PHP, теперь скрипт работает с PHP 5 и выше.

Кодировка по умолчанию теперь UTF-8

Обратите внимание, кодировка скрипта тоже UTF-8.

Переработан механизм формирования письма и заголовков. Исправлены проблемы с прикреплением файлов с русскими именами.

После выполнения скрипта можно узнать статус отправки письма

$m->status_mail — при удачной отправке здесь будет TRUE, при ошибке FALSE
$m->status_mail — здесь текст ошибки или удачной отправки

Модернизирована отправка HTML письма. Теперь к html версии письма можно добавить альтернативную текстовую.
Для чего это нужно? Если почтовая программа получателя не умеет обрабатывать html или пользователь в настройках запретил обработку html,
то будет отображаться альтернативная текстовая версия. В современном интернете это не очень актуально, так как все сейчас видят письма в HTML,
но все почтовые программы по прежнему формируют письмо именно с альтернативным текстом.

Кодирование письма в base64. Теперь кодирование в base64 включено по умолчанию, очень советую так и оставить, но кому не нравится смогут переключиться в обычный 8bit.

Возможность отправки разных писем за одно соединение, либо одного письма, но индивидуально для некоторых.
Поясню. Если вам нужно отправить письмо нескольким получателям, то вы можете как и раньше перечислить их всех с помощью
$m->To(«asd@asd.ru»);
$m->To(«yui@xcf.ru»);
В этом случае письмо будет отправлено всем этим адресатам и в поле TO (кому) будут все они перечислены и все получатели будут видеть кому еще было отправлено письмо.
В этой версии появилась возможность отправлять несколько индивидуальных писем за одно соединение.
Сколько таких индивидуальных писем можно отправить за раз, все зависит от лимитов вашего SMTP сервера. Некоторые сервера не разрешают отправлять более пяти писем за раз, другие 100-200 разрешают.
Если отправляете индивидульные письма не через SMTP, то в данном случае просто будет вызвана несколько раз функция mail() — так что на нее тоже есть ограничения.

Совместимость с версией 1.6.1.
Для перехода с предыдущих версий на 2.0 учтите слудующее.
$m=new Mail(); — Если вы запускали класс без указания кодировки, то в предыдущих версиях письма формировались в windows-1251, сейчас такая команда запускает UTF-8.
Если вам по прежнему нужно использовать windows кодировку, укажите ее $m=new Mail(«windows-1251»);
И второй момент. Получение лога по умолчанию не работает. Если вы используете $m->Get();, то сейчас вам нужно сначала включить накопление лога.
Для этого до отправки письма включите лог $m->log_on(true); и после этого $m->Get() сработает как прежде.

В остальном совместимость должна остаться.

версия 1.6.1 (02.10.2013)

Добавлена возможность встраивать картинки внутрь html
Для этого как и раньше прикрепляете картинки к письму
Например две картинки
$m->Attach( «1.jpg», «», «image/jpeg» );
$m->Attach( «2.jpg», «», «image/jpeg» );
А в самом html тексте письма вставляете картинки так

Например
$m->Body( ‘Текст текст И т.д.’, «html» );

Обратите внимание, тип сообщения должен быть html

версия 1.6.0 (09.12.2011)

Добавлена возможность добавлять имена к почтовым ящикам
Действует в From, To и ReplyTo
Имя добавляется через разделитель ‘;’ например
$m->To( «Максим;adm@webi.ru» );

версия 1.5.1 (07.02.2011)версия 1.5 (28.02.2010)

Добавлена возможность отправлять почту через SMTP.
Подключается с помощью новой команды smtp_on().

версия 1.4 (24.02.2010)

  • адаптация к русской кодировке
  • возможность переименовывать прикрепленный файл
  • возможность отправлять письма в формате html
  • изменения в вызове некоторых функций

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

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

$mail->SMTPSecure = false;
$mail->SMTPAutoTLS = false;

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

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

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

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

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

openssl genrsa -out test-private.pem 1024
openssl rsa -in test-private.pem -out test-public.pem -pubout

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

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

$domain = 'test.ru';                   // ваш домен
$privatekeyfile = 'test-private.pem';  // имя файла, в который будет записан приватный ключ
$publickeyfile = 'test-public.pem';    // имя файла, в который будет записан публичный ключ

if (file_exists($privatekeyfile)) {
  echo "<p>Using existing keys</p>";
  $privatekey = file_get_contents($privatekeyfile);
  $publickey = file_get_contents($publickeyfile);
} else {
  echo "<p>Create keys</b>";
  $pk = openssl_pkey_new(
      
  );
  openssl_pkey_export_to_file($pk, $privatekeyfile);
  $pubKey = openssl_pkey_get_details($pk);
  $publickey = $pubKey;
  file_put_contents($publickeyfile, $publickey);
  $privatekey = file_get_contents($privatekeyfile);
}
echo "<p>Private key (keep this private!):</p><pre>" . $privatekey . "</pre>";
echo "<p>Public key:</p><pre>" . $publickey . "</pre>";

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

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

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

Нужно добавить 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 перед отправкой письма и оно будет подписано. Думаю, на приведенном примере будет всё понятно:

// Подключаем библиотеку
use PHPMailer\PHPMailer\PHPMailer;
require 'PHPMailer/PHPMailer.php';

// Создаем письмо
$mail = new PHPMailer;
$mail->CharSet = 'UTF-8';
$mail->setFrom('test@test.ru');
$mail->addAddress('test@ya.ru');
$mail->Subject = 'Это тест';
$mail->msgHTML('<p>Это тест</p>');

// Настройка DKIM подписи
$mail->DKIM_domain = 'test.ru';
$mail->DKIM_private = 'test-private.pem';
$mail->DKIM_selector = 'mail';

// Отправляем
$mail->send();

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

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

Дополнения

19.10.2014 Иван Ткаченко подсказал, что можно расширить возможности класса и отправлять письмо сразу нескольким получателям, за это ему большое спасибо!
Для отправки нескольким получателям через «,» заменить
Это:

fputs($socket, "RCPT TO: \r\n");
    if (!$this->_parseServer($socket, "250")) {
    fclose($socket);
    throw new Exception('Error of command sending: RCPT TO');
}

На это:

$email_to_array = explode(',', $mailTo);
    foreach($email_to_array as $key => $email) {
    $emails = ltrim($email, '');
    fputs($socket, "RCPT TO: <$emails>\r\n");
    if (!$this->_parseServer($socket, "250")) {
        fclose($socket);
        throw new Exception('Error of command sending: RCPT TO');
    }
}

05.08.2016 Сегодня в комментарии подсказали по поводу проблемы с кодировкой, спасибо за это Евгению:
«Для тех у кого в теле и сабже полученного письма кракозябры — проверьте кодировку сервера по умолчанию и кодировку в которой написан сам скрипт. У меня windows-1251 так что прежде чем вызывать метод send использую»

$from_user=iconv("windows-1251", "utf-8" ,$from_user);
$subject =iconv("windows-1251", "utf-8" , $subject);
$message =iconv("windows-1251", "utf-8" , $message);

22.11.2016 Сегодня в комментарий добавили полезный код, который позволяет отправлять, с помощью класса, не только текст, но и файлы. Спасибо большое, за этот код Анжелике. Ниже код:

можно отправлять не только одно письмо но и файлы прикреплять к письму:
// пример использования
require_once «SendMailSmtpClass.php»; // подключаем класс

$mailSMTP = new SendMailSmtpClass(‘xxx@mail.ru’, ‘xxx’, ‘ssl://smtp.mail.ru’, ‘NameSender’, 465); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’);

// заголовок письма
$headers= «MIME-Version: 1.0\r\n»;
//$headers .= «Content-type: text/html; charset=utf-8\r\n»; // кодировка письма
//$headers .= «From: Anjelika \r\n»; // от кого письмо !!! тут e-mail, через который происходит авторизация

$subject = «пробуем отправить файл»;
$message =»Сообщение в теле письма при отправке файла»; // текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.
$filename = «имя файла например формата.zip»; // название файла
$filepath = «./sending/полный путь к файлу.zip»; // месторасположение файла
//исьмо с вложением состоит из нескольких частей, которые разделяются разделителем
$boundary = «—-«.md5(uniqid(time())); // генерируем разделитель
$headers .= «Content-Type: multipart/mixed; boundary=\»$boundary\»\r\n»; // кодировка письма// разделитель указывается в заголовке в параметре boundary
$headers .= «From: NameSender \r\n»;
$multipart = «—$boundary\r\n»;
$multipart .= «Content-Type: text/html; charset=utf-8\r\n»;
$multipart .= «Content-Transfer-Encoding: base64\r\n»;
$multipart .= «\r\n»;
$multipart .= chunk_split(base64_encode(iconv(«utf8», «windows-1251″, $message))); // первая часть само сообщение
// Открыли файл
$fp = fopen($filepath,»r»);
if (!$fp)
{
print «Не удается открыть файл22»;
exit();
}
$file = fread($fp, filesize($filepath)); // чтение файла
fclose($fp);
$message_part = «\r\n—$boundary\r\n»;
$message_part .= «Content-Type: application/zip; name=\»$filename\»\r\n»;
$message_part .= «Content-Disposition: attachment\r\n»;
$message_part .= «Content-Transfer-Encoding: base64\r\n»;
$message_part .= «\r\n»;
$message_part .= chunk_split(base64_encode($file));
$message_part .= «\r\n—$boundary—\r\n»; // второй частью прикрепляем файл, можно прикрепить два и более файла
$multipart .= $message_part;

$result = $mailSMTP->send(‘xxx@xxx.ru’, $subject, $multipart, $headers); // отправляем письмо
// $result = $mailSMTP->send(‘Кому письмо’, ‘Тема письма’, ‘Текст письма’, ‘Заголовки письма’);
if($result === true){
echo «Письмо успешно отправлено»;
}else{
echo «Письмо не отправлено. Ошибка: » . $result;
}

Функция mail

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

Код PHP

Здесь показан применяемый по умолчанию и минимальный формат: адрес получателя, строка темы и тело письма. В данном случае интерпретатор PHP автоматически добавляет строку From: me@sendhost к заголовку каждого сообщения.

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

Код PHP

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

Код PHP

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

  • Имя отправителя.

  • Поле «To» (адрес получателя).

  • Адрес электронной почты отправителя.

  • Адрес «Reply-to» (Получатель ответа) или «Bounce-to» (Получатель отвергнутого письма).

  • Поле «X-mailer» и номер версии.

  • Версия MIME.

  • Тип информационного наполнения.

  • Обозначение набора символов (в этом поле для обозначения операции присваивания используется символ =, а не :, как в других заголовках).

  • Поле «Content-transfer-encoding».

  • Поле с обозначением адресата копии (cc) и слепой копии (bcc).

Функция mail() возвращает 1 (значение true), если в системе PHP все указывает на то, что почта была отправлена успешно. Это отнюдь не означает, что действительно была отправлена или получена какая-либо почта. Все причины, по которым передача почты может окончиться неудачей, просто невозможно перечислить: неправильно заданный почтовый адрес, неправильно назначенный или имеющий неправильную конфигурацию сервер SMTP, неблагоприятные условия, сложившиеся на локальном участке Интернета, и т.д. Получение результата, равного 1, следует рассматривать как сообщение, означающее не больше чем: «Применение интерпретатором PHP функции mail к входным данным не закончилось неудачей».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector