搜尋
首頁後端開發php教程PHP郵件發送使用詳解

PHP郵件發送使用詳解

May 16, 2018 am 11:07 AM
php使用詳解

這次帶給大家PHP郵件發送使用詳解,PHP郵件發送的注意事項有哪些,以下就是實戰案例,一起來看一下。

發送郵件是網站的常用功能,使用者啟動、找回密碼等場景常需要發送郵件到使用者信箱。本文先回顧發送郵件的相關概念,再給出使用PHP發送郵件的範例程式碼。

發送簡訊

從功能來看,簡訊和郵件類似,用途常是通知和安全校驗。發送簡訊(基本上)需要向供應商付費,所以簡訊供應商有動力提供清晰的文檔,易用的介面方便用戶接入。一般而言,發送簡訊的是:

尋找供應商,例如阿里大魚、聚合資料等;

#註冊帳戶,取得appid和appkey;

申請模板;

查看介面文檔,整合到應用程式中;

呼叫API發送簡訊。

流程簡單易懂,接入和使用也十分便捷,基本上一兩小時內就能對接和測試好。用戶無需考慮訊息在通訊過程中的編碼、尋址下發等細節,缺點是要付費。

郵件通常是免費服務,相關支援沒那麼到位,這也要理解。各種程式語言發送郵件的類別庫不少,從信源角度看基本上可以分成兩類:從本機發送和從第三方郵件服務商發送。為了瞭解郵件發送的流程,先介紹一些相關概念。

相關概念

大部分接觸到網路的人都有使用郵件的經驗,但基本上限於郵件用戶端、網頁端和供應商這幾個概念。作為一個開發,理解本節中的以下概念能更好的幫助你掌握郵件通訊中的細節。

MUA : Mail User Agent,郵件用戶代理程式。用戶代理是開發中經常接觸到的詞,主要指 理解人的意圖並代表用戶向資源方請求的工具。例如瀏覽器是最常用的使用者代理,以HTTP/HTTPS協定格式向web伺服器發送請求,並解析回應,渲染後呈現給使用者。郵件用戶代理,常見的是Foxmail、Outlook這類工具,人們寫好郵件後,依格式封裝郵件內容與郵件伺服器通訊。

MTA : Mail Transfer Agent,郵件傳輸代理,幫用戶收發郵件的程式。常說的郵件伺服器指的就是MTA,開源的程式有sendmail,postfix,QMail等。

MRA : Mail Retrieval Agent,郵件收取代理,將使用者的郵件從郵件伺服器取回本機。郵件客戶端是常見的MRA。

SMTP : Simple Mail Transfer Protocol,簡單郵件傳輸協定。使用者與郵件伺服器、郵件伺服器互相傳遞郵件均使用該協定(預設明文,可使用SSL\TLS加密)。

POP3/IMAP : Post Office Protocol version 3/Internet Message Access Protocol,郵局協議版本3或網路資訊取得協議,客戶端從服務端取得郵件時所使用的協定。

用戶A(163郵箱)向用戶B(Gmail郵箱)發信,用戶B獲取信件的過程涉及上述的概念。流程和概念關係可用如下簡圖表示:

用户A --发送邮件--> 用户B
 M|S         M|I
 U|M         R|M
 A|T         A|A
 |P         |P
 v          v
MTA(163)--转发(SMTP)->MTA(gmail)

註:上圖給出的是郵件發送的大體流程,其他MSA、MDA、ESMTP、SMTPS等可能會出現在整個流程中,但不影響郵件收發的理解。下文中會提到的縮寫和概念會註明,其他請自行查詢。

postfix

Linux下發送郵件的軟體主要是sendmail和postfix,它們在系統中充當上文概念中的MTA/MDA(Mail Delivery Agent,郵件投遞代理)角色。它幫助使用者向外發送郵件,接收郵件投遞到使用者信箱(預設位置/var/spool/mail/使用者名稱)。

sendmail是老牌的郵件軟體,知名度非常高。但是Wietse(Wietse Zweitze Venema)用的不爽,所以有了postfix。 postfix指令(幾乎)相容於sendmail,但更有效率且安全(字尾fix的由來),是目前大部分Linux發行版的預設郵件收發軟體,建議使用postfix而非sendmail(本部落格多年前有篇文章寫如何配置sendmail,那時年少無知見識少,打算抽空把那篇文章改一下)。

