PHPでメールを受信して解析する方法を完全解説!初心者でもわかるIMAP・POP3入門
生徒
「PHPでメールを送ることは少しわかってきたんですが、受信することもできるんですか?」
先生
「できますよ。PHPではIMAPやPOP3という仕組みを使って、メールを受信して中身を読み取れます。」
生徒
「IMAPとかPOP3って聞いたことはありますが、正直よくわからなくて……。」
先生
「大丈夫です。メールボックスをのぞく方法だと思って、ゆっくり理解していきましょう。」
1. PHPでメールを受信できるとはどういうこと?
PHP(ピーエイチピー)でメールを受信するとは、メールサーバーに届いているメールをプログラムで読み取ることを意味します。普段はメールソフトやWebメールで受信ボタンを押して確認しますが、その作業をPHPが代わりに行うイメージです。
たとえば、お問い合わせフォームに届いたメールを自動で確認したり、件名や本文を取り出して保存したりできます。人が画面を見なくても処理できる点が大きな特徴です。
2. メール受信で使われるIMAPとPOP3とは?
メールを受信するときに使われる代表的な仕組みが、IMAP(アイマップ)とPOP3(ポップスリー)です。どちらも「メールサーバーからメールを取り出す方法」ですが、考え方が少し違います。
IMAPは、サーバー上にメールを残したまま内容を確認します。スマートフォンとパソコンで同じメールを見るような仕組みです。一方、POP3はメールを取り出して自分のところに保存する方式で、昔ながらの受信方法です。
3. PHPでIMAPを使う準備
PHPでIMAPを使うには、PHPにIMAP拡張機能が入っている必要があります。多くのレンタルサーバーでは最初から使える状態ですが、使えない場合は設定が必要です。
IMAPを使うときは、メールサーバーのアドレス、ユーザー名、パスワードを指定します。これは、郵便受けを開けるための鍵のようなものだと考えてください。
4. IMAPでメールボックスに接続する基本コード
まずはIMAPでメールサーバーに接続する基本的なPHPコードを見てみましょう。難しく見えても、役割を一つずつ理解すれば大丈夫です。
$hostname = '{mail.example.com:993/imap/ssl}INBOX';
$username = 'user@example.com';
$password = 'password';
$inbox = imap_open($hostname, $username, $password);
if ($inbox) {
echo 'メールボックスに接続できました';
} else {
echo '接続に失敗しました';
}
メールボックスに接続できました
imap_openは、メールボックスの扉を開く命令です。INBOXは受信箱を表します。
5. メールの件数を確認してみよう
接続できたら、次は何通メールが届いているかを確認します。これは、郵便受けに何通手紙が入っているか数える作業と同じです。
$emails = imap_num_msg($inbox);
echo 'メールは'.$emails.'通あります';
メールは3通あります
このように数字として取得できるので、条件分岐などにも使えます。
6. メールの件名と送信者を取得する
次に、実際のメールの中身を少し見てみましょう。ここでは件名と送信者を取り出します。
$header = imap_headerinfo($inbox, 1);
echo $header->subject;
echo $header->fromaddress;
お問い合わせありがとうございます
test@example.com
番号の「1」は一番新しいメールを指します。必要な情報だけを選んで使えるのが便利な点です。
7. メール本文を読み取る方法
メールの本文はimap_bodyを使って取得できます。長文でもそのまま読み取れるので、内容チェックに使えます。
$body = imap_body($inbox, 1);
echo $body;
こんにちは。
お問い合わせフォームから送信しました。
取得した本文は、画面に表示したり、ファイルに保存したりできます。
8. POP3を使う場合の考え方
POP3(ポップスリー)を使う場合も、基本的な流れは同じです。接続方法が少し変わるだけで、メールを取得して解析する考え方は共通しています。
POP3はメールを取り出すとサーバーから消える設定が多いため、「一度きりの確認」に向いています。用途に応じてIMAPと使い分けることが大切です。
9. メール受信後は必ず接続を閉じよう
最後に重要なのが、処理が終わったら接続を閉じることです。これは、開けた郵便受けをきちんと閉める作業にあたります。
imap_close($inbox);
これを忘れると、サーバーに余計な負担がかかることがあります。