首页 >后端开发 >php教程 >与phpmailer一起发送PHP中的电子邮件

与phpmailer一起发送PHP中的电子邮件

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-08 10:37:09707浏览

PHPMailer:PHP邮件发送的利器

PHPMailer是广受欢迎的开源PHP邮件发送库,自2001年发布以来,一直是PHP开发者发送程序化邮件的首选方案之一,与Swiftmailer等其他流行库并驾齐驱。本文将阐述为何PHPMailer优于PHP内置的mail()函数,并提供代码示例。

Sending Emails in PHP with PHPMailer

核心要点

  • PHPMailer是一个流行的开源PHP邮件发送库,比PHP内置的mail()函数提供更多功能和灵活性,包括面向对象的接口、更轻松的HTML和附件处理,以及使用非本地邮件服务器的能力。
  • PHPMailer可以使用Composer安装,并被WordPress、Drupal和Joomla等流行的PHP内容管理系统使用。
  • 该库提供强大的错误处理机制,能够以40多种语言打印错误消息,并集成了SMTP协议支持以及SSL和TLS身份验证。
  • 除了发送邮件,PHPMailer还支持添加附件、发送HTML或纯文本版本的邮件,以及使用SMTP从非本地服务器发送邮件,但它不支持使用POP3协议从邮件服务器检索邮件。

PHPMailer与PHP mail()函数的比较

在大多数情况下,PHPMailer是PHP内置mail()函数的替代方案,但在许多情况下,mail()函数的灵活性不足以满足需求。

首先,PHPMailer提供面向对象的接口,而mail()函数不是面向对象的。PHP开发者通常不喜欢使用mail()函数发送邮件时创建$headers字符串,因为这需要大量的转义操作。PHPMailer简化了这个过程。使用mail()函数发送附件和基于HTML的邮件时,开发者还需要编写复杂的代码(转义字符、编码和格式化),而PHPMailer使这变得轻松自如。

此外,mail()函数需要本地邮件服务器才能发送邮件,这并不总是容易设置的。如果具备身份验证功能,PHPMailer可以使用非本地邮件服务器(SMTP)。

其他优势包括:

  • 发送邮件失败时,它可以用40多种语言打印各种错误消息。
  • 它集成了SMTP协议支持以及SSL和TLS身份验证。
  • 它可以为非HTML邮件客户端发送邮件的替代纯文本版本。
  • 它拥有一个非常活跃的开发者社区,使其保持安全和最新状态。

PHPMailer也被WordPress、Drupal和Joomla等流行的PHP内容管理系统使用。

安装PHPMailer

可以使用Composer安装PHPMailer:

<code class="language-bash">composer require phpmailer/phpmailer</code>

使用PHPMailer从本地Web服务器发送邮件

以下是使用PHPMailer从本地Web服务器发送邮件的最简单示例:

<code class="language-bash">composer require phpmailer/phpmailer</code>

PHP文件中的代码和注释应该足够清晰地解释所有正在发生的事情;您可以看到我们在其中设置邮件主题、发件人电子邮件地址、收件人电子邮件地址、HTML邮件正文以及处理错误的地方。

发送包含附件的邮件

以下是如何使用PHPMailer发送包含附件的邮件的示例:

<code class="language-php"><?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

// PHPMailer对象
$mail = new PHPMailer(true); // 构造函数中的参数true启用异常

// 发件人邮箱地址和名称
$mail->From = "from@yourdomain.com";
$mail->FromName = "完整姓名";

// 收件人地址和名称
$mail->addAddress("recepient1@example.com", "收件人姓名");
$mail->addAddress("recepient1@example.com"); // 收件人姓名是可选的

// 收件人回复地址
$mail->addReplyTo("reply@yourdomain.com", "回复");

// 抄送和密送
$mail->addCC("cc@example.com");
$mail->addBCC("bcc@example.com");

// 发送HTML或纯文本邮件
$mail->isHTML(true);

$mail->Subject = "主题文本";
$mail->Body = "<i>HTML格式邮件正文</i>";
$mail->AltBody = "这是邮件内容的纯文本版本";

try {
    $mail->send();
    echo "邮件已成功发送";
} catch (Exception $e) {
    echo "邮件错误:" . $mail->ErrorInfo;
}
?></code>

在这里,我们附加了两个文件——file.txt(位于与脚本相同的目录中)和images/profile.png(位于脚本目录的images目录中)。

要向邮件添加附件,我们只需通过将文件路径作为参数传递来调用PHPMailer对象的addAttachment函数。要附加多个文件,我们需要多次调用它。

故障排除

在我们的两个示例中,我们使用了PHPMailer的Exception类进行调试,因此抛出的任何错误都将帮助我们调试可能发生的任何问题。我们还在PHPMailer构造函数中添加了参数true,以输出更高级别、更具描述性的异常。

根据我们使用的系统,我们可能看到的最大错误将与在后台运行mail()函数有关:

邮件错误:无法实例化邮件函数。

如果我们需要更详细的错误信息,我们还可以向catch子句添加如下内容:

<code class="language-php"><?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require_once "vendor/autoload.php";

$mail = new PHPMailer;

$mail->From = "from@yourdomain.com";
$mail->FromName = "完整姓名";

$mail->addAddress("recipient1@example.com", "收件人姓名");

// 提供附件的文件路径和名称
$mail->addAttachment("file.txt", "File.txt");
$mail->addAttachment("images/profile.png"); // 文件名是可选的

$mail->isHTML(true);

$mail->Subject = "主题文本";
$mail->Body = "<i>HTML格式邮件正文</i>";
$mail->AltBody = "这是邮件内容的纯文本版本";

