成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

PHP回顧之發(fā)送郵件

smallStone / 2871人閱讀

摘要:隨著云服務(wù)器的盛行,幾乎無(wú)法以指向本機(jī)的域名向外發(fā)送郵件,除了在本機(jī)內(nèi)發(fā)送提醒郵件,用處已然不大。發(fā)送效率低非面向?qū)ο蟮恼{(diào)用方式,配置麻煩以及云服務(wù)器廠(chǎng)商的封鎖,是使用函數(shù)的最大阻礙。

轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review...
PHP回顧系列目錄

PHP基礎(chǔ)

web請(qǐng)求

cookie

web響應(yīng)

session

數(shù)據(jù)庫(kù)操作

加解密

Composer

創(chuàng)建自己的Composer包

發(fā)送郵件是網(wǎng)站的常用功能,用戶(hù)激活、找回密碼等場(chǎng)景常需要發(fā)送郵件到用戶(hù)郵箱。本文先回顧發(fā)送郵件的相關(guān)概念,再給出使用PHP發(fā)送郵件的示例代碼。

發(fā)送短信

從功能上看,短信和郵件類(lèi)似,用途常是通知和安全校驗(yàn)。發(fā)送短信(基本上)需要向供應(yīng)商付費(fèi),所以短信供應(yīng)商有動(dòng)力提供清晰的文檔,易用的接口方便用戶(hù)接入。一般而言,發(fā)送短信的是:

尋找供應(yīng)商,例如阿里大魚(yú)、聚合數(shù)據(jù)等;

注冊(cè)賬戶(hù),獲取appid和appkey;

申請(qǐng)模板;

查看接口文檔,集成到應(yīng)用中;

調(diào)用API發(fā)送短信。

流程簡(jiǎn)單易懂,接入和使用也十分便捷,基本上一兩小時(shí)內(nèi)就能對(duì)接和測(cè)試好。用戶(hù)無(wú)需考慮訊息在通訊過(guò)程中的編碼、尋址下發(fā)等細(xì)節(jié),缺點(diǎn)是要付費(fèi)。

郵件一般是免費(fèi)服務(wù),相關(guān)支持沒(méi)那么到位,這也要理解。各種編程語(yǔ)言發(fā)送郵件的類(lèi)庫(kù)不少,從信源角度看基本可以分成兩類(lèi):從本機(jī)發(fā)送和從第三方郵件服務(wù)商發(fā)送。為了理解郵件發(fā)送的流程,先介紹一些相關(guān)概念。

相關(guān)概念

大部分接觸到互聯(lián)網(wǎng)的人都有使用郵件的經(jīng)驗(yàn),但基本上限于郵件客戶(hù)端、網(wǎng)頁(yè)端和提供商這幾個(gè)概念。作為一個(gè)開(kāi)發(fā),理解本節(jié)中的以下概念能更好的幫你掌握郵件通訊中的細(xì)節(jié)。

MUA : Mail User Agent,郵件用戶(hù)代理。用戶(hù)代理是開(kāi)發(fā)中經(jīng)常接觸到的詞,主要指 理解人的意圖并代表用戶(hù)向資源方請(qǐng)求的工具。例如瀏覽器是最常用的用戶(hù)代理,以HTTP/HTTPS協(xié)議格式向web服務(wù)器發(fā)送請(qǐng)求,并解析響應(yīng),渲染后呈現(xiàn)給用戶(hù)。郵件用戶(hù)代理,常見(jiàn)的是Foxmail、Outlook這類(lèi)工具,人們寫(xiě)好郵件后,按格式封裝郵件內(nèi)容與郵件服務(wù)器通訊。

MTA : Mail Transfer Agent,郵件傳輸代理,幫用戶(hù)收發(fā)郵件的程序。常說(shuō)的郵件服務(wù)器指的就是MTA,開(kāi)源的程序有sendmail,postfix,QMail等。

MRA : Mail Retrieval Agent,郵件收取代理,將用戶(hù)的郵件從郵件服務(wù)器取回本地。郵件客戶(hù)端是常見(jiàn)的MRA。

SMTP : Simple Mail Transfer Protocol,簡(jiǎn)單郵件傳輸協(xié)議。用戶(hù)與郵件服務(wù)器、郵件服務(wù)器互相傳遞郵件均使用該協(xié)議(默認(rèn)明文,可使用SSLTLS加密)。

POP3/IMAP : Post Office Protocol version 3/Internet Message Access Protocol,郵局協(xié)議版本3或網(wǎng)絡(luò)信息獲取協(xié)議,客戶(hù)端從服務(wù)端獲取郵件時(shí)使用的協(xié)議。

用戶(hù)A(163郵箱)向用戶(hù)B(Gmail郵箱)發(fā)信,用戶(hù)B獲取信件的過(guò)程涉及到上述的概念。流程和概念關(guān)系可用如下簡(jiǎn)圖表示:

用戶(hù)A  --發(fā)送郵件--> 用戶(hù)B
 M|S                 M|I
 U|M                 R|M
 A|T                 A|A
  |P                  |P
  v                   v
MTA(163)--轉(zhuǎn)發(fā)(SMTP)->MTA(gmail)

注:上圖給出的是郵件發(fā)送的大體流程,其他MSA、MDA、ESMTP、SMTPS等可能會(huì)出現(xiàn)在整個(gè)流程中,但不影響郵件收發(fā)的理解。下文中會(huì)提到的縮寫(xiě)和概念會(huì)注明,其他請(qǐng)自行查詢(xún)。

postfix

Linux下發(fā)送郵件的軟件主要是sendmail和postfix,它們?cè)谙到y(tǒng)中充當(dāng)上文概念中的MTA/MDA(Mail Delivery Agent,郵件投遞代理)角色。它幫助用戶(hù)向外發(fā)送郵件,接收郵件投遞到用戶(hù)信箱(默認(rèn)位置/var/spool/mail/用戶(hù)名)。

sendmail是老牌的郵件軟件,知名度非常高。但是Wietse(Wietse Zweitze Venema)用的不爽,于是有了postfix。postfix命令(幾乎)兼容于sendmail,但更高效和安全(后綴fix的由來(lái)),是目前大部分Linux發(fā)行版的默認(rèn)郵件收發(fā)軟件,推薦使用postfix而非sendmail(本博客多年前有篇文章寫(xiě)如何配置sendmail,那時(shí)年少無(wú)知見(jiàn)識(shí)少,打算抽空把那篇文章改一下)。

postfix的主要配置文件是/etc/postfix/main.cf,配置文件的注釋非常全,選項(xiàng)基本是自解釋的。最重要的幾個(gè)配置是:myhostname、myorigin、inet_interfaces、inet_protocols以及mydestination(如果你打算收外網(wǎng)來(lái)信的話(huà))。需要注意inet_interfaces配置為localhost時(shí),inet_protocols的值應(yīng)為ipv4,否則可能會(huì)出現(xiàn)類(lèi)似postfix: fatal: parameter inet_interfaces: no local interface found for ::1的錯(cuò)誤提示。

與郵件相關(guān)的幾個(gè)常用postfix命令是:

postquque,查看郵件發(fā)送隊(duì)列。postqueue -p可取代sendmail中的mailq命令,postqueue -f刷新隊(duì)列(強(qiáng)制嘗試發(fā)送隊(duì)列中的郵件)。

postcat,查看未發(fā)送郵件的信息。例如postcat -q xxxx(xxxx是postqueue或者mailq顯示的未發(fā)送隊(duì)列ID)可查看郵件的詳細(xì)信息,postcat -b -q xxxxx只查看郵件正文。

postsuper,超級(jí)用戶(hù)才可使用的郵件管理程序。postsuper -d xxxx,刪除隊(duì)列ID為xxxxx的郵件;postsuper -h xxxxx,暫停隊(duì)列ID為xxxx的郵件發(fā)送,等。

以上介紹對(duì)于發(fā)送郵件基本已足夠。注意,mail命令發(fā)送的郵件能投遞的前提是postfix正在運(yùn)行(ps aux | grep postfix | grep -v grep輸出不為空)。

有了postfix,配置好后可以對(duì)外發(fā)送郵件,也能收取外網(wǎng)發(fā)送過(guò)來(lái)的郵件,但限于命令行操作。想用foxmail等客戶(hù)端收發(fā)郵件,需要讓服務(wù)器支持POP3/IMAP協(xié)議。開(kāi)源的dovecot可以實(shí)現(xiàn)這個(gè)功能。dovecot服務(wù)于收郵件而非發(fā)送,了解其對(duì)開(kāi)發(fā)中的幫助不大。如果想搭建一套完整的郵件系統(tǒng)(包括網(wǎng)頁(yè)端支持、垃圾郵件過(guò)濾、病毒查殺、傳輸加密等),建議參考或使用國(guó)產(chǎn)開(kāi)源的 EwoMail。

