特定のメールアドレスで受信したメールを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 );
}
無事に動きました!








