LENDIEN聯電 冷暖 清淨 除溼 移動式空調 9000BTU任天堂-Switch-NS-公司貨主機-豪華全配組LG樂金 WIFI遠控雙眼小精靈掃地清潔機器人變頻版

2011年4月15日 星期五

用php mail函數寄有附件的email

簡單的講起來,就是寄送一個信件內容很長的mail,長的原因不奇怪,就是把要夾的檔讀出來塞在mailbody裡,分解動作開始。

1.subject設法照舊,跳過。

2.取一個獨一無二的boundary(其實我也不懂為什麼要多獨一無二):
$boundary = "==".md5(time())
其中前面的兩個等於「==」是因為信件中固定要用到的,所以先組上去。

3.設定header,告訴大家我有附件:
$header="Content-Type: multipart/mixed; boundary=\"{$boundary}\"\r\nFrom: =?utf-8?B?".base64_encode("寄件人姓名")."?= ";

4.開始組mailbody:
$message = "This is a multi-part message in MIME format.\n\n" ."--{$boundary}\n" . "Content-Type: text/html; charset=\"utf-8\"\n" . "Content-Transfer-Encoding: 8bit\n\n" . $html_mail_body . "\n\n";
$message .= "--{$boundary}\n";

5.先幫每個附件設定好檔名、mime type、收到時看到的附件檔名
$files[]=array("12345.xls","application/vnd.ms-excel","商品們.xls");
$files[]=array("67890.xls","application/vnd.ms-excel","訂購單.xls");

6.開始把附件組進mailbody裡:
for($x=0;$x < count($files);$x++){
    $file = fopen($files[$x][0],"r");
    //把要夾的檔案讀出來
    $data = fread($file,filesize($files[$x][0]));
    fclose($file);
    //編碼後以固定長度斷行
    $data = chunk_split(base64_encode($data));
    $message .= "Content-Type: \"".$files[$x][1]."\";\r\n" . " name=\"=?utf-8?B?".base64_encode($files[$x][2])."?=\"\r\n" .
    "Content-Disposition: attachment;". " filename=\"=?utf-8?B?".base64_encode($files[$x][2])."?=\"\r\n" .
    "Content-Transfer-Encoding: base64\r\n\r\n" . $data . "\r\n\r\n";
     //↑告知檔案資訊後把檔案加進去
     //一個附件夾完塞一個boundary當尾巴切斷
    $message .= "--{$boundary}\n";   
}
加粗的base64_encode是要說,如果要在信件中顯示中文檔名,最好就是用這種方式,不然會發現你設的檔名跟在outlook裡看的檔名總是不一樣,這問題讓我困擾了好一會,後來是抓outlook裡的原始檔出來看才發現=..=

7.然後就可以開心的寄出去了:
mail("reciver@you.net.tw",$subject,$message,$header)

沒有留言:

張貼留言