了解postfix對(duì)開(kāi)發(fā)中發(fā)送郵件幫助有多大?說(shuō)實(shí)話(huà),幾乎沒(méi)有幫助。原因是為了防止垃圾郵件泛濫,各大云服務(wù)器廠(chǎng)商屏蔽了25端口(Google Cloud連465都干掉了)。亞馬遜云通過(guò)申請(qǐng)還有放行的可能(但有速率和每日額度限制),其他廠(chǎng)商幾乎不會(huì)讓你使用自己的域名從本機(jī)直接發(fā)送郵件。封禁25端口,必須使用第三方的郵件服務(wù),幾乎是業(yè)界的標(biāo)準(zhǔn)做法。

聰明的人可能想到,使用465加密端口(基于SMTPS,SMTP over SSL協(xié)議)或587端口(SMTP over STARTTLS協(xié)議)發(fā)送郵件,是不是就能繞開(kāi)限制了?阿里云/騰訊云等廠(chǎng)商并不封禁465端口,發(fā)送郵件可以使用該端口而無(wú)需申請(qǐng)。但注意465和587端口是客戶(hù)端和郵件服務(wù)器通訊使用的端口,郵件服務(wù)器之間通訊使用25端口。你可以通過(guò)465端口連接到Gmail郵箱對(duì)外發(fā)送郵件,但無(wú)法讓postfix使用465端口投遞郵件到hotmail郵件服務(wù)器。

總結(jié)來(lái)說(shuō),sendmail/postfix作為垃圾和欺詐郵件泛濫前的郵件服務(wù)器軟件,對(duì)業(yè)界貢獻(xiàn)很大。隨著云服務(wù)器的盛行,幾乎無(wú)法以指向本機(jī)的域名向外發(fā)送郵件,sendmail/postfix除了在本機(jī)內(nèi)發(fā)送提醒郵件,用處已然不大。要對(duì)外發(fā)送郵件,要么自建機(jī)房,要么使用第三方郵件系統(tǒng)。

PHP的mail函數(shù)

作為PHP開(kāi)發(fā)中,了解sendmail/postfix還是有點(diǎn)用處。mail函數(shù)默認(rèn)使用sendmail/postfix發(fā)送郵件,了解相關(guān)配置,就能知道為啥能工作/為啥不能工作。

簡(jiǎn)單來(lái)說(shuō),要讓PHP自帶的mail函數(shù)正常工作,需要做以下事情:

申請(qǐng)域名,在DNS解析中設(shè)置MX記錄,指向本機(jī)(非合法主機(jī)(FQDN, Fully Qualified Domain Name)發(fā)送的郵件都會(huì)被當(dāng)做垃圾郵件直接丟棄);

安裝sendmail/postfix,配置軟件并運(yùn)行;

配置防火墻、安全組,放行端口。

