mail

(PHP 4, PHP 5)

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

Описание

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

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

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

to

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

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

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

subject

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

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

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

message

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

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

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

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

<?php
$text 
str_replace("\n.""\n.."$text);
?>

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

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

Обычно используется для добавления дополнительных заголовков (From, Cc, and 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 в Windows.

Замечание:

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

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

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

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

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

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

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

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

Версия Описание
4.3.0 (только для Windows) Теперь поддерживаются все дополнительные заголовки (такие как From, Cc, Bcc и Date), и являются регистро-независимыми. (Так как дополнительные заголовки интерпретируются не почтовым агентом, а PHP, PHP < 4.3 поддерживал только заголовок Cc и был регистро-зависимый).
4.2.3 Параметр additional_parameters отключен в режиме safe_mode и при его использовании функция mail() вызовет предупреждение и вернет FALSE.
4.0.5 Был добавлен параметр additional_parameters.

Примеры

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

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

<?php
// Сообщение
$message "Line 1\nLine 2\nLine 3";

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

// Отправляем
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 Отправка письма с дополнительными аргументами командной строки.

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

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

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

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

<?php
// несколько получателей
$to  'aidan@example.com' ', '// обратите внимание на запятую
$to .= 'wez@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>Joe</td><td>3rd</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' "\r\n";
$headers .= 'Content-type: text/html; charset=iso-8859-1' "\r\n";

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

// Отправляем
mail($to$subject$message$headers);
?>

Замечание:

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

Примечания

Замечание:

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

Во-вторых, дополнительные заголовки вроде: 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.

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

Коментарии

When sending MIME email make sure you follow the documentation with the "70" characters per line...you may end up with missing characters...and that is really hard to track down...
2005-03-02 18:07:55
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
Note that there is a big difference between the behavior of this function on Windows systems vs. UNIX systems. On Windows it delivers directly to an SMTP server, while on a UNIX system it uses a local command to hand off to the system's own MTA.

The upshot of all this is that on a Windows system your  message and headers must use the standard line endings \r\n as prescribed by the email specs. On a UNIX system the MTA's "sendmail" interface assumes that recieved data will use UNIX line endings and will turn any \n to \r\n, so you must supply only \n to mail() on a UNIX system to avoid the MTA hypercorrecting to \r\r\n.

If you use plain old \n on a Windows system, some MTAs will get a little upset. qmail in particular will refuse outright to accept any message that has a lonely \n without an accompanying \r.
2005-12-15 07:34:09
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
Make sure you enclose \r\n in double quotes (not single quotes!) so that PHP can translate that into the correct linefeed code
2010-07-07 02:19:52
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
I was having delivery issues from this function to Gmail, Yahoo, AOL, etc.  I used the notes here to figure that you need to be setting your Return-Path to a valid email to catch bounces.  There are two extra delivery gotchas on top of that:

1) The domain in the email used in the -f option in the php.ini sendmail parameter or in the mail() extra parameters field, needs to have a valid SPF record for the domain (in DNS as a "TXT" record type for sure and add an additional  "SPF" type record if possible).  Why? That's header field being used for spam checks.

2) You should also use a domain key or DKIM.  The trick here is that the domain key/DKIM is case sensitive!  I used Cpanel to create my domain key which automatically used all lowercase domain names in the key creation.  I found when  sending email and using a camel case "-f account@MyDomainHere.Com" option, my key was not accepted.  However it was accepted when I used "-f account@mydomainhere.com".

There are many other factors that can contribute to mail not getting to inboxes, including your own multiple failed testing attempts, so I suggest you consult each site's guidelines and don't ask me for help.  These are just the couple technical issues that helped my case.

I hope this saves someone some time and headaches...
2012-01-31 00:16:28
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
To define a mail sensitivity you have to put this line in the headers:

<?php
        $headers 
"MIME-Version: 1.0\n" ;
       
$headers .= "Content-Type: text/html; charset=\"iso-8859-1\"\n";

       
$headers .= "Sensitivity: Personal\n";

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

Possible Options:
Sensitivity: Normal, Personal, Private and Company-Confidential

These will be recognised and handled in Outlook, Thunderbird and others.
2012-02-15 11:26:53
http://php5.kiev.ua/manual/ru/function.mail.html
Be careful to not put extra spaces for the $headers variable.

For example, this didn't work on our servers:

$headers = "From: $from \r\n Bcc: $bcc \r\n";

But this did:

$headers = "From: $from\r\nBcc: $bcc\r\n";

