在PHP中用Socket寄送電子郵件(一)

來源:互聯網
上載者:User
在作者所申請的幾個PHP 首頁空間中,能夠提供mail功能的實在不多,總是調用完mail()函數之後就毫無下文了。但是電子郵件在網上生活中的作用越來越大。想一想網蟲上網不收郵件能叫真正的網蟲嗎?郵件的作用我不想再說了,但是如果首頁空間不支援mail()發送那麼怎麼辦呢?我也想過通過socket來實現郵件發送,但無奈對用php 進行socket編程不熟悉,再加上發送郵件要用到SMTP協議,又要讀不少的英文了,所以一直也沒有去研究過。終於有一天我發現了一篇文章,關於用socket編程發送郵件。我如獲至寶般將其拷貝下來,並且將其改造成了一個php 可用的類,供大家使用。原來的文章只是一個簡單的例子,而且還有一些錯誤,在我經過多次的實驗、改造終於將其改成了一個直接使用socket,向指定的郵箱發送郵件的類,如果大家和前面關於發送MIME的文章結合起來,就可以實現在不支援mail()函數的網站上發送郵件了。因為發送郵件的過程需要時間,可能與mail()的處理機制還不完全一樣,所以速度要慢一些,但是可以解決需要發送郵件功能的燃眉之急,同時你也可以學慣用php 進行socket編程。下面就將這個類的實現原理介紹給大家,同時向大家講解一些關於SMTP的基本知識。

Socket編程介紹
  向大家申明,本人不是一個TCP/IP編程專家,故在此只是講出了我的一點理解和體會。

  使用fsockopen函數開啟一個Internet串連,函數文法格式:

int fsockopen(string hostname, int port, int [errno], string [errstr], int [timeout]);

  參數的意思我想不用講了,這裡由於要使用SMTP協議,所以連接埠號碼為25。在開啟串連成功後,會返回一
個socket控制代碼,使用它就可以象使用檔案控制代碼一樣的。可使用的操作有fputs(),fgets(),feof(),fclose()
等。

  很簡單地介紹就到這裡吧。

SMTP的基礎
  基於TCP/IP的網際網路協議一般的命令格式都是通過請求/ 應答方式實現的,採用的都是文本資訊,所以處理起來要容易一些。SMTP是簡易郵件傳輸通訊協定的簡稱,它可以實現用戶端向伺服器發送郵件的功能。所以下面所講的命令是指用戶端向伺服器發出請求指令,而響應則是指伺服器返回給用戶端的資訊。

  SMTP分為命令頭和資訊體兩部分。命令頭主要完成用戶端與伺服器的串連,驗證等。整個過程由多條命令組成。每個命令發到伺服器後,由伺服器給出響應資訊,一般為3 位元字的響應碼和響應文本。不同的伺服器返回的響應碼是遵守協議的,但是響應本文本則不必。每個命令及響應的最後都有一個斷行符號符,這樣使用fputs()和fgets()就可以進行命令與響應的處理了。SMTP的命令及響應資訊都是單行的。資訊體則是郵件的本文部分,最後的結束行應以單獨的"."作為結束行。

  用戶端一些常用的SMTP指令為:

HELO hostname: 與伺服器打招呼並告知用戶端使用的機器名字,可以隨便填寫
MAIL FROM: sender_id : 告訴伺服器發信人的地址
RCPT TO: receiver_id : 告訴伺服器收信人的地址
DATA : 下面開始傳輸信件內容,且最後要以只含有.的特殊行結束
RESET: 取消剛才的指令,從新開始
VERIFY userid: 校正帳號是否存在(此指令為可選指令,伺服器可能不支援)
QUIT : 退出串連,結束
  伺服器返回的響應資訊為(格式為:響應碼+空格+解釋):

220 服務就緒(在socket串連成功時,會返回此資訊)
221 正在處理
250 請求郵件動作正確,完成(HELO,MAIL FROM,RCPT TO,QUIT指令執行成功會返回此資訊)
354 開始發送資料,結束以 .(DATA指令執行成功會返回此資訊,用戶端應發送資訊)
500 語法錯誤,命令不能識別
550 命令不能執行,郵箱無效
552 中斷處理:使用者超出檔案空間
  下面給出一個簡單的命令頭(這是在開啟socket之後做的),是我向stmp.263.net發郵件的測試結果:

HELO limodou
250 smtp.263.net
MAIL FROM: chatme@263.net
250 Ok
RCPT TO: chatme@263.net
250 Ok
DATA
354 End data with .
To: chatme@263.net
From: chatme@263.net
Subject: test
From: chatme@263.net
test
.
QUIT
250 Ok: queued as C46411C5097E0

  這就是一些SMTP的簡單知識。相關內容可以查閱RFC。

RFC 821定義了收/發電子郵件的相關指令。
RFC 822則制定了郵件內容的格式。
RFC 2045-2048制定了多媒體郵件內容的格式,
RFC 1113, 1422-1424則是討論如何增進電子郵件的保密性。



相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。