Работая над проектом, мне пришлось создать специфичную «анкету соискателя» в котором надо была отправлять всю анкету на указные за ране e-mail адрес, и я сразу же вспомнил про PHP функцию mail().


bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])

Обязательные параметры:
  • E-mail получателя
  • Заголовок письма
  • Текст письма

Необязательные параметры:
  • Дополнительные заголовки письма
  • Дополнительные параметры командной строки

Возвращаемое значение:
  • true, если письмо было принято к доставке
  • false, в противном случае.


Простейший пример

<?php 
mail("E-mail получателя", "Загаловок", "Текст письма \n 1-ая строчка \n 2-ая строчка \n 3-ая строчка"); 
?>


Перейдем к более сложному примеру


<?php 
$to  = "<mail@example.com>, " ; 
$to .= "mail2@example.com>"; 

$subject = "Заголовок письма"; 

$message = ' <p>Текст письма</p> </br> <b>1-ая строчка </b> </br><i>2-ая строчка </i> </br>';

$headers  = "Content-type: text/html; charset=windows-1251 \r\n"; 
$headers .= "From: От кого письмо <from@example.com>\r\n"; 
$headers .= "Reply-To: reply-to@example.com\r\n"; 

mail($to, $subject, $message, $headers); 
?>


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

Переменные $subject и $message, не буду описывать, это и так понятно.

В нашем примере переменная $headers состоит из 3-строк:
  • В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
  • В 2-ом мы указываем от кого пришло письмо.
  • В 3-ем указываем e-mail адрес, для ответа на письмо.


А теперь самое интересное отправка письма c вложением (attachment)


$subject = "тема письма"; 

$message ="Текст сообщения"; 
// текст сообщения, здесь вы можете вставлять таблицы, рисунки, заголовки, оформление цветом и т.п.

$filename = "file.doc";
// название файла

$filepath = "files/file.doc";
// месторасположение файла


//исьмо с вложением состоит из нескольких частей, которые разделяются разделителем

$boundary = "--".md5(uniqid(time())); 
// генерируем разделитель

$mailheaders = "MIME-Version: 1.0;\r\n"; 
$mailheaders .="Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n"; 
// разделитель указывается в заголовке в параметре boundary 

$mailheaders .= "From: $user_email <$user_email>\r\n"; 
$mailheaders .= "Reply-To: $user_email\r\n"; 

$multipart = "--$boundary\r\n"; 
$multipart .= "Content-Type: text/html; charset=windows-1251\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/octet-stream; name=\"$filename\"\r\n";  
$message_part .= "Content-Transfer-Encoding: base64\r\n"; 
$message_part .= "Content-Disposition: attachment; filename=\"$filename\"\r\n"; 
$message_part .= \r\n;
$message_part .= chunk_split(base64_encode($file));
$message_part .= "\r\n--$boundary--\r\n";
// второй частью прикрепляем файл, можно прикрепить два и более файла

$multipart .= $message_part;

mail($to,$subject,$multipart,$mailheaders);
// отправляем письмо 

//удаляем файлы через 60 сек.
if (time_nanosleep(5, 0)) {
		unlink($filepath);
}
// удаление файла

Комментарии (15)


  1. GenkaOk
    21.03.2019 20:22
    +2

    Серьезно? 2019 год на дворе. Скрывайте в черновик.
    Это же в документации все есть.

    UPD:
    С телефона не заметил. Все вопросы к RigelGL

    Приглашён
    21 марта 2019 в 20:01 по приглашению пользователя RigelGL


    1. kAIST
      21.03.2019 20:29

      Плюс еще cp1251...


  1. Rsa97
    21.03.2019 20:39
    +1

    Отправлять письмо в Windows-1251 закодированным в Base64? Оставлять заголовки (Subject) в raw utf-8? Не создавать text/plain часть при наличии text/html? Отправлять письма напрямую, а не через свой SMTP-сервер?
    В общем, все способы отправить письмо в спам.
    Спрячьте и не никому этот код не показывайте.


    1. ghostinushanka
      21.03.2019 20:45

      Наоборот оставьте, с пометкой НЛО «вот, как НЕ НАДО писать статьи».


  1. ZaEzzz
    21.03.2019 21:54

    Хоть через PHP, хоть напрямую цепляться telnet'ом — не будет никакой разницы в ценности(отсутствии) статьи, и так уже все расписано по этой теме вдоль и поперек, только обычно вредных советов подкидывают.


  1. Psih
    21.03.2019 22:23

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


  1. ScarletFlash
    21.03.2019 23:02
    +2

    Вы бы ещё показали, как echo() пользоваться… И ладно, если бы синтаксических ошибок в тексте и в самом коде не было.


  1. index0h
    22.03.2019 00:08

    [сарказм]
    Отличная и полезная статья, а главное — актуальная для 2019го.
    Реквестую статью про strtr и str_replace.
    [/ссрказм]


  1. Mishiko
    22.03.2019 00:51

    «Неправильно ты, дядя Федор, бутерброд ешь»

    Функция mail дергает локальный, для сервера на котором работает PHP-скрипт, MTA — а это потенциальный источник проблем:

    • локальный MTA может отсутствовать
    • локальный MTA может давно и прочно прописаться во всех blacklist-ах какие только бывают и администратор сервера может не торопиться его оттуда вытаскивать
    • локальный MTA может упасть и администратор может забить на это на денек другой
    • локальный MTA может вызывать у получателей серьезные сомнения относительно того, не СПАМ ли это
    • mail, как написано в документации, норовит открывать и закрывать соединение с MTA при каждом вызове, что негативно сказывается на производительности


    Мораль — используйте полноценный почтовый сервер и обращайтесь к нему через SMTP (для удобства есть соответствующие библиотеки, например PHPMailer)


    1. Sheti
      22.03.2019 04:42

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


      1. Mishiko
        22.03.2019 12:26

        Можно, если сервер (физический или виртуальный) ваш собственный и вы обладаете навыками администрирования.


  1. prishelec
    22.03.2019 00:55

    Машина времени, однако (без обид). Но вы (автор) как то запоздали на пару лет.


    1. maximw
      22.03.2019 01:38

      Тут не на пару, а на добрый десяток лет.


  1. Sersoftin
    22.03.2019 09:19

    Каждый раз удивляюсь таким статьям. Что побуждает авторов такое писать… Уже сколько их заминусили, а они все появляются и появляются.


  1. nefone
    23.03.2019 07:08

    Даже не знаю где могу это использовать. Большинство писем отправленных таким способом будут улетать в спам.