[php]PHPMailerで添付ファイル付きのメールを送る

Reading Time: 2 minutes

ざっくりとした流れの理解

やりたいこと

自作したメーラーはセキュリティやらメールの扱いやらが終わってるので突き詰めることに努力するくらいならPHPMailerを使う。
添付ファイルもやる。

添付ファイルの扱いを理解

  1. 一旦サーバーにデータをアップロードする。
  2. サーバーに上がったデータをメール添付する。
  3. メールを送信する。
  4. サーバーに上がったデータを削除する。

こんな感じになるのでちょっとめんどくさい。
要はアップローダーを作れという話。

入力ページを作る

前の記事をそのまんまやればいいんでないかな。
ファイルを選択してsubmitするように作る。

入力確認画面(ファイルのアップロード)

前項を受けて、添付ファイル用のディレクトリを作ってそこにアップするように組む。同階層に「temporary」って名前で作るとしたらこんな感じ。

ファイルがpostされてるか確認して「move_uploaded_file」でアップロード処理。ディレクトリ込みでファイル名を指定してるところに注意。

ディレクトリ名込みのファイル名はメール添付とファイル削除に使うのでformでまたpostする。

メール送付・ファイル削除

前の記事のやつにちょっと足せばいいかんじ。

前の記事をベースに「ファイルがあるなら添付する」「ファイルがあるなら送信後に削除する」をそれぞれ書き込んである。

動作はこんな感じで、これをベースに項目をいじったりセキュリティをアレコレしておしまい。

導入時の注意

やっぱり気になるのは同じ名前のファイルを同時に送信されたらどうなるのっていうところ。同名だった場合は上書きされちゃうので非常にまずい。ユニークなんちゃらとかランダムなんちゃらを生成してファイル名に足したらいいんじゃないかな。送る際に文字列がそのままにならないようにまたリネームして。

これでいう確認画面で操作をやめられたら一時保存用のディレクトリにファイルが残りっぱなしになるのも難点。アップロードで終わってるからどうしようもないんで、古いやつは消すみたいなのをやるしかないのかなって感じがある。

ファイル名について

尚、全角でファイル名が付けられていた場合、エンコードが変わるので添付ファイルの名前がぶっ壊れる。
めんどくさいならこちらでリネームしちゃえばいい。

添付ファイルの名称を変更したければ、例えばこんな感じでやれる。添付時のファイル名を後に追記すればいい。
拡張子まで書かないと拡張子なしのファイルになっちゃうのと、全部「image.jpg」でええんじゃ!ってとこで思考停止しちゃうと他の拡張子だったら非常にまずいから気をつけるように。

全角ファイル名対応版

添付ファイルのファイル名が全角だった場合文字化けする。
前項の感じでファイル名をこっちで半角英数にしちゃえば回避できるけど拡張子判別のなんちゃらもめんどくさいし、拡張子くっついてるしファイル名をそのまま使いたいじゃんっていう。

探り探りやったので書式が本当に正しいかは謎だけどとりあえず。
htmlのmetaで宣言してるそっちが優先されるんじゃね?っていう安易な考えから、内部エンコーディングを全て「UTF-8」「base64」で統一。そうすると件名とか本文とか各所をエンコードする必要がないから直接内容をぶっこむ。ファイル名は多分、これらのエンコードを通さずに直接ぶっこんだからコードが違っちゃって文字化けしてたんじゃねーのってことで、それもUTF-8だろうと高をくくって触らずにそのまま。

使ってみたら文字化けしないで送れた。

多分、逆にファイル名の書式をどうのこうのすることもできたんじゃないかなって思ったりもしたんだけど、そうすれば追加するだけで済んだんじゃないのって思うんだけど、ソースがスッキリしたから結果オーライかなって。

ユニーク名でアップロードする安心感

よっぽど運が悪くなきゃぴったり同じタイミングで、しかも同じファイル名で送ってくるなんてことはないと思うんだけどね。一応被ってファイルが上書きされるのを回避する手段を組み立てる。

要するにファイル名がかぶらなければ上書きされないんだから、ファイル名にランダム文字数をぶっこんじゃえばいいじゃんっていう処置。

高まればもっと良いやりようはあるんだろうけど、とりあえずって感じでやっていく。ベースは上の方に書いてあるやつで、変更とか追加箇所を挙げていく。

入力ページ

とにかくユニークIDを生成する。uniqid()でもなんでも作り方はあるので、とにかくはファイル名として成立する種類・文字数の範囲で作る。
ブラウザバックじゃなくてsubmitで擬似的に「戻る」をやる場合のために、すでに登録があったら再生成しないようにifとかで制限はしておく。

確認ページ

生成した文字列とファイル名をくっつけてアップロードする。
リネームのために元のファイル名を一緒にPOSTする。

送信ページ

送付するファイルの指定とファイル名の指定。
まあこんな感じですね。
やることはいっぱいあるけどやってることは難しい話じゃない。

シェアする

  • このエントリーをはてなブックマークに追加