用PHP發送MIME郵件(四)

來源:互聯網
上載者:User
mime 核心:方法
  我們將MIME資訊頭的產生,MIME段頭的產生和最終的郵件訊息的產生分成幾個模組。方法的實現是直接從我們前面遇到的MIME基礎而來的。

<?php

function attach($data, $description = "", $contenttype = OCTET,
$encoding = BASE64, $disp = '') {
if (empty($data))
return 0;
if (trim($contenttype) == '')
$contenttype = OCTET ;
if (trim($encoding) == '')
$encoding = BASE64;
if ($encoding == BIT7)
$emsg = $data;
elseif ($encoding == QP)
$emsg = $$this->qp_func($data);
elseif ($encoding == BASE64) {
if (!$this->base64_func) # 檢查是否有使用者自動定函數
$emsg = base64_encode($data);
else
$emsg = $$this->base64_func($data);
}
$emsg = chunk_split($emsg);
//檢查是否content-type是text/plain並且如果沒有指定charset,追加預設的CHARSET
if (preg_match("!^".TEXT."!i", $contenttype) &&
!preg_match("!;charset=!i", $contenttype))
$contenttype .= ";
charset=".CHARSET ;
$msg = sprintf("Content-Type: %sContent-Transfer-Encoding: %s%s%s%s",
$contenttype.CRLF,
$encoding.CRLF,
((($description) && (BODY != $description))?"Content-Description:
$description".CRLF:""),
($disp?"Content-Disposition: $disp".CRLF:""),
CRLF.$emsg.CRLF);
BODY==$description? $this->mimeparts[0] = $msg: $this->mimeparts[] = $msg
;
return sizeof($this->mimeparts);
}

?>

  讓我們仔細地看一下這個方法(對於其它的大部分方法也將如此):

這個方法使用的參數有:
所附的實際資料($data)
與Content-Description頭相應的資料描述($description)
將用在Content-Type頭中的資料content-type值($contentype)
用在Content-Transfer-Encoding中的編碼值($encoding)
用在Content-Disposition頭$disp中的布局值,可以是INLINE或ATTACH,兩個都是常量
如BASE64,TEXT這樣的值等等,作為常量被定義在附加的.def檔案中。
使用$encoding值來決定需要用哪種編碼方式對資料進行編碼。有效值是BIT7(或7bit),QP或BASE64。
這個函數同時也檢查了是否使用者要使用他/她自已的BASE64或QP函數。在寫這篇文章時,在我們的類中
只有BIT7和BASE64被實現了,然而,你可以傳遞你自已的quoted-printable
函數來使用,通過在前面
討論的$qp_func類變數。
在編碼處理之後,你會注意到對編碼的資訊使用了chunk_split()。這個函數根據可選長度將字串分
割成小段。因為我們沒有指出長度,預設長度使用76。這個非常附合郵件處理的習慣。
接著,如果$contenttype參數包含text/plain,則必須給出"charset="
參數的值。它的預設值被定義
在常量CHARSET中,值為us-ascii。注意當頭使用參數值傳遞時,在頭與參數之間必須有一個分號(;)。
例如,Content-Type: text/plain; charset=us-ascii
如果其它MIME段頭各自的值被傳遞給這個方法,這些段頭被建立。畢竟我們不想擁有一個沒有描述的
Content-Description頭。在建立這些頭之後,我們追加上經過編碼的資料部分資訊。(檢查一下方法
中的sprintf()語句)。
同樣,注意我們使用了一個叫BODY(又是一個常量)的特別描述欄位。這就是我們用在類實現中的東西。
如果描述欄位與BODY一樣,我們將其賦給$mimeheaders數組中的第一個元素。對於這個請多讀幾遍。

attach() 返回$mimeparts數組的當前大小,用在呼叫指令碼的引用中。通過這種方法就可以知道一個附
件"X"存在哪一個索引中(實際返回的值要比在數組中的索引小1)
注意所有的頭必須用一個CRLF(
)序列結束。
  接著,我們看一下fattach()方法,fattach()與attach()相似,但是它使用一個檔案名稱作為它的第一個
參數(作為attach()中$data的替換)。這個方法只是一個封裝,以便調用者可以用一個檔案來調用fattach。
fattach()然後將檔案讀出,接著調用attach()來追加資料。這個方法在失敗時返回0,可以在$errstr
變數
中找到解釋或者當成功時,返迴文件附件在$mimeparts數組中的索引號。

  我們現在已經開發了附加資料的功能,對它們進行編碼並且將單獨的MIME段放在私人數組中。還需要完
成的工作是:

完成MIME的各個段
建立包含MIME資訊頭的郵件資訊頭,郵件原始的資訊頭(如To:,From:等等)並且包括任何使用者定義
的頭。
在頭後面追加完整的MIME段,這樣一個完整的郵件包就產生了。




聯繫我們

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

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

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.