アフィリエイト広告を利用しています

広告

この広告は30日以上更新がないブログに表示されております。
新規記事の投稿を行うことで、非表示にすることが可能です。
posted by fanblog

CSVファイルを添付したメールを送信

フォームで入力された内容をCSVファイルに書き出し、そのCSVファイルを添付して運営側にメール送信できないか?という依頼がありました。
ググればそのまま使えるサンプルがあるだろうなあ、と思っていたのですが意外となかったので、PHPに関しては初心者のWebデザイナーさん向けに書いてみました。

まずは入力用のフォーム。
こちら側はなんの仕掛けもなく至ってノーマル。
たとえばこんな感じ。
<html>
<head>
<title>お問い合わせ</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<form name="myform" method="post" action="thanks.php">
名前 <input type="text" name="名前">
<br>
<br>
かな <input type="text" name="かな">
<br>
<br>
メール <input type="text" name="email">
<br>
<br>
</form>
</body>
</html>


そして肝心のthanks.php側。

<?
setlocale( LC_ALL, "ja_JP.utf8" );
extract($_GET);
extract($_POST);
?>
<html>
<head>
<title>送信完了</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
<?
#CSV作成処理
$subtitle=date("YmdHis", time() );
$filename = "test".$subtitle.".csv";

$csv_image="";
$body="";

foreach($_POST as $key=>$var){
if(!strstr($key,"submit")){
$csv_image.=$key.",".$var."\n";
$body.=$key.":".$var."\n";
}
}

$csv_image=mb_convert_encoding($csv_image , "SJIS" , "UTF-8");
$handle = fopen($filename , 'w');
fwrite($handle , $csv_image);
fclose($handle);

$name=$filename;
$from=$email;
$to="×××@×××.×××";


$subject = "お問い合わせフォームから";
$subject = mb_convert_encoding($subject,"JIS","UTF-8");
$subject = "=?ISO-2022-JP?B?".base64_encode($subject)."?=";

$boundary = md5(uniqid(rand())); //バウンダリー文字(パートの境界)

$upfile_type = "multipart/mixed";

$header = "From: $from\n";
$header .= "Reply-To: $from\n";
$header .= "X-Mailer: PHP/".phpversion()."\n";
$header .= "MIME-version: 1.0\n";
$header .= "Content-Type: multipart/mixed;\n";
$header .= "\tboundary=\"$boundary\"\n";

$msg = "";
$msg .= "This is a multi-part message in MIME format.\n\n";
$msg .= "--$boundary\n";
$msg .= "Content-Type: text/plain; charset=iso-2022-jp\n";
$msg .= "Content-Transfer-Encoding: 7bit\n\n";
if(file_exists($filename)){
$fp = fopen($filename, "r") or die("error"); //ファイルの読み込み
$contents = fread($fp, filesize($filename));
fclose($fp);
$f_encoded = chunk_split(base64_encode($contents)); //エンコードして分割


$msg .= mb_convert_encoding($body,"JIS","UTF-8")."\n";

$msg .= "\n\n--$boundary\n";
$msg .= "Content-Type: " . $upfile_type . ";\n";
$msg .= "\tname=\"$name\"\n";
$msg .= "Content-Transfer-Encoding: base64\n";
$msg .= "Content-Disposition: attachment;\n";
$msg .= "\tfilename=\"$name\"\n\n";
$msg .= "$f_encoded\n";
}
mail($to, $subject, $msg, $header);
unlink($filename);
?>
お問い合わせ、ありがとうございました。<br>
追って担当者よりご連絡させていただきます。
</body>
</html>

添付するCSVファイルのファイル名作成
どんなファイル名でもいいのですが、タイムスタンプをファイル名内に入れることによって添付ファイルの誤った上書き保存を防止できるかと思いこのような処理を行いました。
CSVとメール本文の中身作成
入力フォームからPOSTされたデータをkeyがsubmitを除き連結処理を行っています。
$csv_imageは添付されるCSVファイルの中身用、
$bodyはメールの本文用です。

CSVファイルの作成
CSV用に作成されたデータである$csv_imageをまずはシフトJISに変換。
また、EUCでコードを書いていた場合は
$csv_image=mb_convert_encoding($csv_image , "SJIS" , "EUC-JP");
になります。
コードを元々シフトJISで書かれていた場合は、この行は必要ありません。

シフトJISに変換された$csv_imageを$filenameに書き込みます。
この段階でサーバーのthanks.phpと同じ階層にCSVファイルが作成されます。

メール処理
$to="×××@×××.×××";
は、メールの送り先のアドレスを設定してください。
ここから下の部分は正直よくわかっていません。
一番肝心な部分なんですけどね。
「このように書くんだ」と割り切って、そのまま使われることをお勧めします。

ただしmb_convert_encodingが使用されている部分はCSVファイルの作成と同じく、コードで使用されている文字コードによって内容を変更してください。

最後から2行目のunlink($filename);は添付したファイルの削除を行っています。
この処理を行わないと、フォームメールが使用されるたびにCSVファイルが溜まってしまいますので。
そして最後の1行print "送信完了";はこれを書かないとブラウザが真っ白になってしまうため、バグっているのか正常に処理されたのかの判断が付かないと思い付け足しました。



自分がかなりベタに書かれていないと理解できないので、ベッタベタな書き方をしてしまいました。
そのくせ最も重要なファイルを添付する部分に関しての解説はなくてすいません。
自分が理解できていないので書きようがなくて…

かなりつたない内容ですが、今後も思い立ったら自分の備忘録を兼ね、また書きたいと思っています。
   
×

この広告は30日以上新しい記事の更新がないブログに表示されております。