如何使用 PHP mail() 函数发送电子邮件

⚡ 智能摘要

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

  • 📧 mail() 函数的作用: mail() 函数从脚本发送电子邮件,接受收件人、主题、消息和可选的标头。
  • 📨 SMTP传输: PHP 邮件依赖于 SMTP,其主机、端口和身份验证在 php.ini 配置文件中设置。
  • 📋 抄送和密送: 可选的邮件头可以添加抄送和密送收件人,密送收件人对其他收件人隐藏。
  • 🛡️ 输入内容需经过清理: 使用 FILTER_SANITIZE_EMAIL 和 FILTER_VALIDATE_EMAIL 的 filter_var 可以阻止从联系表单输入中注入标头。
  • 🔒 安全消息传递 Mail: 使用 SSL 或 TLS 加密连接可以保护消息内容在传输过程中不被读取。
  • 🧰 使用 PHPMailER: PHPMailer 添加了 SMTP 身份验证、附件和 HTML 电子邮件,使其比原始 mail() 更可靠。
  • 🤖 人工智能辅助: AI 工具可以配置 PHPMail解决 SMTP 相关问题,并提出修复建议,以防止您的电子邮件被误判为垃圾邮件。

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 Transmission 协议

  • 点击“查找…”菜单

简易 Mail Transmission 协议

  • 将出现“查找”对话框

简易 Mail Transmission 协议

  • 点击“查找下一个”按钮

简易 Mail Transmission 协议

找到 [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);
?>

输出:

简易 Mail Transmission 协议

注意:以上示例仅包含 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 身份验证、内置加密、附件支持和更清晰的错误处理,因此是生产电子邮件的推荐选择。

常见问题

最常见的原因是本地主机上未配置邮件服务器。请在 php.ini 中设置正确的 SMTP 值,或使用 PHP。Mail请使用已验证的 SMTP 帐户进行检查。同时,请检查服务器错误日志和垃圾邮件文件夹。

添加标头,将 MIME-Version 设置为 1.0,Content-Type 设置为 text/html,然后在邮件正文中放入 HTML 标记。PHPMail当您设置其 isHTML(true) 选项时,er 会自动处理此问题。

自 PHP 8.1 起,FILTER_SANITIZE_STRING 已被弃用。请使用 htmlspecialchars() 对输出进行转义以进行显示,或者使用特定的验证器(例如 FILTER_VALIDATE_EMAIL),具体取决于您是要清理还是检查值。

是的。只需向 AI 提供您的 SMTP 主机、端口和安全类型,它就能生成完整的 PHP 代码。Mail设置身份验证、发送方、接收方和错误处理机制。将凭据存储在环境变量中,而不是代码中。

是的。人工智能可以就 SPF、DKIM 和 DMARC 记录、使用经过身份验证的 SMTP 发件人、避免垃圾邮件触发词以及设置有效的发件人地址提供建议,然后帮助您测试送达率。

总结一下这篇文章: