首頁  >  文章  >  後端開發  >  php發送附附件的郵件

php發送附附件的郵件

高洛峰
高洛峰原創
2016-12-02 11:51:441721瀏覽

我常聽到這樣一個問題:「我有一個從網站發來的合約。我如何為透過表單發送的電子郵件增加一個附件呢?」  

首先我要說的是要做到這個沒有什麼簡單的辦法。

你要很好的理解PHP或其它的伺服器端的腳本語言。

當然你還要一個真正支援PHP的網站的帳號。

如果滿足了這個前提,在你讀完了本章後就可以用PHP發送附附件的電子郵件了。

 1. 附件是如何運作的   

如果你曾經在PHP的手冊中搜尋過「附件」函數,那麼結果可能是什麼都沒有(至少在我寫本文的時間還沒有)。

後來你就要花很多時間去了解這方面的知識。

 你也許會想當你給某個人發送一封帶附件的電子郵件時,附件是和郵件一起放到收件人的信箱裡的(比如,如果你給他/她發了一個PNG的圖片文件,他/她的信箱裡會包含一個txt檔案(電子郵件)和一個.​​png檔案(附件)。成純文字文件,並在你寫的內容(實際的電子郵件)後面插入這個文字區塊。包含附件和實際電子郵件內容的文件。 To: Person Message-id: Content-type: multipart/mixed; boundary="396d983d6b89a" Subject: Heres the subject --396d983d6b89a Contject: Heres the subject --396d983d6b89a Contject: Content-transfer-encoding: 8bit This is the body of the email. --396d983d6b89a Content-type: text/html; name=attachment.html Content-disposition: inline; filename=attachment.html Content-transferfer-enco: 8888888888 is the attached HTML file --396d983d6b89a--   

前面的7行是郵件的頭,其中值得注意的是Content-type頭部分。附件的郵件只有一個部分:訊息本身。附件。界線開始。 最後一個分界線後面也有兩個連字號,表示這個郵件中沒有其它的部分了。   

在每個分界線後面有一些行,用來告訴郵件程式這個部分的內容的類型。

 例如,看看上面範例中第一個分界線後面的兩行--以Content-type: text/plain開頭的行。

這些行說明後面的部分是ISO-8859-1字元集的純文字。

跟在第二個分界線後的行告訴郵件程式現在的部分是一個HTML文件,它的名字是"attachment.html"。   

Content-disposition這持告訴郵件程式如果可能就以內嵌的方式顯示附件。

現在新的郵件程式會在訊息後面顯示HTML的內容。

如果Content- disposition被設為attachment,那麼郵件程式就不會顯示HTML檔案的內容,而是顯示一個連接到檔案的圖示(或其它的類似的東西)。

收件者要看附件的內容,必須點選這個圖示。一般情況下,如果附件是一些文字(包含HTML),Content-disposition會設為inline,這是因為現在大部分郵件程式能夠不借助其它瀏覽器而直接顯示附件(文字)的內容。如果附件不是文字(例如圖片或其它類似的內容),Content-disposition 就設為attachment。

 2. 用PHP產生附附件的電子郵件

這裡一個例子,告訴你如果把一個定義好的HTML檔案加為郵件的附件: # 我們先寫實際的訊息內容$emailBody = "This is text that goes into the body of the email."; # 然後我們要作為附件的HTML檔案$attachment = " This is the attached HTML file "; # 建立在郵件中分隔不同部分的分界線。 # 基本上,分界線可以是任意的字串。 # 但是重要的一點是確定一個寫郵件的人 # 這會隨意寫出的字串,所以我們用 # uniqid函數來產生一個隨機的字串。 $boundary = uniqid( ""); # 現在我們要建立郵件頭。

不要忘了插入 # Content-type頭來說明這個郵件包含一個或更多的附件。 $headers = "From: someone@example.com Content-type: multipart/mixed; boundary="$boundary""; # 好,現在我們已經有了郵件的所有內容。 # 下一件事是修改郵件的主體。 $emailBody = "--$boundary Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: 8bit $emailBody --$boundary Content-type: text/html; name=attachment.html Content -disposition: inline; filename=attachment.html Content-transfer-encoding: 8bit $attachment --$boundary--"; # 現在可以把郵件發出去了mail( "person@eksempel.dk", "The subject", $emailBody, $headers); ?> 

3. 把用戶上傳的文件作為附件

 你也許會覺得上面的例子難以理解,但下面...。在下面的例子中事情更難了,因為我們要用一個表單讓用戶上傳他們的文件,並把這個文件作為我們要發送的郵件的附件。麻煩的是我們不能預先知道檔案的MIME類型。

 在前面的範例中,我們已經知道該它是一個HTML文件,所以給這個附件設定Content-type頭是很簡單的。在下面的例子中,MIME類型可能是任意的,因為使用者可能會上傳一個HTML文件,一個PNG文件,一個vCard文件,或者其它的東西。

讓我們來看看範例: # 現在我們來產生表單。在產生可以上傳檔案的表單時, # 不要忘了把# 如果使用者已經按了"Send"按鈕" if ($send) { # 定義分界線$boundary = uniqid( ""); # 產生郵件頭$headers = "From: $from Content-type: multipart/mixed; boundary="$boundary""; # 決定上傳檔案的MIME類型if ($attachment_type) $mimeType = $attachment_type; # 如果瀏覽器沒有指定檔案的MIME類型, # 我們可以把它設為"application/unknown". else $mimeType = "application/unknown"; # 確定檔案的名字$fileName = $attachment_name; # 開啟檔案$fp = fopen($attachment, "r") ; # 把整個檔案讀入一個變數$read = fread($fp, filesize($attachment)); # 好,現在變數$read中儲存的是包含整個檔案內容的文字區塊。區塊轉換成郵件程式可以讀懂的格式# 我們用base64方法把它編碼$read = base64_encode($read); # 現在我們有一個用base64方法編碼的長字串。把這個長字串切成由每行76個字元組成的小塊$read = chunk_split($read); # 現在我們可以建立郵件的主體$body = "--$boundary Content-type: text/plain; charset=iso-8859-1 Content-transfer-encoding: 8bit $body --$boundary Content-type: $mimeType; name=$fileName Content-disposition: attachment; filename=$fileName Content-transfer-encoding: base64 $read: base64 $read --$boundary--"; # 寄信mail($to, $subject, $body, $headers); } ?>   

這就是全部內容。如果你不能很好地理解上面的例子,我的建議是給你自己發送幾個附件的郵件,然後仔細研究郵件的原始碼。 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn