PHPMailer 可能是最流行的用于發(fā)送電子郵件的開(kāi)源 PHP 庫(kù)。它于 2001 年首次發(fā)布,從那時(shí)起,除了Swiftmailer等還有一部分人喜歡使用之外,PHPMailer已成為 PHP 開(kāi)發(fā)人員最喜歡的發(fā)送電子郵件的方式的php庫(kù)。
在本文中,也順便討論以下為什么應(yīng)該使用 PHPMailer 而不是 PHP 的mail()函數(shù),并且我們將展示一些有關(guān)如何使用該庫(kù)的代碼示例。
PHPMailer 是 PHP mail() 函數(shù)的替代品嗎?
在大多數(shù)情況下,PHPMailer 只是內(nèi)置 PHP mail()函數(shù)的替代品,但在許多其他情況下,該mail()函數(shù)根本不夠靈活,無(wú)法實(shí)現(xiàn)您所需要的功能。
首先,PHPMailer提供了面向?qū)ο蟮慕涌?,而PHPMailermail()并不是面向?qū)ο蟮摹?headersPHP 開(kāi)發(fā)人員通常討厭在使用該函數(shù)發(fā)送電子郵件時(shí)創(chuàng)建字符串mail(),因?yàn)樗鼈冃枰罅哭D(zhuǎn)義。PHPMailer 使這變得輕而易舉。開(kāi)發(fā)人員在使用該功能時(shí)還需要編寫臟代碼(轉(zhuǎn)義字符、編碼和格式)來(lái)發(fā)送附件和基于 HTML 的電子郵件mail(),而 PHPMailer 使這一切變得輕松。
此外,該mail()功能需要本地郵件服務(wù)器來(lái)發(fā)送電子郵件,這并不總是很容易設(shè)置。如果您有身份驗(yàn)證,PHPMailer 可以使用非本地郵件服務(wù)器 (SMTP)。
其他優(yōu)點(diǎn)包括:
當(dāng)發(fā)送電子郵件失敗時(shí),它可以打印40多種語(yǔ)言的各種錯(cuò)誤消息。
它集成了 SMTP 協(xié)議支持以及基于 SSL 和 TLS 的身份驗(yàn)證。
它可以為非 HTML 電子郵件客戶端發(fā)送替代的純文本版本的電子郵件。
它有一個(gè)非?;钴S的開(kāi)發(fā)者社區(qū),可以保證其安全和最新。
PHPMailer 還被流行的 PHP 內(nèi)容管理系統(tǒng)(例如 WordPress、Drupal 和 Joomla)使用。
安裝 PHPMailer
您可以使用 Composer 安裝 PHPMailer :
composer require phpmailer/phpmailer
如果你沒(méi)有composer 可以通過(guò)以下鏈接直接下載源代碼使用:
https://github.com/PHPMailer/PHPMailer
使用 PHPMailer 從本地 Web 服務(wù)器發(fā)送電子郵件
下面是使用 PHPMailer 從本地 Web 服務(wù)器發(fā)送電子郵件的最簡(jiǎn)單示例:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; //PHPMailer對(duì)象 $mail = new PHPMailer(true); //構(gòu)造函數(shù)中的參數(shù) true 啟用異常 //來(lái)自電子郵件地址和姓名 $mail->From = "from@yourdomain.com"; $mail->FromName = "Full Name"; //地址和姓名 $mail->addAddress("recepient1@example.com", "Recepient Name"); $mail->addAddress("recepient1@example.com"); //Recipient name is optional //收件人要回復(fù)的地址 $mail->addReplyTo("reply@yourdomain.com", "Reply"); //抄送和密件抄送 $mail->addCC("cc@example.com"); $mail->addBCC("bcc@example.com"); //發(fā)送 HTML 或純文本電子郵件 $mail->isHTML(true); $mail->Subject = "主題文本"; $mail->Body = "<i>HTML 格式的郵件正文</i>"; $mail->AltBody = "這是電子郵件內(nèi)容的純文本版本"; try { $mail->send(); echo "消息發(fā)送成功"; } catch (Exception $e) { echo "郵件錯(cuò)誤:" . $mail->ErrorInfo; }
PHP 文件中的代碼和注釋應(yīng)該足夠清晰,能夠解釋所發(fā)生的一切;您可以看到我們?cè)谀睦镌O(shè)置郵件主題、發(fā)件人電子郵件地址、收件人電子郵件地址、HTML 郵件正文以及處理錯(cuò)誤。
發(fā)送帶有附件的電子郵件
以下是如何使用 PHPMailer 發(fā)送帶有附件的電子郵件的示例:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; $mail = new PHPMailer; $mail->From = "from@yourdomain.com"; $mail->FromName = "Full Name"; $mail->addAddress("recipient1@example.com", "Recipient Name"); //提供文件路徑和附件名稱 $mail->addAttachment("file.txt", "File.txt"); $mail->addAttachment("images/profile.png"); //文件名可選 $mail->isHTML(true); $mail->Subject = "主題文本"; $mail->Body = "<i>HTML 格式的郵件正文</i>"; $mail->AltBody = "這是電子郵件內(nèi)容的純文本版本"; try { $mail->send(); echo "Message has been sent successfully"; } catch (Exception $e) { echo "Mailer Error: " . $mail->ErrorInfo; }
在這里,我們附加兩個(gè)文件 - file.txt,它位于與腳本相同的目錄中,以及images/profile.png,它位于images腳本目錄的目錄中。
要將附件添加到電子郵件中,我們只需addAttachment通過(guò)傳遞文件路徑作為參數(shù)來(lái)調(diào)用 PHPMailer 對(duì)象的函數(shù)。為了附加多個(gè)文件,我們需要多次調(diào)用它。
故障排除
在我們的兩個(gè)示例中,我們使用 PHPMailer 的Exception 類進(jìn)行調(diào)試(https://github.com/PHPMailer/PHPMailer/blob/master/src/Exception.php),因此拋出的任何錯(cuò)誤都將幫助我們調(diào)試可能發(fā)生的任何問(wèn)題。我們還在PHPMailer 構(gòu)造函數(shù)true中添加了參數(shù)(https://github.com/PHPMailer/PHPMailer/blob/master/src/PHPMailer.php#L819),以輸出更高級(jí)別、更具描述性的異常。
根據(jù)我們使用的系統(tǒng),我們最??吹降腻e(cuò)誤可能與mail()在后臺(tái)運(yùn)行該函數(shù)有關(guān):
郵件程序錯(cuò)誤:無(wú)法實(shí)例化郵件功能。
如果我們需要有關(guān)錯(cuò)誤的更多詳細(xì)信息,我們還可以在 catch 子句中添加如下內(nèi)容:
print_r(error_get_last());
通常,郵件功能的問(wèn)題與缺少郵件服務(wù)器設(shè)置有關(guān),在這種情況下,該error_get_last功能將返回如下內(nèi)容:
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 )
這是我們最常遇到的問(wèn)題,使用 SMTP 就可以輕松解決。
顯示本地化錯(cuò)誤消息
$mail->ErrorInfo可以返回 43 種不同語(yǔ)言的錯(cuò)誤消息。
要以不同的語(yǔ)言顯示錯(cuò)誤消息,請(qǐng)將language目錄從 PHPMailer 的源代碼復(fù)制到項(xiàng)目目錄。
例如,要以俄語(yǔ)返回錯(cuò)誤消息,請(qǐng)使用以下方法調(diào)用將 PHPMailer 對(duì)象設(shè)置為俄語(yǔ):
$mail->setLanguage("ru");
您還可以將自己的語(yǔ)言文件添加到該language目錄中。
使用 SMTP
您可以使用其他主機(jī)的郵件服務(wù)器發(fā)送電子郵件,但為此您首先需要進(jìn)行身份驗(yàn)證。例如,要從 Gmail 的郵件服務(wù)器發(fā)送電子郵件,您需要擁有 Gmail 帳戶。
SMTP 是郵件客戶端用來(lái)向郵件服務(wù)器發(fā)送電子郵件發(fā)送請(qǐng)求的協(xié)議。郵件服務(wù)器驗(yàn)證電子郵件后,會(huì)將其發(fā)送到目標(biāo)郵件服務(wù)器。
以下是從您所在域的 Gmail 郵件服務(wù)器發(fā)送電子郵件的示例。您不需要本地服務(wù)器來(lái)運(yùn)行代碼。我們將使用 SMTP 協(xié)議:
<?php use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; require_once "vendor/autoload.php"; $mail = new PHPMailer(true); //啟用SMTP調(diào)試。 $mail->SMTPDebug = 3; //設(shè)置PHPMailer使用SMTP。 $mail->isSMTP(); //設(shè)置SMTP主機(jī)名 $mail->Host = "smtp.gmail.com"; //如果 SMTP 主機(jī)需要身份驗(yàn)證才能發(fā)送電子郵件,則將此設(shè)置為 $mail->SMTPAuth = true; //提供用戶名和密碼 $mail->Username = "name@gmail.com"; $mail->Password = "super_secret_password"; //如果SMTP需要TLS加密則設(shè)置它 $mail->SMTPSecure = "tls"; //設(shè)置要連接的TCP端口 $mail->Port = 587; $mail->From = "name@gmail.com"; $mail->FromName = "Full Name"; $mail->addAddress("name@example.com", "Recepient Name"); $mail->isHTML(true); $mail->Subject = "Subject Text"; $mail->Body = "<i>Mail body in HTML</i>"; $mail->AltBody = "This is the plain text version of the email content"; try { $mail->send(); echo "Message has been sent successfully"; } catch (Exception $e) { echo "Mailer Error: " . $mail->ErrorInfo; }
Gmail 需要通過(guò) SMTP 進(jìn)行 TLS 加密,因此我們進(jìn)行了相應(yīng)的設(shè)置。在通過(guò) SMTP 發(fā)送之前,您需要查明主機(jī)名、端口號(hào)、加密類型(如果需要),如果需要身份驗(yàn)證,您還需要用戶名和密碼。請(qǐng)注意,在 Gmail 上啟用雙因素身份驗(yàn)證將不允許您通過(guò)用戶名/密碼使用其 SMTP。相反,將需要額外的配置(http://webapps.stackexchange.com/questions/31297/gmail-rejects-smtp-password-with-2-factor-authentication)。
與本地郵件相比,使用遠(yuǎn)程 SMTP 的一大優(yōu)勢(shì)是,如果您使用 PHP 的mail()功能發(fā)送電子郵件,并將from地址域設(shè)置為本地域名(服務(wù)器名稱)以外的任何內(nèi)容,那么收件人的電子郵件服務(wù)器的攻擊過(guò)濾器將對(duì)其進(jìn)行標(biāo)記作為垃圾郵件。例如,如果您從具有實(shí)際主機(jī)名example.com且from地址name@gmail.com為 的name@yahoo.com服務(wù)器發(fā)送一封電子郵件,則雅虎的服務(wù)器會(huì)將其標(biāo)記為垃圾郵件或向用戶顯示一條消息,要求用戶不要信任該電子郵件,因?yàn)樵撪]件的來(lái)源是,但example.com它本身卻存在仿佛來(lái)自gmail.com。盡管您擁有name@gmail.com,但雅虎無(wú)法發(fā)現(xiàn)這一點(diǎn)。
使用 POP3 檢索電子郵件
PHPMailer 還允許POP-before-SMTP驗(yàn)證來(lái)發(fā)送電子郵件(http://en.wikipedia.org/wiki/POP_before_SMTP)。換句話說(shuō),您可以使用 POP 進(jìn)行身份驗(yàn)證并使用 SMTP 發(fā)送電子郵件。遺憾的是,PHPMailer 不支持使用 POP3 協(xié)議從郵件服務(wù)器檢索電子郵件。它僅限于發(fā)送電子郵件。
結(jié)論
如果您是一名 PHP 開(kāi)發(fā)人員,那么幾乎不可能避免以編程方式發(fā)送電子郵件。雖然您可能會(huì)選擇 Mandrill 或 SendGrid 等第三方服務(wù),但有時(shí)這并不是一個(gè)選擇,而滾動(dòng)您自己的電子郵件發(fā)送庫(kù)則更是如此。這就是 PHPMailer 及其替代品(Zend Mail、Swift Mailer 等)的用武之地。
您可以在存儲(chǔ)庫(kù) wiki或官方文檔中了解該庫(kù)的 API 。
存儲(chǔ)庫(kù) wiki:https://github.com/PHPMailer/PHPMailer/wiki文章來(lái)源:http://www.zghlxwxcb.cn/article/401.html
官方文檔:http://phpmailer.github.io/PHPMailer/文章來(lái)源地址http://www.zghlxwxcb.cn/article/401.html
到此這篇關(guān)于php實(shí)現(xiàn)發(fā)送電子郵件功能,使用PHPMailer的文章就介紹到這了,更多相關(guān)內(nèi)容可以在右上角搜索或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!