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郵件發送使用詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。