Notice the removal of the spaces around the first \r\n.
2012-05-02 04:24:40
http://php5.kiev.ua/manual/ru/function.mail.html
Here's a small handy function I use to send email in UTF-8.

 <?php
function mail_utf8($to$from_user$from_email
                                             
$subject '(No subject)'$message '')
   { 
     
$from_user "=?UTF-8?B?".base64_encode($from_user)."?=";
     
$subject "=?UTF-8?B?".base64_encode($subject)."?=";

     
$headers "From: $from_user <$from_email>\r\n"
               
"MIME-Version: 1.0" "\r\n" 
               
"Content-type: text/html; charset=UTF-8" "\r\n"

     return 
mail($to$subject$message$headers); 
   }
?>
2012-05-16 14:22:01
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
Security advice: Although it is not documented, for the parameters $to and $subject the mail() function changes at least \r and \n to space. So these parameters are safe against injection of additional headers. But you might want to check $to for commas as these separate multiple addresses and you might not want to send to more than one recipient.

The crucial part is the $additional_headers parameter. This parameter can't be cleaned by the mail() function. So it is up to you to prevent unwanted \r or \n to be inserted into the values you put in there. Otherwise you just created a potential spam distributor.
2016-12-14 12:18:02
http://php5.kiev.ua/manual/ru/function.mail.html
The 'sendmail' executable which PHP uses on Linux/Mac (not Windows) expects "\n" as a line separator.

This executable is a standard, and emulated by other MTAs.

"\n" is confirmed required for qmail and postfix, probably also for sendmail and exim but I have not tested.

If you pass through using "\r\n" as a separator it may appear to work, but your email will be subtly corrupted and some middleware may break. It only works because some systems will clean up your mistake.

If you are implementing DKIM be very careful, as DKIM checks will fail (at least on popular validation tools) if you screw this up. DKIM must be calculated using "\r\n" but then you must switch it all to "\n" when using the PHP mail function.

On Windows, however, you should use "\r\n" because PHP is using SMTP in this situation, and hence the normal rules of the SMTP protocol (not the normal rules of Unix piping) apply.
2017-04-27 01:04:37
http://php5.kiev.ua/manual/ru/function.mail.html
Often it's helpful to find the exact error message that is triggered by the mail() function. While the function doesn't provide an error directly, you can use error_get_last() when mail() returns false.

<?php
$success 
mail('example@example.com''My Subject'$message);
if (!
$success) {
   
$errorMessage error_get_last()['message'];
}
?>

(Tested successfully on Windows which uses SMTP by default, but sendmail on Linux/OSX may not provide the same level of detail.)

Thanks to https://stackoverflow.com/a/20203870/195835
2017-05-31 08:19:03
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
Send mail with minimal requirements from email services.

<?php
    $encoding 
"utf-8";

   
// Preferences for Subject field
   
$subject_preferences = array(
       
"input-charset" => $encoding,
       
"output-charset" => $encoding,
       
"line-length" => 76,
       
"line-break-chars" => "\r\n"
   
);

   
// Mail header
   
$header "Content-type: text/html; charset=".$encoding." \r\n";
   
$header .= "From: ".$from_name." <".$from_mail."> \r\n";
   
$header .= "MIME-Version: 1.0 \r\n";
   
$header .= "Content-Transfer-Encoding: 8bit \r\n";
   
$header .= "Date: ".date("r (T)")." \r\n";
   
$header .= iconv_mime_encode("Subject"$mail_subject$subject_preferences);

   
// Send mail
   
mail($mail_to$mail_subject$mail_message$header);
?>
2017-07-21 16:39:06
http://php5.kiev.ua/manual/ru/function.mail.html
I migrated an application to a platform without a local transport agent (MTA). I did not want to configure an MTA, so I wrote this xxmail function to replace mail() with calls to a remote SMTP server. Hopefully it is of some use.

function xxmail($to, $subject, $body, $headers)
{
 $smtp = stream_socket_client('tcp://smtp.yourmail.com:25', $eno, $estr, 30);

 $B = 8192;
 $c = "\r\n";
 $s = 'myapp@someserver.com';

 fwrite($smtp, 'helo ' . $_ENV['HOSTNAME'] . $c);
  $junk = fgets($smtp, $B);

 // Envelope
 fwrite($smtp, 'mail from: ' . $s . $c);
  $junk = fgets($smtp, $B);
 fwrite($smtp, 'rcpt to: ' . $to . $c);
  $junk = fgets($smtp, $B);
 fwrite($smtp, 'data' . $c);
  $junk = fgets($smtp, $B);

 // Header 
 fwrite($smtp, 'To: ' . $to . $c); 
 if(strlen($subject)) fwrite($smtp, 'Subject: ' . $subject . $c); 
 if(strlen($headers)) fwrite($smtp, $headers); // Must be \r\n (delimited)
 fwrite($smtp, $headers . $c); 

 // Body
 if(strlen($body)) fwrite($smtp, $body . $c); 
 fwrite($smtp, $c . '.' . $c);
  $junk = fgets($smtp, $B);

 // Close
 fwrite($smtp, 'quit' . $c);
  $junk = fgets($smtp, $B);
 fclose($smtp);
}
2017-11-10 21:34:19
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
It is worth noting that you can set up a fake sendmail program using the sendmail_path directive in php.ini.

