仕事でファイル付きメールを送るフォームを作成したときに、めちゃくちゃ調べたのでそのまとめ。
- input type=”file”でファイルアップロードができる。
- そのときformにenctype=”multipart/form-data”という属性をつける。
- メールのヘッダーはContent-Type: multipart/mixed;boundary=”任意の文字列”とする。
multipart/mixedというのは複数のコンテントタイプが混ざってるということ。
また、このときboundaryという任意の文字列は日付やらをmd5ハッシュしたものなどにする。 - 3で指定したboundaryの値の頭に–をつけたものが区切り線となる。
この区切り線というのはContent-Typeの区切りです。要はテキストのContent-Typeと画像のContent-Type。
以上をふまえてソース
sendmail.html
<form action="sendmail.php" enctype="multipart/form-data" method="post"> <input id="file" name="file" type="file" /> <input type="submit" /> </form>sendmail.php
$sendTo = "user@email.add"; //送信先(ユーザー)メールアドレス
$sendFrom = "admin@email.add"; //送信元(アドミン)メールアドレス
$subject = "dummy subject"; //任意のタイトル
$message = "画像を添付します"; //任意のメッセージ
$boundary = md5(uniqid( random() )); //boundaryIDを発行
$_FILES["file"]["name"];
$_FILES["file"]["type"];
$_FILES["file"]["tmp_name"];
if(file_exists($_FILES["file"]["tmp_name"])){
#題名をISO-2022-JPエンコード
$subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B");
$header = "";
$header .= "From: $sendFrom\n";
$header .= "Content-Type: multipart/mixed;boundary=\"$boundary\"\n";
$header .= "X-Mailer: PHP/".phpversion()."\n";
$header .= "MIME-version : 1.0\n";
$body = "";
#テキスト追加
$body .= "--$boundary"; //頭に--をつけた$boundaryで区切る
$body .= "Content-Type: text/plain;charset=ISO-2022-JP;format=followed";
$body .= "Content-Transfer-Encoding: 7bit\n";
$body .= "\n"; //テキスト部のheader終了
$body .= "$message\n";
$body .= "\n"; //テキスト部のbody終了
#添付ファイル追加
$body .= "--$boundary"; //頭に--をつけた$boundaryで区切る
$body .= "Content-Type: ".$_FILES["file"]["type"].";name=\"$_FILES["file"]["name"]\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "Conteint-Disposition: attachment;filename=\"$_FILES["file"]["name"]\"\n";
$body .= "\n"; //添付ファイル部のheader終了
#ファイルをエンコードする
//-----
$fp = fopen($_FILES["file"]["tmp_name"], "r") or die("error"); //添付ファイルを開く
$contents = fread($fp, filesize($_FILES["file"]["tmp_name"])); //添付ファイルを読む
fclose($fp); //添付ファイルを閉じる
$f_encoded = chunk_split(base64_encode($contents)); //添付ファイルをbase64エンコードする
//-----
$body .= "$f_encoded\n";
$body .= "\n"; //添付ファイル部のbody終了
mail($sendTo, $subject, $body, $header);
echo "success!";
}else{
echo "error";
}
?>
PHPの\nとか足す感じがめちゃくちゃきらいです。
まーきっとそれはボクがへちょいからでしょう。いいやり方は覚えていきたいものの、PHPはあんまりやらないようがんばろうと思います。
今回の動画はUnderworld。そいや昔どこかでストレイテナーがBorn Slippyをバンドでコピーしてた動画をみたんだけれども見つかりませんでした。
こういう曲を生演奏で再現されるとキュンとする。