ドゥアイネットのプログラマー、湯川が開発日記を綴ります。

CALENDAR
S M T W T F S
1234567
891011121314
15161718192021
22232425262728
293031    
<< December 2019 >>
ARCHIVES
CATEGORIES
<< トラブル対応 | main | 今年の花粉 >>
マルチパートメール送信
メールの送信方法にテキストとHTMLメールを
一つのメールとして送信してする「マルチパートメール送信」を調べました。

マルチパートメールを受信したメールソフト側で
HTMLメールが読めない(表示しない)場合は、テキストメールを表示、
HTMLメールが読める(表示する)場合は、HTMLメールを表示します。

通常メールは以下の順でメールデータをセットして送信します。
1.メールヘッダー
2.メール本文

※HTMLメールもヘッダー情報は少し違うだけで同様です。

マルチパートメールの場合は以下になります。

1.メインのヘッダー
2.テキストメールヘッダー
3.テキストメール本文
4.HTMLメールヘッダー
5.HTMLメール本文    

2種類のメール内容をまとめてセットします。
内容の区切りとして以下のように「boundary」をいれます。

1.メインのヘッダー
--「boundary」
2.テキストメールヘッダー
3.テキストメール本文
--「boundary」
4.HTMLメールヘッダー
5.HTMLメール本文    
--「boundary」--

この区切りをメールソフトが見て、
2種類のメールが送られてきたと判断します。

ソースにしたらこのようになります。

$v_boundary = "-----" . date("YmdHis", time()) . "_MULTIPART_MIXED";

//1.メインのヘッダー
$Result['Header']  = 'From: ' . $Result['From'] . "¥r¥n" .
                     'To: '   . $p_send_to . "¥r¥n";

$Result['Header'] = "MIME-Version: 1.0" . "¥r¥n".    
                  "Content-Type: multipart/alternative; boundary=" . $v_boundary . "¥r¥n".
                  "Content-Transfer-Encoding: 7bit". "¥r¥n" .
                  $Result['Header'];

$Result['Header'] .= "Subject: ". $Result['Subject'] . "¥r¥n" .
                   "X-Priority: " . $p_priority . "¥r¥n" .
                   "X-To-Addr: " . $p_to . "¥r¥n" .
                   "Date: $v_offset_rfc" . "¥r¥n" ;

//2.テキストメールヘッダー
$Result['Body']    = "Multipart Message coming up" . "¥r¥n¥r¥n--". $v_boundary . "¥r¥n".
                   "Content-Type: text/plain; charset=iso-2022-jp" . "¥r¥n" .
                   "Content-Transfer-Encoding: 7bit" . "¥r¥n" . "¥r¥n" ;
                   
//3.テキストメール本文
$Result['Body']    .= $this->_encodeStr(ereg_replace("¥n", "¥r¥n", $p_body), 'JIS'). "¥r¥n". "¥r¥n";
$Result['Body']    .= "--" . $v_boundary . "¥r¥n";

//4.HTMLメールヘッダー
$Result['Body']    .= "Content-type: Text/HTML; charset=ISO-2022-JP¥r¥n" .
                    "Content-Transfer-Encoding: 7bit" . "¥r¥n". "¥r¥n";

//5.HTMLメール本文  
$Result['Body']    .= $this->_encodeStr(ereg_replace("¥n", "¥r¥n", $p_htmlbody), 'JIS'). "¥r¥n". "¥r¥n";
$Result['Body']    .= "--" . $v_boundary . "--" . "¥r¥n";


boundaryで少しハマりました。
"Content-Type: multipart/alternative; boundary=" . $v_boundary . "¥r¥n".
で指定するときは、「--」をつけないで、間にいれるときは、「--」を付けます。

ソースとしては長いですがルールがわかれば、そう難しくないと思いました。

| PHP | 17:37 | comments(0) | - |
コメント
コメントする