4

次のコードを使用して、csvファイルを作成し、phpの特定のメールボックスに送信します。csvファイルは正常に受信できますが、ATT00001.txtというtxtファイルがもう1つ添付されている理由がわかりません。誰かが私が見てみるのを手伝ってくれますか?

メールを送信するためのコードの一部は次のとおりです。

// email fields: to, from, subject, and so on 
$to = "you@home.com"; 
$from = "me@home.com";  
$subject ="Test mail";  
$message = "please check the csv out!"; 
$headers = "From: $from"; 

$fileName = pathtocsv;

// boundary  
$semi_rand = md5(time());  
$mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";  

// headers for attachment  
$headers .= "\nMIME-Version: 1.0\n" . "Content-Type: multipart/mixed;\n" . " boundary=\"{$mime_boundary}\"";  

// multipart boundary  
$message = "This is a multi-part message in MIME format.\n\n" . "--{$mime_boundary}\n" . "Content-Type: text/plain; charset=\"iso-8859-1\"\n" . "Content-Transfer-Encoding: 7bit\n\n" . $message . "\n\n";  
$message .= "--{$mime_boundary}\n"; 

// preparing attachments 
$file = fopen($fileName,"rb"); 
$data = fread($file,filesize($fileName)); 
fclose($file); 
$data = chunk_split(base64_encode($data)); 
$message .= "Content-Type: {\"application/octet-stream\"};\n" . " name=\"record.csv\"\n" .  
"Content-Disposition: attachment;\n" . " filename=\"test.csv\"\n" .  
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n"; 
$message .= "--{$mime_boundary}\n"; 

mail($to, $subject, $message, $headers);

もう1つのテキストファイルが送信されます
そして、私がそれを見るとき、それはただの空のtxtファイルです。Outlookでメールを開きます。

4

1 に答える 1

11

最後の境界線の変更:

$message .= "--{$mime_boundary}\n";

に:

$message .= "--{$mime_boundary}--\n";

--最後に余分に注意してください。

RFC 2046 (§ 5.1.1 - 共通構文 [19 ページ])は、次のように述べています。

最後のボディ部分に続く境界区切り線は、
それ以上ボディ部分
が続かないことを示す明確な区切り文字です。 このような区切り行は、境界パラメーター値
の後にさらに 2 つのハイフンが追加された、前の区切り行と同じです。

--gc0pJq0M:08jU534c0p--

最後の境界が欠落しているため、Outlook が余分なデータを含む添付ファイルまたは空の添付ファイルを作成するのが既定の動作のようです。

ここで James-Luo による2 番目の回答も有効な場合があります。彼は、メッセージ本文の前に添付ファイルを MIME メッセージに追加すると、添付ファイルで同様の結果になる可能性があると述べています。

于 2012-08-13T04:20:34.577 に答える