mail

(PHP 4, PHP 5, PHP 7, PHP 8)

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

Описание

mail(
    string$to,
    string$subject,
    string$message,
    array|string$additional_headers = [],
    string$additional_params = ""
): bool

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

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

to

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

Формат строки по правилам стандарта » RFC 2822. Примеры:

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

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

Предостережение

Тема должна удовлетворять правилам стандарта » RFC 2047.

message

Отправляемое сообщение.

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

Предостережение

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

<?php

$text
= str_replace("\n.", "\n..", $text);

?>
additional_headers (необязательный)

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

Чаще этим пользуются, чтобы добавить дополнительные заголовки (From, Cc, и Bcc). Дополнительные заголовки разделяют комбинацией символов CRLF (\r\n). Если в составлении заголовка участвуют внешние данные, их очищают, чтобы исключить риск внедрения нежелательных заголовков.

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

Замечание:

Отправляемое письмо должно содержать заголовок From. Его устанавливают через параметр additional_headers или задают значение по умолчанию в файле php.ini.

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

Замечание:

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

additional_params (необязательный)

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

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

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

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

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

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

То, что письмо было принято для передачи, не значит, что оно достигнет получателя.

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

ВерсияОписание
7.2.0 Параметр additional_headers теперь принимает массив.

Примеры

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

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

<?php

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

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

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

?>

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

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

<?php

$to
= 'nobody@example.com';
$subject = 'the subject';
$message = 'hello';
$headers = 'From: webmaster@example.com' . "\r\n" .
'Reply-To: webmaster@example.com' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

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

?>

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

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

<?php

$to
= '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_params указывают, чтобы передать дополнительный аргумент программе, настроенной в директиве sendmail_path для отправки писем.

<?php

mail
('nobody@example.com', 'the subject', 'the message', null,
'-fwebmaster@example.com');

?>

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

Функцией mail() можно также отправить электронное письмо в формате HTML.

<?php

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

// Тема письма
$subject = 'Birthday Reminders for August';

// Текст письма
$message = '
<html>
<head>
<title>Birthday Reminders for August</title>
</head>
<body>
<p>Here are the birthdays upcoming in August!</p>
<table>
<tr>
<th>Person</th><th>Day</th><th>Month</th><th>Year</th>
</tr>
<tr>
<td>Johny</td><td>10th</td><td>August</td><td>1970</td>
</tr>
<tr>
<td>Sally</td><td>17th</td><td>August</td><td>1973</td>
</tr>
</table>
</body>
</html>
'
;

// Для отправки HTML-письма должен быть установлен заголовок Content-type
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Дополнительные заголовки
$headers[] = 'To: Mary <mary@example.com>, Kelly <kelly@example.com>';
$headers[] = 'From: Birthday Reminder <birthday@example.com>';
$headers[] = 'Cc: birthdayarchive@example.com';
$headers[] = 'Bcc: birthdaycheck@example.com';

// Отправляем
mail($to, $subject, $message, implode("\r\n", $headers));

?>

Замечание:

Для отправки HTML-сообщений или других сложных электронных писем рекомендована установка PEAR-пакета » PEAR::Mail_Mime.

Примечания

Замечание:

Реализация SMTP (только Windows) функции mail() в Windows во многом отличается от реализации в агенте sendmail. Во-первых, она не использует локальную программу для составления писем, а работает непосредственно с сокетами, что означает что необходим почтовый агент (MTA), ожидающий соединений на сокете (который может быть как на локальной, или localhost, так и на удалённой машине).

Во-вторых, дополнительные заголовки наподобие: From:, Cc:, Bcc: и Date: интерпретируются в первую очередь не почтовым агентом MTA, а PHP.

Поэтому параметр to не должен быть адресом вида "Something <someone@example.com>". Команда mail может неправильно интерпретировать этот адрес во время передачи данных почтовым агентом MTA.

Замечание:

Функция mail() не рекомендована для отправки большого количества писем в цикле. Функция открывает и закрывает SMTP-сокет для каждого письма, что не очень эффективно.

Для отправки большого количества сообщений обратите внимание на пакеты » PEAR::Mail и » PEAR::Mail_Queue.

Замечание:

Полезные RFC: » RFC 1896, » RFC 2045, » RFC 2046, » RFC 2047, » RFC 2048, » RFC 2049 и » RFC 2822.

Смотрите также

To Top