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
}
}