weblovelog

ウェブ業界人のためのウェブ情報サイト。

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

}

}

 

 - その他

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事