postfix的主要設定檔是/etc/postfix/main.cf,設定檔的註解非常全,選項基本上是自解釋的。最重要的幾個設定是:myhostname、myorigin、inet_interfaces、inet_protocols以及mydestination(如果你打算收外網來信的話)。需要注意inet_interfaces配置為localhost時,inet_protocols的值應為ipv4,否則可能會出現類似postfix: fatal: parameter inet_interfaces: no local interface found for ::1的錯誤提示。

與郵件相關的幾個常用postfix指令是:

mail或mailx,發送郵件。 tlanyan用戶向root發送郵件:mail -s "Greetings" root@localhost -r tlanyan@localhost,接著終端機中輸入A nice day!,然後回車,按ctrl D結束正文編輯,郵件就已經發送出去。登入root帳號,會提示在/var/spool/mail/root中有新郵件。用tail或其他指令可查看郵件的詳細資料。

postquque,查看郵件發送佇列。 postqueue -p可取代sendmail中的mailq指令,postqueue -f刷新佇列(強制嘗試傳送佇列中的郵件)。

postcat,查看未傳送郵件的資訊。例如postcat -q xxxx(xxxx是postqueue或mailq顯示的未傳送佇列ID)可查看郵件的詳細信息,postcat -b -q xxxxx只查看郵件正文。

postsuper,超級使用者才可使用的郵件管理程式。 postsuper -d xxxx,刪除佇列ID為xxxxx的郵件;postsuper -h xxxxx,暫停佇列ID為xxxx的郵件發送,等。

以上介紹對於發送郵件基本上已足夠。請注意,mail指令發送的郵件能投遞的前提是postfix正在運作(ps aux | grep postfix | grep -v grep輸出不為空)。

有了postfix,設定好後可以對外發送郵件,也能收取外網發送過來的郵件,但限於命令列操作。想用foxmail等客戶端收發郵件,需要讓伺服器支援POP3/IMAP協定。開源的dovecot可以實現這個功能。 dovecot服務於收郵件而非發送,了解其對開發的幫助不大。如果想搭建一套完整的郵件系統(包括網頁端支援、垃圾郵件過濾、病毒查殺、傳輸加密等),建議參考或使用國產開源的 EwoMail。

了解postfix對開發中發送郵件協助有多大?說實話,幾乎沒有幫助。原因是為了防止垃圾郵件氾濫,各大雲端伺服器廠商都屏蔽了25埠(Google Cloud連465都乾掉了)。亞馬遜雲端透過申請還有放行的可能(但有速率和每日額度限制),其他廠商幾乎不會讓你使用自己的網域從本機直接發送郵件。封禁25端口,必須使用第三方的郵件服務,幾乎是業界的標準做法。

聰明的人可能會想到,使用465加密連接埠(基於SMTPS,SMTP over SSL協定)或587連接埠(SMTP over STARTTLS協定)發送郵件,是不是就能繞過限制了?阿里雲/騰訊雲等廠商並不封禁465端口,發送郵件可以使用該端口而無需申請。但注意465和587端口是客戶端和郵件伺服器通訊使用的端口,郵件伺服器之間通訊使用25端口。你可以透過465埠連線到Gmail信箱對外發送郵件,但無法讓postfix使用465埠投遞郵件到hotmail郵件伺服器。

總結來說,sendmail/postfix作為垃圾和詐騙郵件氾濫前的郵件伺服器軟體,對業界貢獻很大。隨著雲端伺服器的盛行,幾乎無法以指向本機的網域名稱向外發送郵件,sendmail/postfix除了在本機內發送提醒郵件,用處已然不大。若要對外寄郵件,或自建機房,或使用第三方郵件系統。

PHP的mail函數

作為PHP開發中,了解sendmail/postfix還是有點用處。 mail函數預設使用sendmail/postfix發送郵件,了解相關配置,就能知道為啥能工作/為啥不能工作。

簡單來說,要讓PHP自帶的mail函數正常運作,需要做以下事情:

#申請域名,在DNS解析中設定MX記錄,指向本機(非合法主機(FQDN, Fully Qualified Domain Name)發送的郵件都會被當做垃圾郵件直接丟棄);

安裝sendmail/postfix,配置軟體並運行;

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

發送效率低、非物件導向的呼叫方式,配置麻煩以及雲端伺服器廠商的封鎖,是使用mail函數的最大阻礙。所以做PHP以來,本人並未直接用過mail函數。

PHP发送邮件

发个邮件要了解这么多,会让人觉得很心累。说好的PHP是最好的语言呢?

