PHPで複数ファイル添付付きメール送信する方法
今回やりたいことは下記2点。
- mb_send_mail()関数を使って送信
- フォームで選択された画像ファイル(複数)を添付してメールを送信
苦労した箇所は、
- 画像をアップロードしないといけない!
- ファイルを添付する方法をしらない!
ファイル選択→添付ファイル送信までの大まかな流れ
1.画像を添付したファイルをPOST送信
<form action=”” enctype=”multipart/form-data” method=”post”>で送信。
2.if(isset($_FILES)){ ・・・ }でファイル情報を受け取る
$_FILESは配列になっているので、必要な情報を指定して取得できます。
http://so-zou.jp/web-app/tech/programming/php/file/upload/
ここで余談ですが、メール送信する前に選んだ画像を確認したいという場合、下記のような手順で画像として確認できます。
$i = 0; foreach ($_FILES["file_upload"]["tmp_name"] as $key => $value) { if(empty($value)){ continue; } $img = file_get_contents($value); $base64 = base64_encode($img); print "<img src=\"data:image/jpeg;base64,$base64\" width=\"150px\">"; }
3.画像ファイルを任意のディレクトリにアップロード
選択したファイルはtempファイルとしてローカルに一時保存されているので、それを任意のディレクトリにアップロードする作業です。
配列でディレクトリのパスとファイル名を持っているのは、次の添付メール作成の際に使用するためです。
$uploads_dir = '../files/advertise'; $file_dir_for_attach = array(); $filename_for_attach = array(); foreach ($_FILES["file_upload"]["error"] as $key => $error) { if ($error == UPLOAD_ERR_OK) { $tmp_name = $_FILES["file_upload"]["tmp_name"][$key]; //set New Name to picture $ext = substr($_FILES["file_upload"]["name"][$key], -3); $newfilename = 'ad-'.date("YmdHis").$key.'.'.$ext; if(move_uploaded_file($tmp_name, "$uploads_dir/$newfilename")){ //success Upload! $file_dir_for_attach[] = "$uploads_dir/$newfilename"; $filename_for_attach[] = "$newfilename"; }else{ //faile to upload pic } } }
4.添付メールを作成
半分コピペで対応できました。
参照
:http://tanaka8.com/2011/06/php_sendmail_attach/
:http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1393526413
上記記事のおかげで助かりました。ありがとうございます!
function send_attached_mail($filepathArray,$filenameArray){ // 宛て先アドレス $mailTo = '○○'; // メールのタイトル $subject = "添付テスト"; // 差出人のメールアドレス $mailFrom = '△△'; // Return-Pathに指定するメールアドレス $returnMail = '□□'; // メールで日本語使用するための設定をします。 mb_language("Ja") ; mb_internal_encoding("UTF-8"); $header = "From: $mailFrom\r\n"; $header .= "MIME-Version: 1.0\r\n"; $header .= "Content-Type: multipart/mixed; boundary=\"__PHPRECIPE__\"\r\n"; $header .= "\r\n"; $body = "--__PHPRECIPE__\r\n"; $body .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\r\n"; $body .= "\r\n"; $body .= "送信テスト\r\n本文はここに\r\n"; $body .= "--__PHPRECIPE__\r\n"; foreach ($filepathArray as $key => $pathValue) { $attachEncode = base64_encode(file_get_contents($filepathArray[$key])); $body .= "Content-Type: image/jpeg; name=\"" . $filenameArray[$key] . "\"\r\n"; $body .= "Content-Transfer-Encoding: base64\r\n"; $body .= "Content-Disposition: attachment; filename=\"" . $filenameArray[$key] . "\"\r\n"; $body .= "\r\n"; $body .= chunk_split($attachEncode) . "\r\n"; $body .= "\r\n"; $body .= "--__PHPRECIPE__\r\n"; } if (mb_send_mail($mailTo, $subject, $body, $header)) { //success! }else{ //fail to send } }