ハマログ

株式会社イーツー・インフォの社員ブログ

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のメールアドレス宛に、ログインブロックの通知が届く。

20160507 170631

ちょっと調べて以下のページに到達。

Google アカウント ヘルプ
不審なアクティビティ – 安全性の低いアプリがアカウントにアクセスするのを許可する
https://support.google.com/accounts/answer/6010255

ページ内のリンクから、安全性の低いアプリの許可ページに移動して、接続を許可します。

20160507 171736

もう一回実行

接続成功

どうやらつながったようです。続いてメールボックスからメールの一覧を取得します。

// 略
$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 );
}

無事に動きました!

20160507 200215

encodeIMAPMailPHPPOPsubjectメール受信

kaneko tomo   kaneko tomo   2016年5月7日


関連記事

Nagiosでpingの応答が返ってこないサーバを監視する

Nagiosで死活監視をしているサイトのうち、サービスステータスが正常なのにホス…

SQLでinとexistsの話

最近開発した時、sqlも使いました。使った時、inとexistsの区別が分からな…

ガリガリ君神経衰弱つくりなおしました!

以前から公開していた、ガリガリ君公式アプリ「ガリガリ君 神経衰弱」をSwift2…


← 前の投稿

次の投稿 →