仕事でファイル付きメールを送るフォームを作成したときに、めちゃくちゃ調べたのでそのまとめ。

  1. input type=”file”でファイルアップロードができる。
  2. そのときformにenctype=”multipart/form-data”という属性をつける。
  3. メールのヘッダーはContent-Type: multipart/mixed;boundary=”任意の文字列”とする。
    multipart/mixedというのは複数のコンテントタイプが混ざってるということ。
    また、このときboundaryという任意の文字列は日付やらをmd5ハッシュしたものなどにする。
  4. 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をバンドでコピーしてた動画をみたんだけれども見つかりませんでした。
こういう曲を生演奏で再現されるとキュンとする。