PHP发送邮件也可以很简单,推荐方式就是使用Swift Mailer或PHPMailer等类库。引入这些类库后,注册第三方邮箱(比如Gmail、QQ等),填好用户名密码,配置好STMP地址和端口,就能像发送短信一样轻松发送邮件。当然这些类库也支持使用sendmail/postfix发送邮件,但我想你不会再这样做了。

以Swift Mailer为例,直接上代码说明使用PHP发送邮件也是一个非常简单的事情!

首先,在项目中引入Swift Mailer:

composer require "swiftmailer/swiftmailer:^6.0"

然后准备好邮件内容(以文本文件为例,不带附件):

$message = (new Swift_Message('Test Message'))
  ->setFrom(['tlanyan@tlanyan.me' => 'tlanyan'])
  ->setTo(['tlanyan1@tlanyan.me'])
  ->setBody('Hello, this is a test mail from Swift Mailer!');

接着,设置好邮件传输方式(使用Gmail邮箱):

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

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

$transport = (new Swift_SendmailTransport());

最后,使用transport构造mailer实例,发送邮件:

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

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

PHP+MySQL实现消息队列步骤详解

ES6使用技巧总结

以上是PHP郵件發送使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
高流量網站的PHP性能調整高流量網站的PHP性能調整May 14, 2025 am 12:13 AM

TheSecretTokeEpingAphp-PowerEdwebSiterUnningSmoothlyShyunderHeavyLoadInVolvOLVOLVOLDEVERSALKEYSTRATICES:1)emplactopCodeCachingWithOpcachingWithOpCacheToreCescriptexecution Time,2)使用atabasequercachingCachingCachingWithRedataBasEndataBaseLeSendataBaseLoad,3)

PHP中的依賴注入:初學者的代碼示例PHP中的依賴注入:初學者的代碼示例May 14, 2025 am 12:08 AM

你應該關心DependencyInjection(DI),因為它能讓你的代碼更清晰、更易維護。 1)DI通過解耦類,使其更模塊化,2)提高了測試的便捷性和代碼的靈活性,3)使用DI容器可以管理複雜的依賴關係,但要注意性能影響和循環依賴問題,4)最佳實踐是依賴於抽象接口,實現鬆散耦合。

PHP性能:是否可以優化應用程序?PHP性能:是否可以優化應用程序?May 14, 2025 am 12:04 AM

是的,優化papplicationispossibleandessential.1)empartcachingingcachingusedapcutorediucedsatabaseload.2)優化的atabaseswithexing,高效Quereteries,and ConconnectionPooling.3)EnhanceCodeWithBuilt-unctions,避免使用,避免使用ingglobalalairaiables,並避免使用

PHP性能優化:最終指南PHP性能優化:最終指南May 14, 2025 am 12:02 AM

theKeyStrategiestosigantificallyBoostPhpaPplicationPerformenCeare:1)UseOpCodeCachingLikeLikeLikeLikeLikeCacheToreDuceExecutiontime,2)優化AtabaseInteractionswithPreparedStateTementStatementStatementAndProperIndexing,3)配置

PHP依賴注入容器:快速啟動PHP依賴注入容器:快速啟動May 13, 2025 am 12:11 AM

aphpdepentioncontiveContainerIsatoolThatManagesClassDeptions,增強codemodocultion,可驗證性和Maintainability.itactsasaceCentralHubForeatingingIndections,因此reducingTightCightTightCoupOulplingIndeSingantInting。

PHP中的依賴注入與服務定位器PHP中的依賴注入與服務定位器May 13, 2025 am 12:10 AM

選擇DependencyInjection(DI)用於大型應用,ServiceLocator適合小型項目或原型。 1)DI通過構造函數注入依賴,提高代碼的測試性和模塊化。 2)ServiceLocator通過中心註冊獲取服務,方便但可能導致代碼耦合度增加。

PHP性能優化策略。PHP性能優化策略。May 13, 2025 am 12:06 AM

phpapplicationscanbeoptimizedForsPeedAndeffificeby:1)啟用cacheInphp.ini,2)使用preparedStatatementSwithPdoforDatabasequesies,3)3)替換loopswitharray_filtaray_filteraray_maparray_mapfordataprocrocessing,4)conformentnginxasaseproxy,5)

PHP電子郵件驗證:確保正確發送電子郵件PHP電子郵件驗證:確保正確發送電子郵件May 13, 2025 am 12:06 AM

phpemailvalidation invoLvesthreesteps:1)格式化進行regulareXpressecthemailFormat; 2)dnsvalidationtoshethedomainhasavalidmxrecord; 3)

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器