メールの送信と比べると、プログラムで描く頻度は少ないですが、メールの受信について。
POP3サーバー
ほとんどのケースで、メーラーとのやり取りになるので、普段意識することはないですが、telnetを使ったコマンドラインとのやり取りでメールを受け取ることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
telnet pop3.lolipop.jp 110(popサーバーとポート番号を入力) Trying 157.7.107.4... Connected to pop3.lolipop.jp. Escape character is '^]'. +OK Hello there. user ユーザー名(通常はメールアドレス)を入力 +OK Password required. pass パスワード入力 +OK Connected to proxy server. LIST(メールボックスにあるメールを見せてと言う命令) +OK POP3 clients that break here, they violate STD53. 1 3202 (番号とサイズを見せてと言う命令) . RETR 1 (RETR 番号 で個別のメールを見せてと言う命令) +OK 3202 octets follow. ・・・(以下メールのヘッダーと本文が表示される) |
プログラムにてPOP3サーバーと通信
これをプログラムで書いたものが下記になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
$tcpsetting = sprintf("tcp://%s:%s", ポップサーバー名, ポート番号); $fp = fsockopen($tcpsetting, ポート番号, $err, $errno, 10); $r = fgets($fp, 1024); $message = sprintf("USER %s\r\n", ユーザー名); fputs($fp, $message) $r = fgets($fp, 1024); $message2 = sprintf("PASS %s\r\n", パスワード); fputs($fp, $message2); $r = fgets($fp, 1024); fputs($fp, "STAT\r\n"); $r = fgets($fp, 1024); sscanf($r, '+OK %d %d', $num, $size); //結果表示 var_dump($num, $size); //メールデータ取得(件数分 RETR) $data = array(); for ($i = 1; $i <= $num; ++$i) { //RETR n -n番目のメッセージ取得(ヘッダ含) fputs($fp, 'RETR ' . $i . "\r\n"); //+OK $res = fgets($fp, 512); $d = ""; while ($line = fgets($fp, 512)) { $d .= $line; } $data[$i] = $d; } //結果表示 var_dump($data); //終了 fputs($fp, "QUIT\r\n"); fgets($fp, 1024); |
通常はライブラリなどを使って取得することが一般的かと思います。
PHPにてメールを取得する場合
pearのNet_POP3とMail_mimeDecodeを使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
$pop3 = new Net_POP3(); $pop3->connect(ポップサーバー名); $pop3->login(ユーザー名, メールアドレス, true); $numMsg = $pop3->numMsg(); if ($numMsg > 0) { for ($i=1; $i <= $numMsg; $i++) { $decoder = new Mail_mimeDecode($pop3->getMsg($i)); $mailData = $decoder->decode([ 'include_bodies' => true, 'decode_bodies' => true, 'decode_headers' => true ]); //var_dump($mailData); echo $mailData->headers["from"] ."\n"; echo $mailData->body ."\n"; } } |
公式ドキュメント
Net_POP3
http://pear.php.net/manual/en/package.networking.net-pop3.php
Mail_MimeDecode
http://pear.php.net/manual/en/package.mail.mail-mimedecode.php
参考リンク
https://github.com/umanari145/mail_sample
[…] 以前、POP3を使ったメール受信というエントリーでメールパーサーをインストールしたんですが、他のライブラリをインストールする機会があったんでメモ。 […]