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

【C#】メールを受信する方法を紹介(MailKit)

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

C#でメールを受信したい。。。

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

サードパーティ製のオープンソースライブラリである「MailKit」を使ってメールを受信します。このライブラリはメールの受信だけでなく、送信することも可能です。次の記事で紹介していますので、興味ある方は覗いてみてください。

C# でメールを受信したいという方はぜひ参考にしてみてください。

オススメの参考書

C#の使い方が丁寧に解説しており、「基礎からしっかりと学びたい」という初心者の方にオススメの一冊です。サンプルコードも記載してあり、各章の最後に復習問題があるので理解度を確認しながら読み進めることができます。新しい C# のバージョンにも対応している書籍です。

C#でメールを受信するには?

C# でメールを受信する方法として、オープンソースライブラリの「MailKit」を利用する方法があります。

MailKitとは?

MailKit(メールキット)は、メールの送信や受信などメールに関する機能を提供する .NET 用のライブラリです。「SMTP クライアント」「POP3 クライアント」「IMAP4 クライアント」などのプロトコルをサポートしています。

メールを送信する場合は SMTP、メールを受信する場合は POP3 または IMAP4 を利用します。メールの送信は標準ライブラリだったSystem.Net.Mail.StmpClientは廃止(非推奨)になっており、代わりに Microsoft の公式サイトでは MailKit を使うことが推奨されています。

この記事では POP3(Post Office Protocol Version 3)サーバーからメールを受信する方法を紹介します。

\ 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」を選択して、[インストール]ボタンをクリックします。

インストールが正常に完了すると、下図のようにアイコンに が付きます。

メールを受信する

ここからは MailKit でメールを受信する方法を紹介します。紹介するサンプルコードは以下の環境で動作確認を行っています。

環境

  • 統合開発環境:Visual Studio 2022
  • フレームワーク:.NET 7.0
  • MailKit のバージョン:4.3.0(公開日 2023/11/12)

サンプルコード

以下のコードが MailKit でメールを受信するサンプルコードです。

public class MailService
{
    private readonly Mail _mail;

    public MailService(Mail mail)
    {
        _mail = mail;
    }

    public async Task ReceiveMailAsync()
    {
        using (var pop3 = new MailKit.Net.Pop3.Pop3Client())
        {
            try
            {
                // POP3サーバの接続  
                await pop3.ConnectAsync(_mail.Pop3Host, _mail.Pop3Port, SecureSocketOptions.Auto);
                Debug.WriteLine("接続成功");

                // POP3サーバの認証  
                await pop3.AuthenticateAsync(_mail.UserName, _mail.Password);
                Debug.WriteLine("認証成功");

                // メール受信ループ
                for (int i = 0; i < pop3.Count - 1; i++)
                {
                    var message = await pop3.GetMessageAsync(i);

                    // 送信元を取得する
                    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 Pop3Host { get; set; }

    public int Pop3Port { get; set; }

    public string UserName { get; set; }

    public string Password { get; set; }
}

Pop3ClientクラスでPOPサーバーへ接続する

MailKit のPop3Clientクラスのインスタンスを生成します。

var pop3 = new MailKit.Net.Pop3.Pop3Client()

このオブジェクトに、POP3 サーバーの URL、ポート番号、使用するアカウント名、パスワードなど必要な情報を設定して、POP3 サーバと接続・認証を行います。

GetMessageAsyncメソッドでメールを受信する

MailKit のGetMessageAsyncメソッドを使用します。

var message = await pop3.GetMessageAsync(i);

このメソッドに受信したいメールのインデックスを指定して、POP3 サーバーからメールを受信します。受信したメールには差出人や件名などの情報が含まれています。

POP3 サーバーて何ですか?

POP3(Post Office Protocol Version 3)は、メールを受信するためのプロトコルです。

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

SMTPプロバイダSMTPサーバーポートURL
Gmail pop.gmail.com995gmail.com
Yahoo!JAPANpop.mail.yahoo.co.jp995yahoo.co.jp
Outlookpop-mail.outlook.com995outlook.com

POP は受信サーバーにあるメールをパソコンなどの端末にダウンロードして、端末上でメールを管理する仕組みになっています。1台の端末でメールを保存・移動・削除するため、複数の端末での利用は使い勝手が悪いです。複数の端末で利用する場合は IMAP を利用します。

サンプルコード(メールの保存と削除)

以下のコードが MailKit で POP サーバーからメールを保存し、保存したメールを POP サーバーから削除するサンプルコードです。

public class MailService
{
    private readonly Mail _mail;

    public MailService(Mail mail)
    {
        _mail = mail;
    }

    public async Task ReceiveMailAsync()
    {
        using (var pop3 = new MailKit.Net.Pop3.Pop3Client())
        {
            try
            {
                // POP3サーバの接続  
                await pop3.ConnectAsync(_mail.Pop3Host, _mail.Pop3Port, SecureSocketOptions.Auto);
                Debug.WriteLine("接続成功");

                // POP3サーバの認証  
                await pop3.AuthenticateAsync(_mail.UserName, _mail.Password);
                Debug.WriteLine("認証成功");

                // メール受信ループ
                for (int i = 0; i < pop3.Count - 1; i++)
                {
                    var message = await pop3.GetMessageAsync(i);

                    // 送信元を取得する
                    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)}");

                    // メールを保存するフォルダ作成
                    if (!Directory.Exists(FolderPath))
                    {
                        Directory.CreateDirectory(FolderPath);
                    }

                    // メールをローカルフォルダへ保存する
                    await message.WriteToAsync($"{FolderPath}\\{i}.msg");

                    // メールをPOPサーバーから削除する
                    await pop3.DeleteMessageAsync(i);
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine($"Failed receive:{ex}");
            }
        }
    }
}

public class Mail
{
    public string Pop3Host { get; set; }

    public int Pop3Port { get; set; }

    public string UserName { get; set; }

    public string Password { get; set; }
}

WriteToAsyncメソッドでメールを保存する

WriteToAsyncメソッドの引数にメールを保存するフォルダのパスを指定します。

await message.WriteToAsync($"{FolderPath}\\{i}.msg");

ファイルは msg 形式で保存しています。この形式は Microsoft Outlook や Exchange で使用される形式で、保存したファイルは Microsoft Outlook や Exchange で開くことができます。

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

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

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

  • Pop3Host:pop.gmail.com
  • PopPort:995
  • UserName:Googleアカウントのメールアドレス(”@gmail.com”は除く)
  • Password:アプリ パスワード

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

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

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

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

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

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

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

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

STEP
パスワードを生成する

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

画面上に16桁のアプリ パスワードが表示されます。

Gmail の POP サーバーを使ったサンプルコードが以下になります。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private async void Button_Click(object sender, RoutedEventArgs e)
    {

        var mail = new Mail()
        {
            Pop3Host = "pop.gmail.com",
            Pop3Port = 995,
            UserName = "xxxxxxx",
            Password = "1234567890123456",
        };
        var service = new MailService(mail);

        // メールを受信する場合
        await service.ReceiveMailAsync();
    }
} 

まとめ

この記事では、MailKit を使って C# で POP サーバーからメールを受信する方法について紹介をしました。

メールを受信する場合は、POP と IMAP の2種類があります。従来は1台の端末でメールの受信を行う POP が利用されていましたが、インターネットのブロードバンド化やサーバーの性能向上などにより、IMAP での受信方式が主流になっています。

IMAP サーバーからメールを受信する方法は、次の記事を参照してみてください。

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

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

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