PHPのHTMLメールで添付ファイル

なぜかmb_send_mailはだめでmail関数です。

ググってみると、mb_send_mailで日本語の処理がうまく行かずにmailを使用している例はありますね。本来なら日本語は得意のはずなのですが、ローカルの仮想サーバーなので簡単にテストが出来,かなり試しましたが日本語が [ ] になります。文字化けでもないし、消えている感じです。元々mail関数でテキストの送信をやっていたので、HTMLの送信で、添付ファイルを付けます。

それぞれContent-Typeが異なるので BOUNDARYでエンコードを変えていきます。以下サンプルです。動作環境はWINDOWS10 XAMPP でphp7.4.8です。

22行目 $body.="\n"; を忘れてHTMLが表示されなくなりました。

<?php

/*****************************/
/*   メール送信      */
/*****************************/
function SendAttachedMail( $mail_from , $mail_to , $subject , $body_html , &$file ){
	$subject="=?iso-2022-jp?B?".base64_encode(mb_convert_encoding( $subject , "jis" , 'utf-8' ))."?=";
	$mail_from_name = $mail_from;
	$boundary = "__BOUNDARY__". uniqid( rand() , true ) . "__";
	//
	mb_language( 'Japanese' );
	mb_internal_encoding( 'UTF-8' );
	//--ヘッダー
	$headers= "MIME-Version: 1.0\n";
	$headers .="Content-Type: Multipart/Mixed; boundary=\"$boundary\"\n";
	$headers .="From: " . mb_encode_mimeheader($mail_from_name) . "< $mail_from >\n";
	$headers .="Content-Transfer-Encoding: 7bit\n";
	// body
	$body="--$boundary\n";
	$body.="Content-Type: text/html; charset=\"UTF-8\"\n";
	$body.="Content-Transfer-Encoding: binary\n";
	$body.="\n";
	$body.=$body_html."\n"; 
	// 添付ファイル
	 if ($file) {
			foreach ($file as $value){
				$filename = mb_encode_mimeheader( mb_convert_encoding( basename( $value ) ,  "ISO-2022-JP" , 'auto' ) );
				$body .= "--$boundary\r\n";
				$body .= "Content-Type: application/octet-stream; name=\"$filename\"\r\n";
				$body .= "Content-Transfer-Encoding: base64\n";
				$body .= "Content-Disposition: attachment; filename=\"$filename\"\r\n";
				$body .= "\n";
				$body .= chunk_split( base64_encode(file_get_contents($value) ), 76 ,"\r\n" );
				$body .= "\r\n";
			}
	 }
	$body .= "--$boundary--\r\n";
	// 送信部分
	if(!mail ($mail_to,$subject, $body , $headers)){
	  echo "送信失敗";
	}else{
	  echo "送信成功";
	}
}
/*------------------------------------
			本文
------------------------------------*/

$data[0]="次元";
$data[1]="哲郎";
$data[2]="ジゲン";
$data[3]="テツロウ";
$data[4]="男";
$data[5]="2000/01/01";
$data[6]="35歳";
$data[7]="hoge@hogehoge.com";
$data[8]="000-0000-0000";
$data[9]="心象のはひいろはがねからあけびのつるはくもにからまりのばらのやぶや腐植の湿地いちめんのいちめんの諂曲模様";
//
$body = "<html><body>";
$body .="お問合せ頂きありがとうございます。<br>\r\n";
$body .= "<hr><br>\n";
$body .= "<img src=\"https://~/images/ojigi.png\" height=\"200\" align=\"left\">\r\n";
$body .= "お名前カナ:[ $data[2] ] [ $data[3]] <br>\r\n";
$body .= "お名前漢字:[ $data[0] ] [ $data[1] ] <br>\r\n";
$body .= "性別:$data[4] <br>\r\n";
$body .= "生年月日:$data[5] <br>\r\n";
$body .= "年齢:$data[6] <br>\r\n";
$body .= "メールアドレス:$data[7] <br>\r\n";
$body .= "電話番号:$data[8] <br>\r\n";
$body .= "ご相談内容:<br>\r\n";
$body .= "$data[9] <br><br>\r\n";
$body .="<hr><br><b>写真の入力はここをクリック</b><br>\r\n";
$body .="<img src=\"https://~/images/clear.gif\">";
$body .="<a href=\"https://~\"><img src=\"https:~/images/bt1.png\"></a>";
$body .="<img src=\"https://~/images/clear.gif\">";
$body .="</html></body>";
//---- 添付ファイル---
$file[]="./tmp/aaa.jpg";
//
//---- 送信 ----
//
$mail_to="apon@hoge2hoge2.com";
$mail_from=$data[7];
SendAttachedMail($mail_from ,$mail_to , 'Test-ホームページ',$body, $file );
?>

メーラーも「Outlook」「WIndowsメール」「Thunder bird」「秀丸メール」で表示する事を確認しています。

Thunderbird

htmlの画像はサンプルプログラムの実行なので表示されてませんが最後の画像は添付ファイルです。