2011年2月20日日曜日

Gmailの内容をIMAPで取得する ImapX編

送信されてきたメールをIMAPで取得、解析して内容をDBに突っ込もう、というツールが必要だったので良いライブラリが無いかと探して見つけたのが下記。

ImapX – free for use .NET library
数あるライブラリの中でもObject Modelがよく設計されているので至極簡単に使えて便利。ただOpen Sourceではないので何か問題があったときに何も対処できないし、作者のレスポンスもかなり遅いので対応は期待できないので注意が必要だ。

今回の要件は下記。
  • Gmailを使う
  • 画像の添付がある
  • IMAPを使う(未読メールのみ取得したいため)

GmailのアカウントでIMAPを使えるようにする方法は下記を参照のこと。
Enabling IMAP

で、実際のソースコードはこんな感じ。
var client = new ImapX.ImapClient("imap.gmail.com", 993, true);
var result = false;

result = client.Connection();
if (result)
    Console.WriteLine("@Connected");

result = client.LogIn("username", "password");
if (result)
    Console.WriteLine("@Logged in");

// 未読のものだけ取得
var messages = client.Folders["INBOX"].Search("UNSEEN", true);  // Searchの第二引数をfalseにする場合は、後でMessage.Processを呼び出す必要がある
foreach (var m in messages)
{
    //m.Process();  // Searchの第二引数がfalseの場合はこの処理が必要
    m.SetFlag(ImapX.ImapFlags.SEEN);    // 既読フラグを設定
    foreach (var attachment in m.Attachments)
    {
        var location = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        attachment.SaveFile(Path.Combine(location, m.From[0].Address));     // SaveFileを呼び出すと添付ファイルのファイル名で指定の場所に保存してくれる
    }

    // テキストをデコードする
    var encoding = Encoding.GetEncoding("iso-2022-jp");  // 実際にはContentTypeのCharsetからエンコード名を取得しよう
    var text = encoding.GetString(encoding.GetBytes(m.TextBody.TextData));

    // Do someting...
}

Searchメソッドに使えるコマンドは、ALL、ANSWERE、BCC、BEFORE、BODY、CC、DELETED、DRAFT、FLAGGED、SEEN、UNSEENなどのほかにもかなりあるのでImapX.dllと一緒に配布されるimap search commands.txtを参照して欲しい。

POP3で良いのならOpenPop.NETもかなり使いやすい。サンプルコード集も分かりやすい。

2 件のコメント:

  1. とてもすばらしい記事だったので、ImapX.dll をダウンロードして実験してみました。
    実行すると、
    ”アセンブリ 'IMAPX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' から型 'ImapX.ImapClient' を読み込めませんでした”
    というエラーがでてしまうのですが、未熟な自分が、何か基本的なことを忘れているような気がするのですが、アドバイスいただけたら、幸いです。

    返信削除
    返信
    1. す、すいません。お返事大変遅くなりました。
      状況から推察するとImapX.dllが読み込めていないようですね。実行時に型が見つからないということなので、もしかしたらImapX.dllのコンパイル時に参照していた.net frameworkのVersionが実行されている環境にないのかもしれません。

      今現在手元に環境がないので検証できないのですが、ImapX.dllが.net framework3.5のアセンブリを参照しているようでしたらVisual Studioのターゲットを3.5にするか3.5 versionの.net frameworkがインストールされている必要があります。4.0の場合でしたら同様に4.0が必要です。

      削除