PHPからGmailのメールを取得してゴニョゴニョする

NO IMAGE

ぐぐって調べた情報だとどうにもうまくいかず、試行錯誤したのでメモメモ

環境

imapを使うので、Gmailの設定でimapをONにする
PHP側もphp_imapが必要になるので入ってるか確認、入ってなければインストールします

接続確認をする

// Connect to gmail
$imapPath = '{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX';
$username = '[email protected]';
$password = 'hogehoge';
 
// try to connect
$inbox = imap_open($imapPath,$username,$password) or die('Cannot connect to Gmail:'.imap_last_error());

エラーが返ってくる場合

こんなエラーメッセージが返ってきます
Cannot connect to Gmail: Can’t open mailbox {imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX: invalid remote specification

この時は、メールボックスに、「Google アカウント: ログイン試行をブロックしました」というメールが来るので、メール本文にあるリンクから、安全性の低いアプリのアクセスを許可してあげます

さらに https://accounts.google.com/b/0/DisplayUnlockCaptcha へアクセスし許可するとPHPからアクセスできるようになる

未読のメールのみ取得する

$uids = imap_search($inbox, 'UNSEEN', SE_UID);

UNSEENの部分を変えればいろいろな条件で絞り込める
PHP: imap_search – Manual

タイトル、本文を取得する

foreach($uids as $msgno) {

    $header = imap_headerinfo($inbox, $msgno);
    $subject = mb_convert_encoding(mb_decode_mimeheader($header->subject), 'utf-8');

    $body = imap_fetchbody($inbox, $msgno, 1, FT_INTERNAL);
    $body = trim($body);

    $context = mb_convert_encoding(imap_base64($body), 'UTF-8', 'auto');

gmailの場合は本文はBASE64エンコードされているようなので、デコードしてあげないといけない

参考サイト
imap関数を使ってGmailのメールを取得する – ONILOQ NOTE