小金井にあるWEB制作会社の備忘録

MEMORANDUM

PHPでメールにファイルを添付して送信する

メールフォームからメールを送信する際に、画像(ファイル)を添付できるようにしてほしいとの依頼を受けた際の実装法をメモ。

HTML

<form action="./sendmail.php" method="post" enctype="multipart/form-data">
<input type="hidden" name="your-token" value="'.$_SESSION['your-token'].'">
<dl class="form__table">
<dt class="must">お名前</dt>
<dd><input type="text" name="your-name" value=""></dd>
<dt class="must">メールアドレス</dt>
<dd><input type="email" name="your-email" value=""></dd>
<dt class="must">ファイル</dt>
<dd><input type="file" name="your-file"></dd>
<dt class="must">お問い合わせの内容</dt>
<dd><textarea name="your-message"></textarea></dd>
</dl>
<ul class="form__submite">
<li><input type="submit" name="mailform" id="submit" value="送信"></li>
</ul>
</form>

sendmail.php(PHP)

if(!empty($_POST['mailform'])){
	foreach($_POST as $key => $value){
		$dt[$key] = mb_convert_kana($value, 'KVa', 'UTF-8');
	}
	//エラー処理は省略
	
	if(!empty($_FILES['your-file']['name'])){
		//ファイル名
		$file = $_FILES['your-file']['name'];
		//添付したいファイルのパス
		$file_path = $_FILES['your-file']['tmp_name'];
	}

	//自動メール送信
	//言語設定、内部エンコーディングを指定する
	mb_language('japanese');
	mb_internal_encoding('UTF-8');
	date_default_timezone_set('Asia/Tokyo');

	//【相談者宛】件名
	$mailto= 'test@syu-u.com';
	$form= '運営会社';
	$subject_owner = 'お問い合わせがありました';

	//入力情報
	$resbody = "";
	$resbody .= "□お問い合わせ日:".date('Y/m/d', time())."\n";
	$resbody .= "□お名前:".$dt['your-name']."\n";
	$resbody .= "□メールアドレス:".$dt['your-email']."\n";
	$resbody .= "□お問い合わせ:\n";
	$resbody .= $dt["your-message"]."\n";

	//受取側本文
	//メールボディを定義
	if(empty($file)) {
		$body_owner .= "お申込み内容\n\n";

		$body_owner .= "----------------------------------------------------\n";
		$body_owner .= $resbody."\n";

		$body_owner .= "----------------------------------------------------\n";
	}else{
		$body_owner = "--__BOUNDARY__\n";
		$body_owner .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n\n";
		$body_owner .= "お申込み内容\n\n";
		$body_owner .= "----------------------------------------------------\n";
		$body_owner .= $resbody."\n";
		$body_owner .= "----------------------------------------------------\n";
		$body_owner .= "--__BOUNDARY__\n";

		$body_owner .= "Content-Type: application/octet-stream; name=\"{$file}\"\n";
		$body_owner .= "Content-Disposition: attachment; filename=\"{$file}\"\n";
		$body_owner .= "Content-Transfer-Encoding: base64\n";
		$body_owner .= "\n";
		$body_owner .= chunk_split(base64_encode(file_get_contents($file_path)));
		$body_owner .= "--__BOUNDARY__\n";
	}


	//メールヘッダーを定義
	$header_owner = "Content-Type: multipart/mixed;boundary=\"__BOUNDARY__\"\n";
	$header_owner .= "Return-Path: ".$mailto. " \n";
	$header_owner .= "From: ".$form." \n";
	$header_owner .= "Sender: ".$form." \n";
	$header_owner .= "Reply-To: ".$mailto. " \n";
	
	mb_send_mail($mailto, $subject_owner, $body_owner, $header_owner);
}

実際の使用時は確認画面を用意する必要があるため、「$_POST」で取得した値を「$_SESSION」に入れたり、一時的に画像をWEB上に保管する等をして処理してます。