お試し 技術

エラー発生時にメールを送るようにしてみる(MailKit版)

以下のサイトを参考にYahooからメールを送ってみようと思います。

参考サイト
【C#】メールを送信する方法を紹介(MailKit)
【C#】メールを送信する方法を紹介(MailKit)

C#でメールを送信する場合は「MailKit」を使います。MailKitはメールの送信や受信などメールに関する機能を提供 ...

続きを読む

以下の環境で動作確認を実施しています

バージョン
OSWindows 11 Pro
.Net8.0
MailKit4.5.0

Yahooメールの設定

まずは、Yahooメール上でSMTPを使用できるように設定を変更する必要があります。以下のサイトを参考にSMTPを有効化します

公式サイト
Yahoo!メールヘルプ
Yahoo!メールヘルプ

続きを読む

少し手を加える

上記の参考サイトにあるコードに少しだけ手を加えて使いやすくします

public async Task SendMailAsync(string to, string from, string subject, string text)
{
    await SendMailAsync(to, from, "", subject, text, "");
}

public async Task SendMailAsync(string to, string from, string subject, string text, string filePath)
{
    await SendMailAsync(to, from, "", subject, text, filePath);
}

まずは、CCを使わない関数を用意します

public async Task SendMailAsync(string to, string from, string cc, string subject, string text, string filePath)
{
    // MimeMessageクラスのインスタンスを生成
    var message = new MimeMessage();

    // 送信元を追加  
    message.From.Add(new MailboxAddress("<送信元>", from));

    // 宛先を追加  
    message.To.Add(new MailboxAddress("<宛先>", to));

    // Ccを追加
    if(cc != "")
    {
        message.Cc.Add(new MailboxAddress("<Cc>", cc));
    }

    // 件名を設定
    message.Subject = subject;

    // 本文を設定
    if(filePath != "")
    {
        var multipart = new Multipart("mixed")
        {
            // 本文を設定 
            new TextPart(TextFormat.Plain)
            {
                Text = text,
            },
            // 添付ファイルを設定
            new MimePart(MimeTypes.GetMimeType(filePath))
            {
                Content = new MimeContent(File.OpenRead(filePath)),
                ContentDisposition = new ContentDisposition(),
                ContentTransferEncoding = ContentEncoding.Base64,
                FileName = Path.GetFileName(filePath)
            }
        };

        message.Body = multipart;
    }
    else
    {
        var textPart = new TextPart(TextFormat.Plain);
        textPart.Text = text;
        message.Body = textPart;
    }
    

    using (var client = new MailKit.Net.Smtp.SmtpClient())
    {
        try
        {
            // SMTPサーバに接続  
            await client.ConnectAsync(_mail.SmtpHost, _mail.SmtpPort);
            Console.WriteLine("接続完了");

            // SMTPサーバ認証  
            await client.AuthenticateAsync(_mail.UserName, _mail.Password);

            // 送信  
            await client.SendAsync(message);
            Console.WriteLine("送信完了");

            // 切断  
            await client.DisconnectAsync(true);

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Failed send:{ex}");
        }
    }
}

次にCCが設定されていない場合と添付ファイルがない場合でそれぞれ設定するようにしました

実際に使ってみる

SMTPの情報は最初に紹介している参考サイトに記載があるのでそちらを参考に設定しています

var mail = new Mail()
{
    SmtpHost = "smtp.mail.yahoo.co.jp",
    SmtpPort = 465,
    UserName = "yahooメールの@より前の部分",
    Password = "yahooメールのパスワード",
};

// 添付なしでメールを送信する場合
var service = new MailKit_Test(mail);
service.SendMailAsync(
    "送信先アドレス",
    "SMTPのUserNameと一緒@yahoo.co.jp",
    "テスト送信",
    "これはテストです。").Wait();

// 添付ありでメールを送信する場合
service.SendMailAsync(
    "送信先アドレス",
    "SMTPのUserNameと一緒@yahoo.co.jp",
    "テスト送信",
    "これはテストです。",
    @"Pictures\blog\サムネイル\サムネイル画像072.jpg").Wait();

これでエラー発生時にメールを送れるようになりました

-お試し, 技術
-