try {
    $mail->send();
    echo "邮件已成功发送";
} catch (Exception $e) {
    echo "邮件错误:" . $mail->ErrorInfo;
}
?></code>

通常,邮件函数的问题将与缺少邮件服务器设置有关,在这种情况下,error_get_last函数将返回类似以下内容:

<code class="language-php">print_r(error_get_last());</code>

这可能是我们最常遇到的问题,我们可以通过使用SMTP轻松解决它。

显示本地化错误消息

$mail->ErrorInfo可以返回43种不同语言的错误消息。

要以不同的语言显示错误消息,请将语言目录从PHPMailer的源代码复制到项目目录。

例如,要以俄语返回错误消息,请使用以下方法调用将PHPMailer对象设置为俄语:

<code>Array (
    [type] => 2
    [message] => mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set()
    [file] => OUR_PATH \vendor\phpmailer\phpmailer\src\PHPMailer.php
    [line] => 863
)</code>

您还可以将自己的语言文件添加到语言目录。

使用SMTP

您可以使用另一个主机的邮件服务器发送邮件,但这首先需要身份验证。例如,要从Gmail的邮件服务器发送邮件,您需要有一个Gmail帐户。

SMTP是邮件客户端用于向邮件服务器发送邮件发送请求的协议。邮件服务器验证邮件后,将其发送到目标邮件服务器。

以下是从您的域发送来自Gmail邮件服务器的邮件的示例。您不需要本地服务器来运行代码。我们将使用SMTP协议:

<code class="language-bash">composer require phpmailer/phpmailer</code>

Gmail需要通过SMTP进行TLS加密,因此我们相应地进行了设置。在通过SMTP发送之前,您需要找出主机名、端口号、是否需要加密类型以及如果需要身份验证,还需要用户名和密码。请注意,在Gmail上启用双因素身份验证将不允许您使用用户名/密码使用其SMTP。相反,需要额外的配置。

使用远程SMTP而不是本地邮件的一大优势是,如果您使用PHP的mail()函数发送邮件,并将发件人地址域设置为与本地域名(服务器名称)不同的任何内容,则收件人的电子邮件服务器的攻击过滤器会将其标记为垃圾邮件。例如,如果您从主机名为example.com的服务器使用发件人地址name@gmail.com向name@yahoo.com发送邮件,则雅虎的服务器会将其标记为垃圾邮件,或向用户显示一条消息,指示不要信任该邮件,因为邮件的来源是example.com,但它却显示为来自gmail.com。尽管您拥有name@gmail.com,但雅虎无法知道这一点。

使用POP3检索邮件

PHPMailer还允许POP-before-SMTP验证来发送邮件。换句话说,您可以使用POP进行身份验证,并使用SMTP发送邮件。遗憾的是,PHPMailer不支持使用POP3协议从邮件服务器检索邮件。它仅限于发送邮件。

结论

如果您是PHP开发者,几乎不可能避免以编程方式发送邮件。虽然您可以选择Mandrill或SendGrid等第三方服务,但有时这根本不可行,而自己编写邮件发送库更是如此。这就是PHPMailer及其替代方案(Zend Mail、Swift Mailer等)的用武之地。

您可以在存储库wiki或官方文档中了解有关此库的API。

您是否因为PHP库依赖关系而苦恼?观看我们的屏幕录像,了解Composer如何帮助您管理它。

关于PHPMailer的常见问题

什么是PHPMailer?PHPMailer是一个流行的开源PHP库,用于从PHP应用程序发送电子邮件。它提供了一种简单灵活的方式来通过SMTP、mail()或其他电子邮件发送方法发送电子邮件。

如何安装PHPMailer?您可以使用Composer安装PHPMailer,也可以直接从GitHub下载该库。详细的安装说明可以在PHPMailer文档中找到。

PHPMailer是否免费使用?是的,PHPMailer是开源的,并根据LGPL许可证发布,这意味着它可以在开源和商业项目中免费使用。

PHPMailer的系统要求是什么?PHPMailer与PHP 5.5及更高版本兼容。确保您的Web托管环境支持这些PHP版本。

如何使用PHPMailer发送电子邮件?您可以通过创建PHPMailer类的实例、设置必要的属性(如SMTP服务器详细信息和电子邮件内容),然后调用send()方法来使用PHPMailer发送电子邮件。

PHPMailer能否处理电子邮件中的附件?是的,PHPMailer提供方法来向您的电子邮件添加附件。您可以附加来自服务器或远程位置的文件。

什么是SMTP,为什么我应该将其与PHPMailer一起使用?SMTP(简单邮件传输协议)是发送电子邮件的常用方法。将SMTP与PHPMailer一起使用允许您通过远程电子邮件服务器发送电子邮件,从而为电子邮件传递提供更好的控制和可靠性。

我可以用PHPMailer发送HTML电子邮件吗?

是的,PHPMailer允许您发送纯文本和HTML格式的电子邮件。您可以相应地设置消息类型和格式。纯文本电子邮件适用于非HTML邮件客户端。

我可以使用PHPmailer向非HTML邮件客户端发送纯文本电子邮件吗?

是的,PHPMailer允许您发送纯文本电子邮件作为HTML电子邮件的替代方案。您可以相应地设置消息类型和格式。纯文本电子邮件适用于非HTML邮件客户端。

我可以将PHPMailer与非SMTP邮件服务器(如Sendmail)一起使用吗?是的,PHPMailer支持各种电子邮件传输方法,包括SMTP、mail()和其他自定义方法,允许您将其与不同类型的邮件服务器一起使用。

Sending Emails in PHP with PHPMailer

以上是与phpmailer一起发送PHP中的电子邮件的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn