1. 程式人生 > >轉自Linux社群:PHP傳送郵件之頭頭是道完全釋疑

轉自Linux社群:PHP傳送郵件之頭頭是道完全釋疑

站應用中向客戶傳送郵件是常見的一個功能。SMTP協議貌似簡單,而且資料繁多,但要徹底搞清楚客戶端伺服器之間的身份和關係處理,也不是件容易的事。

本文簡明扼要對smtp交換過程中身份和條件進行說明,使初次接觸smtp開發的能有個清晰的處理思路。錯誤之處請多指正。

先說說smtp的基本原理, 郵件客戶端(outlook)和傳送方smtp伺服器之間,  傳送方smtp伺服器和接受方smtp伺服器之間,走的都是smtp協議.

先說說我們最常見的情況:用outlook發郵件,從 [email protected] 發往 [email protected]。 outlook裡寫好郵件後傳送,會連線到帳號裡登記的smtp伺服器25埠,開始smtp會話:

   mail from: <[email protected]>
   rcpt to:<[email protected]>

linuxidc.com伺服器發現郵件的mail from 是本域的(linuxidc.com),這種情況下smtp伺服器一般需要驗證使用者身份,驗證通過提交郵件,郵件進入伺服器的傳送佇列。 伺服器投遞郵件的程序或執行緒,掃描傳送佇列,取出郵件後分析要往哪發。 伺服器發現郵件是發往 linuxidc.net,不是本域,先通過dns伺服器查詢 linuxidc.net域的mx記錄,假設為 smtp.linuxidc.net,郵件投遞程序連線 smtp.linuxidc.net 的25埠,開始smtp會話

   mail from: <[email protected]>
   rcpt to:<[email protected]>

linuxidc.net伺服器判斷郵件是來自別的域,發往本域,所以不需要驗證使用者。不過有可能的情況是linuxidc.net伺服器先檢查一下發信伺服器的ip地址,和mail from 裡的域名對應的mx記錄是否匹配,不匹配的拒收。如果沒有符合什麼拒收條件,那麼linuxidc.net手下這封信,放入rose的郵件夾,rose可以通過pop3收取郵件。

如果 linuxidc.com傳送郵件失敗的話,郵件進入傳送失敗佇列,可能直接扔掉,或者再試著重發n次,如果都不成功,會通知發件人或別的什麼,這要看伺服器的處理。

現在再說說php發郵件,首先要搞清楚,要用什麼身份傳送郵件。第一種:把自己當作outlook之類的客戶端,先連到發信伺服器,提交郵件後讓發件伺服器往外發送。第二種:把自己當作發信伺服器,直接通過smtp連線收件人的伺服器傳送郵件。

這裡我不推薦第二種方式,原因是:如果你php所在伺服器的域名,ip,mx記錄沒有嚴格設定好的話,一般收件伺服器有很大的機率會拒收;傳送郵件本身的傳輸過程時間無法控制,如果和收件伺服器有很大的延時,會嚴重影響自己的web伺服器的工作,另外也不具有失敗重發等處理。

對於傳送郵件,windows和unix和很大的差別。windows一般來說都是像outlook那樣的方式,用smtp協議連到發件伺服器傳送郵件。unix有自己的傳統方式,就是unix主機自帶 smtp server,傳統的就是sendmail。另外還有個“sendmail”的概念,這裡說的是一個程式的名字,無論是sendmail,qmail,postfix等等,都提供這個命令程式,通過它,可以把郵件放入本地郵件傳送佇列,讓sendmail,qmail,postfix之類的投遞程式去投遞傳送。sendmail程式一般是從標準輸入裡讀入郵件內容。php的mail()函式實際上會開啟sendmail程式,通過標準輸入把郵件內容傳給它,由sendmail程式來發送,剩下的就不管了。

所以大家可以看到,php裡關於mail() 這個函式的說明,如果是在windows上,一般是設定 php.ini裡 SMTP 和 smtp_port 選項的值,通過類outlook客戶端的方式傳送,但是這種方式的致命弱點是不支援smtp驗證,而現在郵件伺服器基本都是需要smtp驗證的。uxni下一般需要設定 sendmail_path ,來說明sendmail程式的路徑。當然windows上也可以用sendmail程式傳送。

如果是unix,最理想的情況是,你的php所在的web伺服器本身也是個smtp server,並設定好了mx記錄等等,或者你有個能傳送郵件的sendmail程式(自己寫,封裝smtp傳送)那麼先配置好 php.ini 裡的sendmail_path,通過mail()函式就直接傳送了。

如果沒有能用的sendmail程式,那麼就要通過socket 用smtp協議傳送了,php這方面有很多擴充套件的庫,可以直接拿來用。建議連上一個伺服器讓他幫你發,不建議直接連收件伺服器(原因前面說了)。這裡還有就是不建議直接在網頁上php裡連線傳送,推薦的方式是把郵件寫到資料庫或檔案裡,讓另一個程式(php,perl,python 都可以寫)掃描後通過sokcet連線傳送。這樣既給使用者有了好的響應體驗,也可以控制傳送的過程。


相關推薦

Linux社群PHP傳送郵件頭頭是道完全釋疑

站應用中向客戶傳送郵件是常見的一個功能。SMTP協議貌似簡單,而且資料繁多,但要徹底搞清楚客戶端伺服器之間的身份和關係處理,也不是件容易的事。 本文簡明扼要對smtp交換過程中身份和條件進行說明,使初次接觸smtp開發的能有個清晰的處理思路。錯誤之處請多指正。 先說說sm

Linux配置sendmail實現PHP傳送郵件

1.安裝sendmail yum -y install sendmail 2.安裝mail命令 yum -y install mailx 3.開啟sendmail /etc/rc.d/init.d/sendmail start 4.設定開機啟動 vim /etc/rc.local 最後一行新增上:

如何高效率學習R?[微信R語言中文社群

學R主要在於5點三階段: 第一階段有一點: 基礎的檔案操作(read.*, write.*)、資料結構知識,認識什麼是資料框(data.frame)、列表(list)、矩陣(matrix)、向量(vector),如何提取(包括which, []等)、置換(t, mat

: linux svn命令列無法拉取中文名稱的檔案

轉自: https://blog.csdn.net/shaohui/article/details/3996274#commentBox   svn: Can't convert string from 'UTF-8' to&

阿里雲 Linux 啟用465埠傳送郵件

阿里雲 Linux 啟用465埠傳送郵件 環境:阿里雲 Linux Centos 7.4 x64 注:阿里雲預設禁用25郵件埠,需要啟動465埠加密進行郵件傳送。 注:確保郵箱開啟SMTP服務,POP3,並申請了密碼。 注:確保已經安裝mailx,sendmaill,dos2unix 安裝教程:ht

PHP傳送郵件PHPMailer》系列分享專欄

《PHP傳送郵件PHPMailer》已整理成PDF文件,點選可直接下載至本地查閱https://www.webfalse.com/read/201726.html 文章 PHPMailer郵件類利用smtp.163.com傳送郵件方法 PHPMailer安裝方法及簡單例項

Linux實用技巧——mail傳送郵件命令以及中文亂碼解決

文章目錄 0 前言及準備 1 mailx安裝及配置 1.1 安裝 1.2 編輯配置檔案 2 傳送郵件 2.1 無正文郵件 2.2 有正文郵件 3 郵件中文亂碼問題解決

使用PHP傳送郵件

來源:慕課網教程 一、用composer安裝nette/mail composer require nette/mail 在當前資料夾下生成vendor資料夾,composer.json檔案,composer.lock檔案。 二、資料庫 程

linux伺服器,無法傳送郵件

問題:用java寫了發郵件的程式,在本地使用可以正常傳送,放到阿里雲伺服器上無法傳送郵件,提示 Could not connect to SMTP host: mail.163.com, port: 25很是鬱悶,網上的解釋鋪天蓋地,試了一個遍,最終找個一個靠譜的,看來網上

PHP傳送郵件詳細說明

這兩天琢磨了php得原生髮送郵件,發現自帶得mail方法不太好用,於是上網查詢了好多方法,親測以下方法能用 原始碼都在 我的github 到github上下載 [https://github.com/PHPMailer/PHPMailer](https://githu

使用PHP傳送郵件的兩種方法

今天研究了一下使用PHP來發送電子郵件,總結了一下,有這麼兩種方法: 一、使用PHP內建的mail()函式 看了一下手冊,就直接開始寫程式碼了,如下 <?php $to = "[email protected]"; //收件人 $subject = "T

linux中用命令mail傳送郵件

把文字資訊作為郵件內容傳送給[email protected] cat a.txt|mail -s hello [email protected] 把a.txt的內容作為輸出,給mail命令傳送,-s代表郵件標題,[email protecte

SpringBoot(十一)SpringBoot傳送郵件

之前一段時間沒有上CSDN發表,自己本地記在有道雲的,現在都發出來,希望對你們有幫助。 ··· 傳送郵件 一、依賴 <!-- javax.mail --> <dependency> <grou

專案部署到linux伺服器後無法傳送郵件的解決辦法

本地除錯時,是正常可以傳送郵件的,一旦部署到linux伺服器上之後就無法傳送郵件,並且提示:無法連線到主機、埠 1.導致的原因是因為Linux伺服器無法直接訪問郵件服務地址,在本機window上ping郵件地址,得到對應的真實IP 2.進入linux伺服器,修改hosts

()合格linux運維人員必會的30shell編程面試題及講解

需要 add 檢查 手工 rip 發送 toa exe 很多 超深度講解shell高級編程實戰,截至目前shell編程課程國內培訓機構最細的課程,不信請看學員表現的水平。 課程牛不牛,不是看老師、課表,而是看培養的的學生水平,目前全免費中夥伴們趕緊看啊。 http://ed

)postfix瘋狂外發垃圾郵件分析與解決

nbsp 被人 4.4.2 def mst conn 其中 post system 從進程中看到,好像是postfix有問題。我這postfix主要是用來給程序發達郵件用的,如報警,程序外發郵件等。平時postfix進程不會像現在這樣異常,這在postf主進程CPU占用高,

Linux基礎文字編輯器神vim的基本操作

vi是Linux底下最常用的一款強大的文字編輯器(vim是vi的升級版,在其基礎上加入了一些新特性),用起來很Coooooool酷!大概是處於鄙視層的最頂端這個級別,讓我們一起膜拜一下吧(^__^) 。 vi的三種工作模式 編輯模式 游標定位: k/j/h/l 分別是

Web安全學習筆記(十)PHP基礎(下) 連線資料庫

前言:         把這個總結完,對於學習的基礎也算完事了,剩下的我就要將實戰中遇到的多多分享了,也希望多結識一些志同道合,聊得來的朋友。        

linux筆記SSH無法連線"connection reset by ip_address port 22"問題解決

文章目錄 場景: 解決方案 場景: 購買了兩臺七牛雲主機QVM1和QVM2,同一個VPC內。同時,QVM1通過本地ssh連線(公網)無誤,但是通過QVM1的ssh連線(內網)QVM2報錯 解決方案 QVM2不能SSH連線,可以通過七牛

(二)WEB介面測試Jmeter介面測試自動化(資料分離)

通過逐個錄入的方式,好不容易將需要測試幾十個介面的300多個測試用例錄入sampler-http請求中,固定的測試環境跑起來也還感覺良好。不料在新伺服器環境中跑用例時,問題來了:修改引數維護指令碼等成本太大!      指令碼引數是寫死的,修改起來得一個個請求開啟來依次輸入引