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 で起動して、次の作業を行います。
ソリューションエクスプローラーからプロジェクト名で右クリックして、[NuGet パッケージの管理]をクリックします。
NuGet パッケージマネージャー画面が開くので、[参照]タブを選択して検索欄に「MailKit」と入力します。
検索結果の一覧にある 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 サーバーからメールを受信します。受信したメールには差出人や件名などの情報が含まれています。
サンプルコード(メールの保存と削除)
以下のコードが 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つのプロパティ(Pop3Host
、Pop3Port
、UserName
、Password
)を設定します。
Pop3Host
:pop.gmail.comPopPort
:995UserName
:Googleアカウントのメールアドレス(”@gmail.com”は除く)Password
:アプリ パスワード
POP サーバーで利用するPassword
は、Google アカウントのセキュリティ設定から2段階認証のアプリパスワードを設定する必要があります。※Password は Google アカウントのパスワードではありません。
[Googleへのログイン]で[2段階認証プロセス]を選択します。
ページの下部までスクロールし、[アプリ パスワード]を選択します。
アプリパスワードが分かる名前を入力して[作成]ボタンをクリックします。
画面上に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 サーバーからメールを受信する方法は、次の記事を参照してみてください。
この記事が参考になれば幸いです。
以上、最後まで読んで頂きありがとうございました。