Do You PHP?    
Search Engine Optimization  php5 powerd  Valid XHTML 1.0!  Valid CSS!  このサイトのはてなブックマーク数 



last updated
2008/08/08

counter hits
since 1999/11/06


IMAP関数でPOP3

alertここにある情報はかなり古くなっており、正しくなくなっている可能性があります。掲載しているサンプルコードiなどは、最新のPHPでは動作しない、もしくは、別途設定・調整が必要になるかも知れません。情報を鵜呑みにせず、あなたの手を動かして、あなたの目で確認してください。

memoPHP3の頃にもやったネタですが、PHP4用に焼き直しました。

PHPにはIMAP(Internet Message Access Protocol)用の関数が用意されていますが、PHPマニュアルにもあるようにPOP3・NNTPも使用できます。

IMAP関数を動作させるには、UW IMAPが必要となります。また、PHPのコンパイル時にCクライアントライブラリが必要となります。UW IMAPの最新版(2002/10/14時点でimap-2002.RC7)はftp://ftp.cac.washington.edu/imap/から取得できます。また、デフォルトでSSL対応IMAPをコンパイルするようになっていますので、OpenSSLを別途インストールしておく必要があります。簡単ですが、以下にインストール手順を示しておきます。

$ uncompress imap.tar.Z
$ tar xf imap.tar
$ cd imap-2002.RC7
$ make slx
$ su -
# cp -p c-client/rfc822.h c-client/mail.h c-client/linkage.h /usr/local/include/
# cp -p c-client/c-client.a /usr/local/lib/
  

cautionmake時に「osdep.c:198: ssl.h: No such file or directory 」などSSL関連のエラーが表示される場合は、src/osdep/unix/MakefileのSSL関連のパスを確認してみてください。特に、OpenSSLをrpmでインストールしている場合は、ソースからインストールした場合と比べディレクトリ構造が大幅に異なっていますので、注意が必要です。

memo[2002/10/15] SSL非対応にする場合は、imapのmakeオプションに「SSLTYPE=none」を追加します。この場合、PHPのconfigure時に「--with-imap-ssl」は不要です。

PHP側ですが、configure時に--with-imap=[c-client.aへのPREFIX]、--with-imap-ssl=[OpenSSLのインストールディレクトリ]」を付け、コンパイルします。

$ ./configure .... --with-imap=/usr/local --with-imap-ssl=/usr
$ make install
  

phpinfoを表示すると、以下のような感じになります。

phpinfo

以下は、POP3でメールサーバに接続し、メールを表示するサンプルです。

●imap.php

<?php
    $mailserver = "mailserver.foo.com";

    /**
     * POP3サーバと接続
     * Fedora系rpmなど、TLSサポートしたimap拡張で非TLS接続する場合、
     * 「/notls」を付ける
     */
    $mbox = @imap_open("{" . $mailserver . ":110/pop3/notls}INBOX", "username", "passwd");
    if ($mbox) {
        /* 新着確認 */
        $mboxes = imap_check($mbox);
        $mail_cnt = $mboxes->Nmsgs;

        echo "新着メールが $mail_cnt 件あります<BR>";

        /* 1通以上あれば */
        if ($mail_cnt > 0){
?>
<table border=1>
<tr>
<th>No</th><th>Subject</th><th>Date</th><th>From</th><th>Size</th>
</tr>
<?php
            /* 各メールのリストを作成 */
            for ($i = 1; $i <= $mail_cnt; $i++){
?>
<th><?php echo $i; ?></th>
<?
                $head = imap_header($mbox, $i);
                $body = imap_body($mbox, $i, FT_INTERNAL);
?>
<td nowrap>
<a href="mailBody.php?i=<?php echo $i; ?>" target="body">
<?php echo htmlspecialchars(mb_decode_mimeheader($head->subject)); ?>
</a>
</td>
<td nowrap><?php echo $head->date; ?></td>
<td nowrap><?php echo htmlspecialchars($head->fromaddress); ?></td>
<td nowrap><?php echo $head->Size; ?></td>
</tr>
<?php
            }
?>
</table>
<?php
        }
        imap_close($mbox);
    } else {
        /* 認証の失敗 */
        print("Unable to validate username/password.<BR>\n");
    }
?>

●mailBody.php

<?php
    $i = $_GET["i"];
    $mailserver = "mailserver.foo.com";

    /* POP3 サーバと接続 */
    $mbox = @imap_open("{" . $mailserver . ":110/pop3}INBOX", "username", "passwd");
    if ($mbox && $i > 0) {
        $head = imap_header($mbox, $i);
        $body = imap_body($mbox, $i, FT_INTERNAL);
        echo htmlspecialchars(mb_decode_mimeheader($head->subject));
?>
<HR>
<UL>
<LI>Date:<?php echo $head->date; ?>
<LI>From:<?php echo htmlspecialchars(mb_decode_mimeheader($head->fromaddress)); ?></TD>
</UL>
<HR>
<PRE><?php echo htmlspecialchars(
                    mb_convert_encoding($body, mb_internal_encoding(),
                        mb_detect_encoding($body))); ?></PRE>
<?php
        imap_close($mbox);
    } else {
        /* 認証の失敗 */
        print("Unable to validate username/password or invalid id.<BR>\n");
    }
?>



About This Site |  Privacy Policy |  Contact
Copyright © 1999 - 2008 by Hideyuki SHIMOOKA all rights reserved.