PHPのメール添付ファイル送信を完全ガイド!初心者でもわかるPHPメール送信
生徒
「PHPでメールを送れるのは聞いたことがありますが、ファイルを一緒に送ることもできるんですか?」
先生
「できます。PHPのメール送信では、文章だけでなく、画像やPDFなどの添付ファイルも送れます。」
生徒
「難しそうに感じます……。パソコンもあまり触ったことがなくて。」
先生
「仕組みを一つずつ分解して考えれば大丈夫です。今日は超基本から説明します。」
1. PHPでメール送信とは何をしているのか
PHPのメール送信とは、サーバーというコンピューターから、メールを相手に届ける仕組みです。普段使っているメールソフトの代わりに、PHPが自動でメールを送ってくれるイメージです。添付ファイル付きメールも、基本は同じで「文章」と「ファイル」を一緒に箱詰めして送っています。
この箱詰めのルールをMIME(マイム)と呼びます。難しい名前ですが、「メールの中身の決まりごと」だと思ってください。
2. 添付ファイル付きメールで必要な要素
PHPで添付ファイルを送るためには、いくつか準備が必要です。まず送信先メールアドレス、件名、本文があります。これに加えて、添付したいファイルの場所と名前が必要になります。
さらに、メールヘッダーという情報も重要です。ヘッダーは、封筒に書く「差出人」や「中身の説明」のような役割を持っています。添付ファイルがある場合、このヘッダーを正しく書かないと、ファイルが壊れて届いてしまいます。
3. mail関数でシンプルにメールを送る
PHPにはmail(メール)関数という、メール送信専用の命令があります。まずは、添付ファイルなしの基本形を見てみましょう。これは「普通の手紙」を送る状態です。
$to = "test@example.com";
$subject = "テストメール";
$message = "これはPHPから送ったメールです。";
$headers = "From: sample@example.com";
mail($to, $subject, $message, $headers);
このプログラムでは、宛先、件名、本文、送信元を指定しています。これが添付ファイル送信の土台になります。
4. 添付ファイルの中身を読み込む
添付ファイルを送るためには、まずファイルをPHPで読み込みます。ここでは、同じフォルダにあるPDFファイルを例にします。ファイルはそのままでは送れないため、base64(ベース64)という形式に変換します。これは「壊れないように変換する方法」です。
$filePath = "sample.pdf";
$fileData = file_get_contents($filePath);
$encodedFile = base64_encode($fileData);
file_get_contentsは、ファイルの中身を丸ごと読み込む命令です。base64_encodeで、安全に送れる形にしています。
5. ヘッダーと本文を組み立てる
添付ファイル付きメールでは、本文とファイルを区切るための境界線を使います。これをboundary(バウンダリー)と呼びます。境界線は「ここからここまでが本文」「ここからがファイル」と区別するための目印です。
$boundary = uniqid("boundary_");
$headers = "From: sample@example.com\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"";
uniqidは、他と被らない文字列を自動で作る命令です。境界線は毎回違うほうが安全です。
6. 本文と添付ファイルを結合する
次に、メール本文と添付ファイルを一つの文章として組み立てます。ここでは「本文 → 添付ファイル」の順番で入れています。まるで、手紙の後ろに資料をホチキスで留める感覚です。
$body = "--{$boundary}\r\n";
$body .= "Content-Type: text/plain; charset=\"UTF-8\"\r\n\r\n";
$body .= "添付ファイル付きのテストメールです。\r\n";
$body .= "--{$boundary}\r\n";
$body .= "Content-Type: application/pdf; name=\"sample.pdf\"\r\n";
$body .= "Content-Transfer-Encoding: base64\r\n";
$body .= "Content-Disposition: attachment; filename=\"sample.pdf\"\r\n\r\n";
$body .= chunk_split($encodedFile);
$body .= "--{$boundary}--";
chunk_splitは、長い文字列を区切って読みやすくするための命令です。メールでは、この形が推奨されています。
7. 添付ファイル付きメールを送信する
最後に、ここまで作った情報をmail関数に渡して送信します。基本のmail関数と同じですが、本文とヘッダーが少し複雑になっています。
$to = "test@example.com";
$subject = "添付ファイルのテスト";
mail($to, $subject, $body, $headers);
これで、PHPから添付ファイル付きメールを送ることができます。最初は長く見えますが、一つずつ役割を理解すれば、怖くありません。
8. 初心者がつまずきやすい注意点
初心者の方がよく困るのは、ファイルの場所が違っているケースです。ファイル名の打ち間違いや、フォルダの位置が原因で送れないことがあります。また、サーバーによってはPHPのmail機能が使えない場合もあります。
まずは、小さなテキストファイルやPDFで試し、うまく動くことを確認しましょう。失敗しても、仕組みを理解していれば原因を探しやすくなります。