如何使用 PHP mail() 函数发送电子邮件
⚡ 智能摘要
PHP 的 mail 函数是内置函数,它使用服务器的 SMTP 设置直接从 PHP 脚本发送电子邮件。本教程涵盖 mail() 函数的语法和参数、在 php.ini 中配置 SMTP、使用 filter_var 过滤用户输入、发送安全邮件以及 PHP 的使用。Mail确保可靠交付。

什么是 PHP 邮件?
PHP mail 是 PHP 内置函数,用于从 PHP 脚本发送电子邮件。
mail 函数接受以下参数:
- 邮箱
- 咨询内容
- 留言
- 抄送或密送电子邮件地址
为什么以及何时使用 PHP 邮件
邮件功能在很多情况下都很有用:
- 这是一种经济高效的通知用户重要事件的方式。
- 通过在网站上提供联系我们表格并通过电子邮件发送所提供内容,让用户通过电子邮件与您联系。
- 开发者可以利用它通过电子邮件接收系统错误信息。
- 您可以使用它向您的新闻通讯订阅者发送电子邮件。
- 您可以利用它向忘记密码的用户发送密码重置链接。
- 您可以利用它通过电子邮件发送激活和确认链接。这在注册用户和验证其电子邮件地址时非常有用。
使用 PHP 发送邮件
PHP mail 函数的基本语法如下。
<?php mail($to_email_address,$subject,$message,[$headers],[$parameters]); ?>
这里,
- “$to_email_address” 是邮件收件人的电子邮件地址
- “$subject” 是电子邮件主题
- “$message” 是要发送的消息。
- “[$headers]”是可选的;它可以用来包含诸如抄送和密送之类的信息。
- CC是Carbon Copy(抄送)的缩写。当你想要将副本发送给相关人员时,可以使用CC,例如,发送给公司的投诉邮件也可以抄送给投诉委员会。
- BCC是“密送”(blind carbon copy)的缩写。它与CC类似,但BCC部分中包含的电子邮件地址不会显示给其他收件人。
简易 Mail Transmission 协议 (SMTP)
PHP 邮件使用简单模式 Mail Transmission 协议(SMTP)发送邮件。
在托管服务器上,SMTP 设置已经设置好了。
SMTP邮件设置可以在PHP安装文件夹中的“php.ini”文件中进行配置。
要在本地主机上配置 SMTP 设置,假设您正在使用 XAMPP,请执行以下操作: Windows找到目录“C:\xampp\php”中的“php.ini”文件。
- 使用记事本或任何文本编辑器打开它。本例中我们将使用记事本。点击“编辑”菜单。
- 点击“查找…”菜单
- 将出现“查找”对话框
- 点击“查找下一个”按钮
找到 [mail 功能] 下的条目。默认行通常如下所示:
- ;SMTP = 本地主机
- ;smtp_端口 = 25
删除 SMTP 和 smtp_port 前面的分号,并将 SMTP 设置为您的 SMTP服务器 以及您的 SMTP 端口。您的设置应如下所示:
- SMTP = smtp.example.com
- SMTP 端口 = 25
注意:SMTP 设置可以从您的网站托管服务提供商处获取。 如果服务器需要身份验证,则添加以下几行:
- auth_username = example_username@example.com
- auth_password = 示例密码
保存更改并重新启动 Apache (阿帕奇) 服务器。
PHP Mail 例如:
现在让我们来看一个发送简单邮件的例子。
<?php $to_email = 'name@example.com'; $subject = 'Testing PHP Mail'; $message = 'This mail is sent using the PHP mail function'; $headers = 'From: noreply@example.com'; mail($to_email,$subject,$message,$headers); ?>
输出:
注意:以上示例仅包含 4 个必填参数。您应该将上述虚构的电子邮件地址替换为真实的电子邮件地址。
净化电子邮件用户输入
为了简单起见,上面的示例在源代码中使用了电子邮件地址和其他详细信息的硬编码值。
假设您需要创建一个联系我们表单,用户可以在其中填写详细信息并提交。
- 用户可能会无意或有意地在邮件头中注入代码,这可能导致发送垃圾邮件。
- 为了保护您的系统免受此类攻击,您可以创建一个自定义函数,在发送邮件之前清理并验证这些值。
让我们创建一个自定义函数,使用内置函数 filter_var 来验证和清理电子邮件地址。filter_var 函数用于清理和验证用户输入的数据。
它具有以下基本语法。
<?php filter_var($field, SANITIZATION_TYPE); ?>
这里,
- “filter_var(…)” 是验证和清理函数
- “$field”是需要过滤的字段的值。
- “SANITIZATION_TYPE”是指要对字段执行的清理类型,例如:
- 筛选器验证电子邮件 – 对于有效的电子邮件地址返回 true,对于无效的电子邮件地址返回 false。
- 过滤电子邮件 – 从电子邮件地址中删除非法字符,因此包含多余字符的地址将简化为 info@domain.com。
- 过滤消毒URL – 从文本中删除非法字符 URL留下一个干净的地址,例如 https://www.example.com。
- 过滤器清理字符串 – 从字符串值中移除标签,因此“am bold”会变成“am bold”。请注意,此过滤器在 PHP 8.1 中已弃用;请改用 htmlspecialchars() 函数。
以下代码使用自定义函数发送安全邮件。
<?php function sanitize_my_email($field) { $field = filter_var($field, FILTER_SANITIZE_EMAIL); if (filter_var($field, FILTER_VALIDATE_EMAIL)) { return true; } else { return false; } } $to_email = 'name@example.com'; $subject = 'Testing PHP Mail'; $message = 'This mail is sent using the PHP mail function'; $headers = 'From: noreply@example.com'; // check if the email address is invalid $secure_check = sanitize_my_email($to_email); if ($secure_check == false) { echo "Invalid input"; } else { // send email mail($to_email, $subject, $message, $headers); echo "This email is sent using PHP Mail"; } ?>
输出:
安全消息传递 Mail
电子邮件在传输过程中可能会被非预期的收件人拦截。
这可能会将电子邮件内容暴露给非预期收件人。
安全邮件通过以下方式解决了这个问题: transmit例如,使用 SSL 或 TLS 通过加密连接发送电子邮件,例如在端口 465 上使用 SSL 的 SMTP 或在端口 587 上使用 STARTTLS。
加密会在发送邮件之前对邮件内容进行加密处理,因此只有预期的收件人的邮件服务器才能读取邮件内容。
PHPMail呃:比 mail() 更好的替代方案
对于实际应用,大多数开发人员使用 PHP。Mail使用 er 库而不是原始的 mail() 函数。PHPMailer 通过外部 SMTP 服务器进行身份验证,大大提高了邮件送达率,并且简化了附件和 HTML 电子邮件的处理。
使用 Composer 安装,然后通过经过身份验证的加密 SMTP 连接发送邮件,如下所示。
<?php use PHPMailer\PHPMailer\PHPMailer; require 'vendor/autoload.php'; $mail = new PHPMailer(true); $mail->isSMTP(); $mail->Host = 'smtp.example.com'; $mail->SMTPAuth = true; $mail->Username = 'user@example.com'; $mail->Password = 'secret'; $mail->SMTPSecure = 'tls'; $mail->Port = 587; $mail->setFrom('noreply@example.com', 'My App'); $mail->addAddress('name@example.com'); $mail->Subject = 'Testing PHPMailer'; $mail->Body = 'This email is sent using PHPMailer over SMTP'; $mail->send(); ?>
与 mail() 相比,PHPMailer 提供 SMTP 身份验证、内置加密、附件支持和更清晰的错误处理,因此是生产电子邮件的推荐选择。






