C#でOutlookの受信メールを処理してみます。なお、Outlook関係なければ以前記事内で書いたMailKitでもできると思います。やってないですけど。

なんでOutlookなん?


ローカルの.pstファイルから受信メール引っ張り出したかったんですよ。今時POP3?っていうツッコミはなしね。ちなみに、今回Microsoft.Office.Interop.Outlookを使用しますが、Exchangeとか使ってると他人の公開予定表とか取得できます。

前提


Outlookがインストールされていること。されてない場合は知らん。ライセンス的に再頒布していいかどうかも調べてないので知らん。

ライブラリの追加


参照追加でMicrosoft Outlook 15.0 Object Libraryを追加します。バージョンはたぶんインストールしているOutlookのバージョンで変わると思います。

コードを書く


まず、クラスの参照に下記を追加します。

1
using Outlook = Microsoft.Office.Interop.Outlook;

その後、おもむろにコードを書きます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Collections.Generic;
using System.Text;
using Outlook = Microsoft.Office.Interop.Outlook;

class Program
{
static void Main(string[] args)
{

var outlookApp = new Outlook.Application();

//ローカルのファイル
outlookApp.Session.AddStore(@"C:\Users\User\Documents\Outlook ファイル\example.pst");

//サーバーにログオンする場合
var outlookNameSpace = outlookApp.GetNamespace("MAPI");
outlookNameSpace.Logon("ユーザー名", "パスワード", false, false);

//共通
var mapiFolders = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Folders;

foreach(Outlook.Folder folder in mapiFolders)
{
//フォルダ名で処理するかしないか判断
if(folder.Name != "テスト")
{
continue;
}

//フォルダの中身を一つづつ取り出す
foreach(Outlook.MailItem mail in folder.Items)
{
//ヘッダー・送信者アドレス・題名・本文を取得
Console.WriteLine(mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E"));
Console.WriteLine(mail.SenderEmailAddress);
Console.WriteLine(mail.Subject);
Console.WriteLine(mail.Body);
}
}
}
}

以上です。
だと、ちょっと説明不足なので、ちょっと解説します。

「解説いらね~わ。ドキュメント見せろ!」って人は下記のMSDNライブラリ見てね。

Microsoft.Office.Interop.Outlook 名前空間

解説


まず、Applicationクラスのインスタンスを生成します。

1
var outlookApp = new Outlook.Application();

次に、ローカルの.pstファイルを読みます。.pstは普通にOutlookをインストールすると下記の場所にあると思います。

1
outlookApp.Session.AddStore(@"C:\Users\User\Documents\Outlook ファイル\example.pst");

サーバーに直接ログオンしたいひとは上記の.pstファイルの読み込みの代わりに下記を記述します。詳しいログオンの説明はこちらを見るべし。ちなみに、Exchangeの場合だと下記のコードではログインできないです。

1
2
var outlookNameSpace = outlookApp.GetNamespace("MAPI");
outlookNameSpace.Logon("ユーザー名", "パスワード", false, false);

次に受信メールのフォルダを取得します。GetDefaultFolderの引数に指定するOlDefaultFolders列挙体を変えることで様々なフォルダを取得できます。詳しくはこちらを見るべし

1
var mapiFolders = outlookApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox).Folders;

上記のコードの場合mapiFoldersに受信フォルダ一覧が取得できます。後はグルグル回すだけ。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
foreach(Outlook.Folder folder in mapiFolders)
{
//フォルダ名で処理するかしないか判断
if(folder.Name != "テスト")
{
continue;
}

//フォルダの中身を一つづつ取り出す
foreach(Outlook.MailItem mail in folder.Items)
{
//送信者アドレス・題名・本文を取得
Console.WriteLine(mail.SenderEmailAddress);
Console.WriteLine(mail.Subject);
Console.WriteLine(mail.Body);
}
}

ヘッダー情報を取得したい

ヘッダーの情報を取得したくありませんか?したいですよね?下記のコードで取得できます。

1
mail.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x007D001E");

この辺の解説は下記あたりに書いてあります。

名前空間でプロパティを参照する
PropertyAccessor.GetProperty メソッド (Outlook)

次回


たぶん、添付ファイルについて書くと思います。たぶんね。