> 作業効率UP!! オススメのモバイルモニターを紹介

【C#】IMAPサーバーからメールを受信する方法を(MailKit)

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

C#を使ってIMAPサーバーからメールを受信したい。。。

この記事では、C# を使用して IMAP サーバーに接続し、メールを受信する方法について紹介しています。

IMAP(Internet Message Access Protocol)は、電子メールサーバーからメッセージを取得するために最も一般的に使用されているプロトコル(通信方式)です。

オープンソースライブラリである「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 で起動して、次の作業を行います。

STEP
NuGet パッケージマネージャー画面を開く

ソリューションエクスプローラーからプロジェクト名で右クリックして、[NuGet パッケージの管理]をクリックします。

STEP
MailKitを検索する

NuGet パッケージマネージャー画面が開くので、[参照]タブを選択して検索欄に「MailKit」と入力します。

STEP
インストールする

検索結果の一覧にある 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メソッドでメールの受信ボックスを開く

ImapClientInbox.OpenAsyncメソッドを使用します。

await imap.Inbox.OpenAsync(FolderAccess.ReadOnly);

このメソッドを利用することで、IMAP サーバーの受信ボックスを開くことができます。その際、受信ボックス内のメールを書き換えることがないように、Inbox.OpenAsyncメソッドの引数にFolderAccess.ReadOnlyを指定して読み取りモードで受信ボックスを開きます。

受信ボックスからメールのUniquIdを取得する

ImapClientInbox.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 サーバーからメールを受信します。受信したメールには差出人や件名などの情報が含まれています。

IMAP サーバーて何ですか?

IMAP(Internet Message Access Protocol)は、電子メールサーバーからメッセージを取得するために最も一般的に使用されているプロトコル(通信方式)です。

IMAP サーバーは 電子メールを受信する際に接続するメールサーバーの一種で、メール受信プロトコルの IMAP に対応している受信サーバーです。代表的な IMAP サーバーを以下に記述しています。

SMTPプロバイダSMTPサーバーポートURL
Gmailimap.gmail.com993gmail.com
Yahoo!JAPANimap.mail.yahoo.co.jp993yahoo.co.jp
Outlookimap-mail.outlook.com993outlook.com
iCloudimap.mail.me.com993icloud.com

GmailのIMAPサーバーを利用して受信する

メールを受信するには、上記のReceiveMailAsyncメソッドに IMAP サーバーの情報を設定する必要があります。

Gmail の IMAP サーバーを使ってメールを受信するために、Mialクラスに定義されている4つのプロパティ(ImapHostImapPortUserNamePassword)を設定します。

  • ImapHost:imap.gmail.com
  • ImapPort:993
  • UserName:Googleアカウントのメールアドレス(”@gmail.com”は除く)
  • Password:アプリ パスワード

IMAP サーバーで利用するPasswordは、Google アカウントのセキュリティ設定から2段階認証のアプリパスワードを設定する必要があります。※Password は Google アカウントのパスワードではありません。

アプリ パスワードを作成するとセキュリティが低くなるので、自己責任でお願いします。

STEP
Googleアカウントを開き、[セキュリティ]を選択する

Googleアカウントに移動して、左側にあるサイドメニューから[セキュリティ]を選択します。

STEP
[2段階認証プロセス]を選択する

[Googleへのログイン]で[2段階認証プロセス]を選択します。

STEP
[アプリ パスワード]を選択する

ページの下部までスクロールし、[アプリ パスワード]を選択します。

STEP
パスワードを生成する

アプリパスワードが分かる名前を入力して[作成]ボタンをクリックします。

画面上に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 サーバーからメールを受信する方法は次の記事を参照してください。

この記事が参考になれば幸いです。

以上、最後まで読んで頂きありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!