ハマログ

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

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   2016年5月7日


関連記事

会社の研修

みなさん こんにちは 今年も順調に日々が過ぎていっております。 そろそろ暑い季節…

AWSにてmacOS環境の構築

はじめに リモートワークが進み自宅にて作業を行うことが多くなってきた関係で、検証…

GCPでLaravelのログ監視を行う方法

GCPでアプリケーションのログに特定の文字列が出てきたら検知して通知する方法を調…


← 前の投稿

次の投稿 →