首頁 後端開發 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

熱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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

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

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

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

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

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

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

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

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

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

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

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

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

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

See all articles