簡單的講起來,就是寄送一個信件內容很長的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)
2011年4月15日 星期五
用php mail函數寄有附件的email
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言