PHPでIMAP接続してメールを取得する
特定のメールアドレスで受信したメールをChatworkのAPIに送信するために、PHPでメールボックスを参照するプログラムを作成しました。
今回は接続先がGmailだったので、IMAPで取得してみました。
ためした環境はCentOS+PHP5.6、Gmail(IMAP)です。
まず、php.iniで、Mail Related ExtensionsのIMAPを有効にします。
extension=php_imap.dll
さっそく接続確認してみます。
$mailHost = 'imap.googlemail.com'; $mailPort = 993; $mailAccount = 'not_exist@e2info.com'; $mailPassword = 'PASSWORD'; $mailBox = imap_open('{' . $mailHost . ':' . $mailPort . '/novalidate-cert/imap/ssl}' . "INBOX", $mailAccount, $mailPassword); if (!$mailBox) { echo '接続失敗'; } echo '接続成功';
結果
接続失敗
いきなり失敗。Googleのメールアドレス宛に、ログインブロックの通知が届く。
ちょっと調べて以下のページに到達。
Google アカウント ヘルプ
不審なアクティビティ – 安全性の低いアプリがアカウントにアクセスするのを許可する
https://support.google.com/accounts/answer/6010255
ページ内のリンクから、安全性の低いアプリの許可ページに移動して、接続を許可します。
もう一回実行
接続成功
どうやらつながったようです。続いてメールボックスからメールの一覧を取得します。
// 略 $mailBox = imap_open('{' . $mailHost . ':' . $mailPort . '/novalidate-cert/imap/ssl}' . "INBOX", $mailAccount, $mailPassword); $messageIds = imap_search($mailBox, ALL); print_r($messageIds);
メッセージ番号の配列が取得できました。
Array ( [0] => 14 [1] => 15 )
また、以下のようにすると未読メッセージのみを対象としたUIDが取得できました。
// 略 $mailBox = imap_open('{' . $mailHost . ':' . $mailPort . '/novalidate-cert/imap/ssl}' . "INBOX", $mailAccount, $mailPassword); $messageIds = imap_search($mailBox, UNSEEN, SE_UID); print_r($messageIds);
参考
PHPマニュアル>関数リファレンス>メール関連>IMAP
結果
Array ( [0] => 115924 [1] => 115925 )
あとは件名と本文を取得します。
// 略 $messageIds = imap_search($mailBox, UNSEEN, SE_UID); foreach($messageIdsas $messageId) { $header = imap_headerinfo($messageBox, $messageId); // 件名 $subject = mb_decode_mimeheader($header->subject); // charset判定 $charset = // 省略。まじめにやるとちょっとややこしい // 本文 $body = imap_fetchbody($messageBox, $messageId, 1, FT_INTERNAL); $encodeBody = mb_convert_encoding($body, "UTF-8", $charset); $chatworkService->post($defaultRoomId, $encodeBody ); }
無事に動きました!