南昌雅騰教育今天介紹一個(gè)PHP郵件發(fā)送庫(kù):Swiftmailer,它是一個(gè)類(lèi)似PHPMailer郵件發(fā)送組件,它也支持HTML格式、附件發(fā)送,但它發(fā)送效率相當(dāng)高,成功率也非常高,很多PHP框架都集成了Swiftmailer。
Swiftmailer需要PHP 7.0或更高版本,(proc_*函數(shù)可用。)
安裝
我們使用Composer來(lái)安裝Swiftmailer:
composer require "swiftmailer/swiftmailer:^6.0"
基本使用
只需填寫(xiě)郵箱服務(wù)器相關(guān)配置,然后填寫(xiě)郵件標(biāo)題、發(fā)送對(duì)象和郵件內(nèi)容,運(yùn)行即可完成發(fā)送郵件任務(wù):
require_once '/path/to/vendor/autoload.php'; $transport = (new Swift_SmtpTransport('smtp.163.com', 25)) // 郵箱服務(wù)器 ->setUsername('your username') // 郵箱用戶(hù)名 ->setPassword('your password') // 郵箱密碼,有的郵件服務(wù)器是授權(quán)碼 ; $mailer = new Swift_Mailer($transport); $message = (new Swift_Message('Wonderful Subject')) // 郵件標(biāo)題 ->setFrom(['[email protected]' => 'John Doe']) // 發(fā)送者 ->setTo(['[email protected]', '[email protected]' => 'A name']) //發(fā)送對(duì)象,數(shù)組形式支持多個(gè) ->setBody('Here is the message itself') //郵件內(nèi)容 ; $result = $mailer->send($message);
如果發(fā)送成功,會(huì)返回$result的值為1,即true。
高級(jí)應(yīng)用
發(fā)送郵件時(shí)最關(guān)鍵的是創(chuàng)建消息體,在Swift Mailer中創(chuàng)建消息是通過(guò)使用庫(kù)提供的各種MIME實(shí)體完成的,因此我們不需要花太多時(shí)間去了解如何處理MIME實(shí)體,只需拿來(lái)使用即可。
Swift Mailer提供了創(chuàng)建郵件消息的一系列方法,下面列舉我們常用到的一些方法:
setSubject():郵件主題
setFrom():發(fā)件人地址,數(shù)組形式,可以是多個(gè)發(fā)件人
setTo():收件人地址,數(shù)組形式,可以是多個(gè)收件人
setBody():郵件內(nèi)容
addPart():郵件內(nèi)容指定輸出類(lèi)型,支持html內(nèi)容輸出
attach():添加附件
setCc():抄送,支持多個(gè)郵箱地址
setBcc():密送,支持多個(gè)郵箱地址
常見(jiàn)問(wèn)題
1. 報(bào)錯(cuò)信息:Fatal error: Uncaught Swift_TransportException: Failed to authenticate on SMTP server with username xxx...
很顯然是郵件服務(wù)的賬號(hào)密碼不正確導(dǎo)致驗(yàn)證不能通過(guò)。目前163免費(fèi)郵和QQ郵箱等提供給第三方客戶(hù)端使用的SMTP/POP等服務(wù)需要設(shè)置一個(gè)授權(quán)碼,具體可以到郵箱里設(shè)置。然后將正確的郵箱賬號(hào)和授權(quán)碼配置到Swift Mailer中即可。
2. 報(bào)錯(cuò)信息:PHP Fatal error: Uncaught Swift_TransportException: Connection could not be established with host smtp.163.com
不能連接上郵件服務(wù)器。如果出現(xiàn)這個(gè)情況,建議嘗試改成ssl協(xié)議。筆者在本地使用官方的25端口發(fā)送郵件一切正常,到放到公網(wǎng)服務(wù)器上就提示如上錯(cuò)誤信息了,折騰了好久,改下協(xié)議和端口,成功了:
$transport = (new Swift_SmtpTransport('ssl://smtp.163.com', 465))