備忘録

備忘録

C# でSMTP サーバを建ててメールを受信する方法

Ⅰ. はじめに

タイトルの通り「C#SMTP サーバを建ててメールを受信する方法」です。
cosullivan/SmtpServer を使います

Ⅱ. やり方

1. NuGetから必要なライブラリをインストールする
Install-Package SmtpServer
Install-Package MimeKit
Install-Package System.Text.Encoding.CodePages

※.NET CLIの場合

dotnet add package SmtpServer
dotnet add package MimeKit
dotnet add package System.Text.Encoding.CodePages
2. サンプルプログラムを書く
using MimeKit;
using SmtpServer;
using SmtpServer.Mail;
using SmtpServer.Protocol;
using SmtpServer.Storage;
using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace SmtpServerTest
{
  public class SampleMessageStore : MessageStore
  {
    public override Task<SmtpResponse> SaveAsync(ISessionContext context, IMessageTransaction transaction, CancellationToken cancellationToken)
    {
      var textMessage = (ITextMessage)transaction.Message;

      var message = MimeMessage.Load(textMessage.Content);

      Console.WriteLine($"date: [{message.Date}]");
      Console.WriteLine($"subject: [{message?.Subject}]");
      Console.WriteLine($"text_body: [{message?.TextBody.Trim()}]");
      Console.WriteLine($"html_body: [{message?.HtmlBody.Trim()}]");

      return Task.FromResult(SmtpResponse.Ok);
    }
  }

  class Program
  {
    static async Task Main(string[] args)
    {
      Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

      var options = new OptionsBuilder()
        .MessageStore(new SampleMessageStore())
        .Port(25)
        .Build();

      var smtpServer = new SmtpServer.SmtpServer(options);
      await smtpServer.StartAsync(CancellationToken.None);
    }
  }
}
3. ドメインにMXレコードを登録する
4. Gmailから送信テスト

f:id:kagasu:20170828173122p:plain

5. 受信結果

f:id:kagasu:20170828173146p:plain

Ⅲ. トラブルシューティング

Q. メールが受信できない
A. ファイアウォール設定を適切に行う