Gmail操作(IMAPを利用して受信してみる)

社内でGmailの受付状況を共有できるシステムが必要になったので、とりあえずIMAP経由で受信できるか試してみた。

  • 事前準備
    メール操作したいアカウントにログインし、「ログインとセキュリティ (https://myaccount.google.com/security)」の「ページの安全性の低いアプリの許可」を「有効」にしておく必要があり。

で、実際のコード。こんな感じに。

<?php 
$imapServer = "imap.googlemail.com"; //IMAPサーバーホスト 
$portNumber = 993; //ポート番号 
$account = (Gmailのアカウント); //Gmailのアカウント 
$password = (Gmailのパスワード); //Gmailのパスワード 

// 接続情報 
$connString = "{$imapServer}:{$portNumber}/novalidate-cert/imap/ssl}" // メールボックスへ接続(とりあえず受信トレイ) 
$mbox = @imap_open("{$connString}INBOX", $account, $password); // 未読メール(UNSEEN)取得 
$uids = imap_search($mbox, 'UNSEEN', SE_UID); 

foreach($uids as $msgno) { 
	// ヘッダー情報取得 
	$header = imap_headerinfo($mbox, $msgno); 

	// メールボックスの名称 
	$mailbox = mysql_real_escape_string($header->from[0]->mailbox);
 
    // ホスト名
    $host     = mysql_real_escape_string($header->from[0]->host);
 
    // メール受信
    $mailDate = date("Y-m-d H:i:s",strtotime($header->Date));
 
    // 件名
    $subject  = mb_decode_mimeheader($header->subject);
 
    // 本文
    $body     = getBody($msgno,$mbox);
    $body     = strip_tags(trim($body));
 
  // あとは必要な処理を記述
 
}
 
// 添付ファイルの有無や、HTMLメールなのかどうかで受け取り方が変わってくるらしいので、
// 適当に関数コピペして対応。
function getBody($uid, $imap){
 
    $body = get_part($imap, $uid, "TEXT/HTML");
 
    // if HTML body is empty, try getting text body
    if ($body == "") {
        $body = get_part($imap, $uid, "TEXT/PLAIN");
    }
    return $body;
}
 
function get_part($imap, $uid, $mimetype, $structure = false, $partNumber = false){
 
    if (!$structure) {
        $structure = imap_fetchstructure($imap, $uid, FT_UID);
    }
 
    if ($structure) {
        if ($mimetype == get_mime_type($structure)) {
            if (!$partNumber) {
                $partNumber = 1;
            }
            $text = imap_fetchbody($imap, $uid, $partNumber, FT_UID);
            switch ($structure->encoding) {
                case 3:
                    return imap_base64($text);
                case 4:
                    return imap_qprint($text);
                default:
                    return $text;
            }
        }
 
        // multipart
        if ($structure->type == 1) {
            foreach ($structure->parts as $index => $subStruct) {
                $prefix = "";
                if ($partNumber) {
                    $prefix = $partNumber . ".";
                }83.                 $data = get_part($imap, $uid, $mimetype, $subStruct, $prefix . ($index + 1));
                if ($data) {
                    return $data;
                }
            }
        }
    }
    return false;
}
 
?>

シェアする

  • このエントリーをはてなブックマークに追加

フォローする