C#を使ってIMAPサーバーからメールを受信したい。。。
この記事では、C# を使用して IMAP サーバーに接続し、メールを受信する方法について紹介しています。
オープンソースライブラリである「MailKit」を使うことで簡単にメールを受信することが可能です。このライブラリはメールの受信だけでなく、送信もできます。次の記事で紹介していますので、興味ある方は覗いてみてください。
C# を使ったメール受信方法について知りたいという方はぜひ最後まで読んでみてください。
オススメの参考書
C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。
C#でメールを受信するには?
C# でメールを受信する方法として、オープンソースライブラリの「MailKit」を利用する方法があります。
MailKitとは?
MailKit(メールキット)は、メールの送信や受信などメールに関する機能を提供する .NET 用のライブラリです。「SMTP クライアント」「POP3 クライアント」「IMAP4 クライアント」などのプロトコルをサポートしています。
メールを送信する場合は SMTP、メールを受信する場合は POP3 または IMAP4 を利用します。メールの送信に関しては標準ライブラリだったSystem.Net.Mail.StmpClient
は廃止(非推奨)になっており、代わりに Microsoft の公式サイトでは MailKit を使うことが推奨されています。
この記事では IMAP サーバーからメールを受信する方法を紹介します。
\ MailKit の Githubサイトへ /
.NETでメール操作できる便利なライブラリ!!
MailKit は MimeKit に依存しており、MimeKit のクラスを利用します。
MimeKit は MIME(Multipurpose Internet Mail Extension)という規格に準拠しており、多くのメール関連の操作をサポートしています。
MIME について
メールは元々テキストベースのシステムで英語(ASCII コード)の仕様が前提でした。そのため、ASCII コード以外のデータ(日本語などマルチバイト文字や画像、音声)は扱うことができないデメリットがありました。
そのデメリットを解決したのがMIME。テキスト以外も扱えるようにデータを ASCII コードに変換する仕組みであり、メールでデータのやり取りを行う上でも欠かすことのできない重要なプロトコルとなっています。
インストールするには?
MailKit は NuGet からインストールできます。
インストールしたいプロジェクトを Visual Studio で起動して、次の作業を行います。
ソリューションエクスプローラーからプロジェクト名で右クリックして、[NuGet パッケージの管理]をクリックします。
NuGet パッケージマネージャー画面が開くので、[参照]タブを選択して検索欄に「MailKit」と入力します。
検索結果の一覧にある Jeffrey Stedfast 氏が提供する「MailKit」を選択して、[インストール]ボタンをクリックします。
インストールが正常に完了すると、下図のようにアイコンに が付きます。
IMAPサーバーからメールを受信する
ここからは MailKit でメールを受信する方法を紹介します。紹介するサンプルコードは以下の環境で動作確認を行っています。
環境
- 統合開発環境:Visual Studio 2022
- フレームワーク:.NET 7.0
- MailKit のバージョン:4.3.0(公開日 2023/11/12)
サンプルコード
以下のコードが MailKit で IMAP サーバーからメールを受信するサンプルコードです。
public class MailService
{
private readonly Mail _mail;
public MailService(Mail mail)
{
_mail = mail;
}
public async Task ReceiveMailAsync(string FolderPath)
{
using (var imap = new MailKit.Net.Imap.ImapClient())
{
try
{
// IMAPサーバの接続
await imap.ConnectAsync(_mail.ImapHost, _mail.ImapPort, SecureSocketOptions.SslOnConnect);
Debug.WriteLine("接続成功");
// POP3サーバの認証
await imap.AuthenticateAsync(_mail.UserName, _mail.Password);
Debug.WriteLine("認証成功");
// ReadOnlyでInboxを開く
await imap.Inbox.OpenAsync(FolderAccess.ReadOnly);
// すべてのメールを取得
var uids = await imap.Inbox.SearchAsync(SearchQuery.All);
foreach (var uid in uids)
{
var message = await imap.Inbox.GetMessageAsync(uid);
// 送信元を取得する
Debug.WriteLine($"送信元:" +
$"{string.Join(",", message.From.OfType<MailboxAddress>()
.Select(f => $"{f.Name} <{f.Address}>")
.ToArray())}");
// 宛先を取得する
Debug.WriteLine($"宛先:" +
$"{string.Join(",", message.To.OfType<MailboxAddress>()
.Select(t => $"{t.Name} <{t.Address}>")
.ToArray())}");
// Ccを取得する
Debug.WriteLine($"Cc:" +
$"{string.Join(",", message.Cc.OfType<MailboxAddress>()
.Select(c => $"{c.Name} <{c.Address}>")
.ToArray())}");
// 件名を取得する
Debug.WriteLine($"件名:{message.Subject}");
// メッセージを取得する
Debug.WriteLine($"{message.GetTextBody(MimeKit.Text.TextFormat.Plain)}");
}
}
catch (Exception ex)
{
Debug.WriteLine($"Failed receive:{ex}");
}
}
}
}
public class Mail
{
public string ImapHost { get; set; }
public int ImapPort { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
ImapClientクラスでPOPサーバーへ接続する
MailKit のImapClient
クラスのインスタンスを生成します。
var imap = new MailKit.Net.Imap.ImapClient()
このオブジェクトに、IMAP サーバーの URL、ポート番号、使用するアカウント名、パスワードなど必要な情報を設定して、IMAP サーバと接続・認証を行います。
Inbox.OpenAsyncメソッドでメールの受信ボックスを開く
ImapClient
のInbox.OpenAsync
メソッドを使用します。
await imap.Inbox.OpenAsync(FolderAccess.ReadOnly);
このメソッドを利用することで、IMAP サーバーの受信ボックスを開くことができます。その際、受信ボックス内のメールを書き換えることがないように、Inbox.OpenAsync
メソッドの引数にFolderAccess.ReadOnly
を指定して読み取りモードで受信ボックスを開きます。
受信ボックスからメールのUniquIdを取得する
ImapClient
のInbox.SearchAsync
メソッドを使用して、受信ボックスから受信(取得)したいメールを検索します。
var uids = await imap.Inbox.SearchAsync(SearchQuery.All);
検索条件はメソッドの引数で指定します。検索結果に一致するメールの Uniquid がメソッドから返ってきます。上記の例だと、受信ボックス内のすべてのメールを受信します。
他の例として、件名に「お問い合わせ」が含まれているメールを受信したい場合はSearchQuery.SubjectContains
を使って次のように記述します。
var query = SearchQuery.SubjectContains("お問い合わせ");
var uids = await imap.Inbox.SearchAsync(query);
送信元に「@gmail.com」が含まれているメールを受信したい場合はSearchQuery.FromContains
を使って次のように記述します。
var query = SearchQuery.FromContains("@gmail.com");
var uids = await imap.Inbox.SearchAsync(query);
件名に「お問い合わせ」が含まれている、かつ送信元に「@gmail.com」が含まれているメールを受信したい場合はAnd
を使って次のように記述します。
var query = SearchQuery.SubjectContains("お問い合わせ").And(SearchQuery.FromContains("Gmail"));
var uids = await imap.Inbox.SearchAsync(query);
検索条件として、アドレス(FromContains、ToContains、CcContains、BccContains)、配信時刻(DeliveredAfter、DeliveredBefore、DeliveredOn:引数は DateTime)、送信時刻(SentAfter、SentBefore、SentOn:引数は DateTime)、メールのサイズ(SmallerThan、LargerThan:引数は int で Octets = 8bit)があります。
GetMessageAsyncメソッドでメールを受信する
MailKit のGetMessageAsync
メソッドを使用します。
var message = await imap.GetMessageAsync(uid);
このメソッドに受信したいメールのUniquid
を指定して、IMAP サーバーからメールを受信します。受信したメールには差出人や件名などの情報が含まれています。
GmailのIMAPサーバーを利用して受信する
メールを受信するには、上記のReceiveMailAsync
メソッドに IMAP サーバーの情報を設定する必要があります。
Gmail の IMAP サーバーを使ってメールを受信するために、Mial
クラスに定義されている4つのプロパティ(ImapHost
、ImapPort
、UserName
、Password
)を設定します。
ImapHost
:imap.gmail.comImapPort
:993UserName
:Googleアカウントのメールアドレス(”@gmail.com”は除く)Password
:アプリ パスワード
IMAP サーバーで利用するPassword
は、Google アカウントのセキュリティ設定から2段階認証のアプリパスワードを設定する必要があります。※Password は Google アカウントのパスワードではありません。
[Googleへのログイン]で[2段階認証プロセス]を選択します。
ページの下部までスクロールし、[アプリ パスワード]を選択します。
アプリパスワードが分かる名前を入力して[作成]ボタンをクリックします。
画面上に16桁のアプリ パスワードが表示されます。
Gmail の IMAP サーバーを使ったサンプルコードが以下になります。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private async void Button_Click(object sender, RoutedEventArgs e)
{
var mail = new Mail()
{
ImapHost = "imap.gmail.com",
ImapPort = 993,
UserName = "xxxxxxx",
Password = "1234567890123456",
};
var service = new MailService(mail);
// メールを受信する場合
await service.ReceiveMailAsync();
}
}
まとめ
この記事では、MailKit を使って C# で IMAP サーバーからメールを受信する方法について紹介をしました。
メールを受信する場合は、POP と IMAP の2種類があります。従来は1台の端末でメールの受信を行う POP が利用されていましたが、インターネットのブロードバンド化やサーバーの性能向上などにより、IMAP での受信方式が主流になっています。
POP サーバーからメールを受信する方法は次の記事を参照してください。
この記事が参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。