Php menuid искусство счастья e mail

(PHP 4, PHP 5, PHP 7)

mail — Отправляет электронную почту

Описание

Отправляет электронную почту.

Список параметров

Получатель, или получатели письма.

Формат этого параметра должен соответствовать » RFC 2822. Несколько примеров:

  • user@example.com
  • user@example.com, anotheruser@example.com
  • User
  • User , Another User

Тема отправляемого письма.

Тема должна соответствовать » RFC 2047.

Каждая строка должна быть отделена символом CRLF (
). Строки не должны быть длиннее 70 символов.

(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.

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

Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (
). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.

При отправке письмо должно содержать заголовок From. Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .

Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing. Заголовок From также определяет заголовок Return-Path в Windows.

Если сообщения не отправляются, попробуйте использовать только LF (
). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.

Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.

Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).

Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail – это файл /etc/mail/trusted-users .

Возвращаемые значения

Возвращает TRUE , если письмо было принято для передачи, иначе FALSE .

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

Список изменений

Версия Описание
4.2.3 Параметр additional_parameters отключен в режиме safe_mode и при его использовании функция mail() вызовет предупреждение и вернет FALSE .

Примеры

Пример #1 Отправка письма.

Использование функции mail() для отправки простого письма:

// Сообщение
$message = "Line 1
Line 2
Line 3" ;

// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap ( $message , 70 , "
" );

// Отправляем
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>

Пример #2 Отправка письма с дополнительными заголовками.

Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:

= ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = ‘From: webmaster@example.com’ . "
" .
‘Reply-To: webmaster@example.com’ . "
" .
‘X-Mailer: PHP/’ . phpversion ();

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

Пример #3 Отправка письма с дополнительными аргументами командной строки.

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

Пример #4 Отправка HTML-сообщения

С помощью функции mail() также можно отправить и HTML-письмо.

// несколько получателей
$to = ‘aidan@example.com’ . ‘, ‘ ; // обратите внимание на запятую
$to .= ‘wez@example.com’ ;

Читайте также:  Как сохранить розы свежими надолго

// тема письма
$subject = ‘Birthday Reminders for August’ ;

// текст письма
$message = ‘

Birthday Reminders for August

(PHP 4, PHP 5, PHP 7)

mail — Отправляет электронную почту

Описание

Отправляет электронную почту.

Список параметров

Получатель, или получатели письма.

Формат этого параметра должен соответствовать » RFC 2822. Несколько примеров:

  • user@example.com
  • user@example.com, anotheruser@example.com
  • User
  • User , Another User

Тема отправляемого письма.

Тема должна соответствовать » RFC 2047.

Каждая строка должна быть отделена символом CRLF (
). Строки не должны быть длиннее 70 символов.

(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.

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

Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (
). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.

Если передан массив, то его ключи будут именами заголовка, а значения значениями.

До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.

При отправке письмо должно содержать заголовок From. Он может быть установлен с помощью параметра additional_headers , или значение по умолчанию может быть установлено в php.ini .

Если заголовок отсутствует, будет сгенерировано сообщение об ошибке вида Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing. Заголовок From также определяет заголовок Return-Path в Windows.

Если сообщения не отправляются, попробуйте использовать только LF (
). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.

Параметр additional_parameters может быть использован для передачи дополнительных флагов в виде аргументов командной строки для программы сконфигурированной для отправки писем, указанной директивой sendmail_path. Например, можно установить отправителя письма при использовании sendmail с помощью опции -f.

Параметр автоматически экранируется функцией escapeshellcmd() , чтобы не допустить выполнение команд. Но escapeshellcmd() позволяет добавлять дополнительные параметры. В целях безопасности рекомендуется проверять и очищать этот параметр.

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).

Пользователь, под которым работает веб-сервер должен быть добавлен в список доверенных в конфигурации sendmail для того чтобы избежать добавления заголовка ‘X-Warning’ при указании отправителя с помощью опции (-f). Для пользователей sendmail – это файл /etc/mail/trusted-users .

Возвращаемые значения

Возвращает TRUE , если письмо было принято для передачи, иначе FALSE .

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

Список изменений

Версия Описание
7.2.0 Параметр additional_headers может принимать значения типа массив.
5.4.42, 5.5.27 Добавлена защита от атак инъекцией в заголовок для параметра additional_headers . Это значит, что множественные последовательные переводы строк более не допустимы.

Примеры

Пример #1 Отправка письма.

Использование функции mail() для отправки простого письма:

// Сообщение
$message = "Line 1
Line 2
Line 3" ;

// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()
$message = wordwrap ( $message , 70 , "
" );

// Отправляем
mail ( ‘caffeinated@example.com’ , ‘My Subject’ , $message );
?>

Пример #2 Отправка письма с дополнительными заголовками.

Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:

= ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = ‘From: webmaster@example.com’ . "
" .
‘Reply-To: webmaster@example.com’ . "
" .
‘X-Mailer: PHP/’ . phpversion ();

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

Пример #3 Отправка письма с дополнительными заголовками, переданными массивом

В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).

Читайте также:  Слойки из слоеного дрожжевого теста с сахаром