發(fā)送效率低、非面向?qū)ο蟮恼{(diào)用方式,配置麻煩以及云服務(wù)器廠(chǎng)商的封鎖,是使用mail函數(shù)的最大阻礙。所以做PHP以來(lái),本人并未直接用過(guò)mail函數(shù)。

PHP發(fā)送郵件

發(fā)個(gè)郵件要了解這么多,會(huì)讓人覺(jué)得很心累。說(shuō)好的PHP是最好的語(yǔ)言呢?

PHP發(fā)送郵件也可以很簡(jiǎn)單,推薦方式就是使用Swift MailerPHPMailer等類(lèi)庫(kù)。引入這些類(lèi)庫(kù)后,注冊(cè)第三方郵箱(比如Gmail、QQ等),填好用戶(hù)名密碼,配置好STMP地址和端口,就能像發(fā)送短信一樣輕松發(fā)送郵件。當(dāng)然這些類(lèi)庫(kù)也支持使用sendmail/postfix發(fā)送郵件,但我想你不會(huì)再這樣做了。

Swift Mailer為例,直接上代碼說(shuō)明使用PHP發(fā)送郵件也是一個(gè)非常簡(jiǎn)單的事情!

首先,在項(xiàng)目中引入Swift Mailer

composer require "swiftmailer/swiftmailer:^6.0"

然后準(zhǔn)備好郵件內(nèi)容(以文本文件為例,不帶附件):

$message = (new Swift_Message("Test Message"))
    ->setFrom(["[email protected]" => "tlanyan"])
    ->setTo(["[email protected]"])
    ->setBody("Hello, this is a test mail from Swift Mailer!");

接著,設(shè)置好郵件傳輸方式(使用Gmail郵箱):

$transport = (new Swift_SmtpTransport("smtp.gmail.com", 465, "ssl"))
    ->setUsername("username")
    ->setPassword("password");

或者使用sendmail/postfix的方式(不推薦):

$transport = (new Swift_SendmailTransport());

最后,使用transport構(gòu)造mailer實(shí)例,發(fā)送郵件:

$mailer = new Swift_Mailer($transport);
$result = $mailer->send($message);

老板再也不用擔(dān)心發(fā)送郵件收不到了,So easy!

總結(jié)

本文先回顧了發(fā)送郵件的相關(guān)概念,說(shuō)明不推薦使用內(nèi)置的mail函數(shù)原因,最后給出了使用第三方類(lèi)庫(kù)發(fā)送郵件的代碼示例。

感謝閱讀,歡迎評(píng)論指正!

參考

http://cn.linux.vbird.org/lin...

http://doc.ewomail.com/ewomai...

http://php.net/manual/en/func...

https://swiftmailer.symfony.com

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28596.html

相關(guān)文章

  • PHP回顧socket編程

    摘要:如果你想體驗(yàn)原味編程,用開(kāi)頭的比較適合否則建議使用流函數(shù)。有關(guān)流的知識(shí),請(qǐng)參考本人之前的博文回顧之流。接下來(lái)我們用流函數(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的客戶(hù)端和服務(wù)端。流函數(shù)中的和兩個(gè)函數(shù)是我們想要的。本文目的是簡(jiǎn)要介紹中的編程,行文到此已經(jīng)達(dá)到目的。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie w...

    tomorrowwu 評(píng)論0 收藏0
  • PHP回顧IO

    摘要:命令行時(shí)返回值為,標(biāo)準(zhǔn)輸入輸出均指向終端可用進(jìn)程號(hào)查看。會(huì)在腳本執(zhí)行完畢后關(guān)閉三個(gè)流,無(wú)需用戶(hù)手動(dòng)關(guān)閉。與遠(yuǎn)程網(wǎng)址交互是一個(gè)請(qǐng)求和響應(yīng)的過(guò)程,其中細(xì)節(jié)可參考本人之前的文章回顧之請(qǐng)求和回顧之響應(yīng),也可參考協(xié)議的權(quán)威文檔。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) ses...

    happen 評(píng)論0 收藏0
  • PHP回顧執(zhí)行流程及相關(guān)概念

    摘要:通過(guò),腳本層無(wú)需過(guò)多考慮執(zhí)行的具體環(huán)境,而本身則可以讓針對(duì)自己的特點(diǎn)給出特有實(shí)現(xiàn)。模式下,也只執(zhí)行一次。這幾個(gè)概念的關(guān)系如下網(wǎng)關(guān)協(xié)議,與語(yǔ)言無(wú)關(guān),所以與關(guān)系也不大??偨Y(jié)本文簡(jiǎn)要回顧了程序的架構(gòu)和執(zhí)行流程,并對(duì)幾個(gè)容易混淆概念做了介紹。 轉(zhuǎn)載請(qǐng)注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie we...

    jsdt 評(píng)論0 收藏0
  • PHP回顧多進(jìn)程編程

    摘要:多進(jìn)程中與多進(jìn)程相關(guān)的兩個(gè)重要拓展是和。函數(shù)執(zhí)行期間,主進(jìn)程除了等待無(wú)法處理其他任務(wù),所以一般不認(rèn)為這是多進(jìn)程編程。回收子進(jìn)程有兩種方式,一種是主進(jìn)程調(diào)用函數(shù)等待子進(jìn)程結(jié)束另外一種是處理信號(hào)。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie web響應(yīng) session 數(shù)據(jù)庫(kù)操作 加解...

    lifesimple 評(píng)論0 收藏0
  • 利用 Composer 完善自己的 PHP 框架(二)——發(fā)送郵件

    說(shuō)明 原文發(fā)表在我的個(gè)人網(wǎng)站:利用 Composer 完善自己的 PHP 框架(二)——發(fā)送郵件 本教程示例代碼見(jiàn) https://github.com/johnlui/My-First-Framework-based-on-Composer 回顧 上一篇文章中,我們手工建造了一個(gè)簡(jiǎn)易的視圖加載器,順便引入了錯(cuò)誤處理包,讓我們的 MFFC 框架在 M、V、C 三個(gè)方面都達(dá)到了好用的水平。V...

    crossea 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<