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

电子邮件的主题。

警告

本项不能包含任何换行符,否则邮件可能无法正确发送。

message

所要发送的消息。

行之间必须以一个 CRLF(\r\n)分隔。每行不能超过 70 个字符。

警告

(Windows 下)当 PHP 直接连接到 SMTP 服务器时,如果在一行开头发现一个句号,则会被删掉。要避免此问题,将单个句号替换成两个句号。

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

additional_headers(可选项)

要插入到邮件 header 尾部的 Stringarray

这通常用于添加额外的 header(From、Cc 和 Bcc)。多个额外的 header 应使用 CRLF(\r\n)分隔。如果使用外部数据来组成此 header,则应对数据进行清理,避免注入不需要的 header。

如果传递 array,则 key 是 header 名称,value 对应的 header 值。

注意:

发送邮件时,邮件必须包含 From header。这可以使用 additional_headers 参数来设置,或者可以在 php.ini 中设置默认值。

如果不这样做,将导致类似于 Warning: mail(): "sendmail_from" not set in php.ini or custom "From:" header missing 的错误消息。当直接通过 SMTP(仅限 Windows)发送时,From header 还会设置 Return-Path

注意:

如果未收到消息,请尝试仅使用 LF(\n)。一些 Unix 邮件传输代理(最著名的是 » qmail)会自动用 CRLF 替换 LF(如果使用 CRLF,则会导致 CR 重复)。这应该是最后的手段,因为它不符合 » RFC 2822

additional_params(可选)

The additional_params parameter can be used to pass additional flags as command line options to the program configured to be used when sending mail, as defined by the sendmail_path configuration setting. For example, this can be used to set the envelope sender address when using sendmail with the -f sendmail option.

This parameter is escaped by escapeshellcmd() internally to prevent command execution. escapeshellcmd() prevents command execution, but allows to add additional parameters. For security reasons, it is recommended for the user to sanitize this parameter to avoid adding unwanted parameters to the shell command.

Since escapeshellcmd() is applied automatically, some characters that are allowed as email addresses by internet RFCs cannot be used. mail() can not allow such characters, so in programs where the use of such characters is required, alternative means of sending emails (such as using a framework or a library) is recommended.

The user that the webserver runs as should be added as a trusted user to the sendmail configuration to prevent a 'X-Warning' header from being added to the message when the envelope sender (-f) is set using this method. For sendmail users, this file is /etc/mail/trusted-users.

返回值

如果邮件成功接受投递,返回 true,否则返回 false

同样重要的是要注意到,邮件仅接受了投递并不意味着邮件实际上达到预定目的地。

更新日志

版本 说明
7.2.0 现在 additional_headers 参数开始支持 array

示例

示例 #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 使用额外标头发送邮件

添加基本 header,告诉 MUA 发件人和回复地址:

<?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 使用 array 形式的额外标头发送邮件

此示例与上面示例发送邮件相同,但将附加 header 作为数组传递(自 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 使用附加命令行参数发送邮件。

The additional_params parameter can be used to pass an additional parameter to the program configured to use when sending mail using the sendmail_path.

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

示例 #5 Sending HTML email

It is also possible to send HTML email with mail().

<?php
// Multiple recipients
$to = 'johny@example.com, sally@example.com'; // note the comma

// Subject
$subject = 'Birthday Reminders for August';

// Message
$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>
'
;

// To send HTML mail, the Content-type header must be set
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-type: text/html; charset=iso-8859-1';

// Additional headers
$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 it
mail($to, $subject, $message, implode("\r\n", $headers));
?>

注意:

If intending to send HTML or otherwise Complex mails, it is recommended to use the PEAR package » PEAR::Mail.

注释

注意:

The SMTP implementation (Windows only) of mail() differs in many ways from the sendmail implementation. First, it doesn't use a local binary for composing messages but only operates on direct sockets which means a MTA is needed listening on a network socket (which can either on the localhost or a remote machine).

Second, the custom headers like From:, Cc:, Bcc: and Date: are not interpreted by the MTA in the first place, but are parsed by PHP.

As such, the to parameter should not be an address in the form of "Something <someone@example.com>". The mail command may not parse this properly while talking with the MTA.

注意:

值得注意的是,mail() 不适合在循环中发送大量邮件。发送每封邮件,此函数为打开和关闭一个套接字,效率不高。

要发送大量邮件,请参阅 » PEAR::Mail» PEAR::Mail_Queue 包。

注意:

以下 RFC 可能有用: » RFC 1896» RFC 2045» RFC 2046» RFC 2047» RFC 2048» RFC 2049» RFC 2822

参见