Despite the comment in that file, sendmail_path also works for Window. From https://www.php.net/manual/en/mail.configuration.php#ini.sendmail-path:

This directive works also under Windows. If set, smtp, smtp_port and sendmail_from are ignored and the specified command is executed.
2019-07-05 10:04:51
http://php5.kiev.ua/manual/ru/function.mail.html
Автор:
If you notice wrong displayed characters in the email it's because you need to properly set the Content-Type and the Charset in the headers of the email:

<?php
$headers 
'Content-Type: text/plain; charset=utf-8' "\r\n";
?>

Mostly, UTF-8 is your best choice.

You can set custom headers with the fourth parameter of the mail() function.

To make the whole thing waterproof, add the following header too:

<?php
$headers 
.= 'Content-Transfer-Encoding: base64' "\r\n";
?>

Now you can use the combination of UTF-8 and Base64 to properly encode the subject line and the recipient name like this:

<?php
$subject 
'=?UTF-8?B?' base64_encode('Test email with German Umlauts öäüß') . '?=';
$recipient '=?UTF-8?B?' base64_encode('Margret Müller') . '?= <recipient@domain.com>';
?>

And don't forget to Base64 encode the email message too:

<?php
$message 
base64_encode('This email contains German Umlauts öäüß.');
?>

All references are taken from:
https://dev.to/lutvit/how-to-make-the-php-mail-function-awesome-3cii
2019-10-12 10:36:54
http://php5.kiev.ua/manual/ru/function.mail.html
* Sending email with attachment

function sendMail(
    string $fileAttachment,
    string $mailMessage = MAIL_CONF["mailMessage"],
    string $subject     = MAIL_CONF["subject"],
    string $toAddress   = MAIL_CONF["toAddress"],
    string $fromMail    = MAIL_CONF["fromMail"]
): bool {
   
    $fileAttachment = trim($fileAttachment);
    $from           = $fromMail;
    $pathInfo       = pathinfo($fileAttachment);
    $attchmentName  = "attachment_".date("YmdHms").(
    (isset($pathInfo['extension']))? ".".$pathInfo['extension'] : ""
    );
   
    $attachment    = chunk_split(base64_encode(file_get_contents($fileAttachment)));
    $boundary      = "PHP-mixed-".md5(time());
    $boundWithPre  = "\n--".$boundary;
   
    $headers   = "From: $from";
    $headers  .= "\nReply-To: $from";
    $headers  .= "\nContent-Type: multipart/mixed; boundary=\"".$boundary."\"";
   
    $message   = $boundWithPre;
    $message  .= "\n Content-Type: text/plain; charset=UTF-8\n";
    $message  .= "\n $mailMessage";
   
    $message .= $boundWithPre;
    $message .= "\nContent-Type: application/octet-stream; name=\"".$attchmentName."\"";
    $message .= "\nContent-Transfer-Encoding: base64\n";
    $message .= "\nContent-Disposition: attachment\n";
    $message .= $attachment;
    $message .= $boundWithPre."--";
   
    return mail($toAddress, $subject, $message, $headers);
}

* Sending email in html

function sendHtmlMail(
    string $mailMessage = MAIL_CONF["mailMessage"],
    string $subject     = MAIL_CONF["subject"],
    array $toAddress    = MAIL_CONF["toAddress"],
    string $fromMail    = MAIL_CONF["fromMail"]
): bool {
   
    $to        = implode(",", $toAddress);
    $headers[] = 'MIME-Version: 1.0';
    $headers[] = 'Content-type: text/html; charset=iso-8859-1';   
    $headers[] = 'To: '.$to;
    $headers[] = 'From: '.$fromMail;   

    return mail($to, $subject, $mailMessage, implode("\r\n", $headers));
}
2020-07-06 11:42:59
http://php5.kiev.ua/manual/ru/function.mail.html

    Поддержать сайт на родительском проекте КГБ