= ‘nobody@example.com’ ;
$subject = ‘the subject’ ;
$message = ‘hello’ ;
$headers = array(
‘From’ => ‘webmaster@example.com’ ,
‘Reply-To’ => ‘webmaster@example.com’ ,
‘X-Mailer’ => ‘PHP/’ . phpversion ()
);

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

Пример #4 Отправка письма с дополнительными аргументами командной строки.

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

Пример #5 Отправка HTML-сообщения

С помощью функции mail() также можно отправить и HTML-письмо.

// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую

// тема письма
$subject = ‘Birthday Reminders for August’ ;

// текст письма
$message = ‘

Birthday Reminders for August

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

Обязательные параметры:

  • E-mail получателя
  • Заголовок письма
  • Текст письма

Необязательные параметры:

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

Возвращаемое значение:

  • true, если письмо было принято к доставке
  • false, в противном случае.
Простейший пример
Перейдем к более сложному примеру

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

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

В нашем примере переменная $headers состоит из 3-строк:

  • В первой строчке ми определяем ты отправляемого письма-HTML и кодировку windows-1251.
  • В 2-ом мы указываем от кого пришло письмо.
  • В 3-ем указываем e-mail адрес, для ответа на письмо.
А теперь самое интересное отправка письма c вложением (attachment)

Читают сейчас

Похожие публикации

  • 18 августа 2011 в 10:19

Обработка входящей почты на PHP

Замыкания в php

PHP mail под Windows

Вакансии

AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Комментарии 19

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

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

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

Плюс еще cp1251.

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

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

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

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

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

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

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

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

Попробую сделать эту статью полезной для Хабросообщества, вот вам Code Review данного куска кода:

1. Двойные кавычки и лишние переменные
Все строки, которые не содержат управляющие символы

или подстановки переменных, рекомендуется использовать одинарные кавычки. И лучше вынести в константы то, что не меняется в процессе выполнения кода.

2. Расположение и название файла
Тут есть ряд комментариев:

  • Путь до файла лучше указывать с использованием магической переменной __DIR__
  • Также лучше работать с абсолютным путем, использую функцию realpath()
  • Переменную $filename не нужно задавать, можно получить ее из сформированного пути функцией basename($filepath)

3. Комментарии снизу
Комментарии в коде обычно оставляют либо на той же строке, если это //, либо над строкой, которую планируете прокомментировать.

Читайте также:  Теплый пол по грунту в частном доме

4. Формирование многострочной переменной
Для улучшения читаемости кода, лучше не конкатинировать много строк, а использовать HEREDOC или NOWDOC:

5. Нет корректной обработки ошибокЕсли хоть одна функция поведет себя не так, как ожидается, то весь кусок кода непредсказуемо отработает.
Не информативная ошибка, тем более с какими-то непонятными цифрами 22. Рекомендуется выводить более доступный текст ошибки. Например «При чтении файла <$filepath>возникла ошибка.»

6. Чтение файлаЕсли понадобилось читать файл, но не обязательно использовать потоки, можно вытащить контент тем же самым file_get_contents.

7. Нет кавычекНе уверен, что этот код вообще отработает.

8. Удаление файла
Если это файл, который будет запускаться из cli, то еще может быть ок, но тоже не ясно зачем. А если этот скрипт будет запускаться через вебсервер, то скорее всего он отвалится по timeout.

9. Код оформлен не по PSR

P.S. Если что-то пропустил, то дополняйте, коллеги!

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

Все эти замечания не делают код полезнее. Чтобы сделать его полезнее, его надо переписать, целиком. С использованием современных инструментов. О чем и говорили все предыдущие комментаторы.

Все что написано вверху — это мелкие придирки, половина из которых — это вкусовщина про цветочки. Какие кавычки использовать и применять ли хередок — это исключительно на вкус автора.

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

Корректная обработка ошибок не имеет ничего общего с добавлением проверок на каждый чих. И уж тем более с выплевыванием сообщений об ошибке прямо в браузер. Пользователю сайта нет ни малейшего интереса читать про файлы на сервере. Такого рода сообщения должны писаться в лог. И РНР с этим великолепно справляется сам, помогать ему не требуется.

Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивше и более подходящим под ваши субъективные вкусы.

Это очень забавный комментарий. В стиле, я не знаю, «Вы тут представили комментарии по телеге без лошади, которую представили как средство передвижения. И ваши комментарии по цвету колес и бортам из картона не делают из этой телеги средство передвижения. Да и узорчики из цветочков не всем подходят и это вкусовщина. Вместо добавления своих замечаний, я представлюсь Д’Артаньяном на белом коне и налью желчи. „

Все эти замечания не делают код полезнее.

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

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

Код нужно писать не так, чтобы программисту было удобно что-то закомментировать в процессе написания, а чтобы потом было проще прочитать и понять.

Без обид, но чтобы сделать нормальный code review, надо сначала научиться кодить самому. Пока у вас получилось не code review, а cosmetic review. Ваш обзор не делает код лучше, он делает его чуть красивее и более подходящим под ваши субъективные вкусы.