2017年04月20日
川俣晶の縁側ソフトウェア技術雑記total 265 count

Mailkitを使用してSSL+POP before SMTPで添付ファイル付き電子メールを送信する (C#)

Written By: 川俣 晶連絡先

「Mailkitを使用してSSL+POP before SMTPで添付ファイル付き電子メールを送信するコードを書いたので、核心部分だけ公開」

「なぜ書いたのだ?」

「ソースの後で触れる」

ソースコード §

        public static void Send(string sendto, string sendfrom, string subject, string body,

            string[] attachFileNames,

            string smtpServerHostName, int smtpPort,

            string smtpUserId, string smtpUserPassword,

            string popServerHostName, int popPort,

            string popUserId, string popUserPassword)

        {

            if (isDisable(sendto)) return;

            if (isDisable(sendfrom)) return;

            if (isDisable(smtpServerHostName)) return;

            if (smtpPort == 0) return;

            bool useSmtpAuth = !isDisable(smtpUserId) && !isDisable(smtpUserPassword);

            bool usePopBeforeSmpt = !isDisable(popServerHostName) && popPort != 0

                && !isDisable(popUserId) && !isDisable(popUserPassword);

            var message = new MimeMessage();

            message.From.Add(new MailboxAddress(sendfrom));

            message.To.Add(new MailboxAddress(sendto));

            message.Subject = subject;

            if (attachFileNames.Length == 0)

            {

                message.Body = new TextPart("plain") { Text = body };

            }

            else

            {

                var multi = new Multipart();

                multi.Add(new TextPart("plain") { Text = body });

                foreach (var filename in attachFileNames)

                {

                    var attachment = new MimePart()

                    {

                        ContentObject = new ContentObject(File.OpenRead(filename), ContentEncoding.Default),

                        ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),

                        ContentTransferEncoding = ContentEncoding.Base64,

                        FileName = Path.GetFileName(filename)

                    };

                    multi.Add(attachment);

                }

                message.Body = multi;

            }

            if (usePopBeforeSmpt)

            {

                using (var client = new Pop3Client())

                {

                    client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                    client.Connect(popServerHostName, popPort, true);

                    client.AuthenticationMechanisms.Remove("XOAUTH2");

                    client.Authenticate(popUserId, popUserPassword);

                    client.Disconnect(true);

                }

            }

            using (var client = new SmtpClient())

            {

                client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                client.Connect(smtpServerHostName, smtpPort, true);

                client.AuthenticationMechanisms.Remove("XOAUTH2");

                client.Authenticate(smtpUserId, smtpUserPassword);

                client.Send(message);

                client.Disconnect(true);

            }

        }

経緯の説明 §

「実は.NET Frameworkの電子メール送信関係のクラスを見ている時、特に問題は無かったのだがMailkitを使ってね(英文の大意)という記述を発見してね。でも、問題は無いから無視しようと思った。ところが、問題ないというのは錯覚で実際は問題があった」

「どんな問題?」

「POP Before SMTPが必要とされていた」

「電子メールの送信クラスはPOPを叩けないね」

「だから、一気にMailkitにジャンプしたってわけだ。Mailkitそのものはnugetですぐ入る」

「それで、【SSL】【SMTPAuth】【POP before SMTP】を全部解決したわけだね?」

「そうだ。これで自社のクラウド上のメールサーバからダイレクトにメールを送れるようになった」

「もうローカル環境に非暗号化認証不要のSMTPサーバは無いんだね」

「無いよ。とっくに引退済みだ」

「これで問題は完全に解決?」

「あ、このソースだと接続先相手の妥当性をちゃんと検証してないから、そこは注意が必要だぞ」

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
(ありません)
【技術雑記】の前のコンテンツ
2017年
04月
19日
Visual Studio 2017を管理者権限で起動終了するとエラーが起きる
3days 47 count
total 293 count
2017年04月20日
川俣晶の縁側ソフトウェア技術雑記total 265 count

Mailkitを使用してSSL+POP before SMTPで添付ファイル付き電子メールを送信する (C#)

Written By: 川俣 晶連絡先

「Mailkitを使用してSSL+POP before SMTPで添付ファイル付き電子メールを送信するコードを書いたので、核心部分だけ公開」

「なぜ書いたのだ?」

「ソースの後で触れる」

ソースコード §

        public static void Send(string sendto, string sendfrom, string subject, string body,

            string[] attachFileNames,

            string smtpServerHostName, int smtpPort,

            string smtpUserId, string smtpUserPassword,

            string popServerHostName, int popPort,

            string popUserId, string popUserPassword)

        {

            if (isDisable(sendto)) return;

            if (isDisable(sendfrom)) return;

            if (isDisable(smtpServerHostName)) return;

            if (smtpPort == 0) return;

            bool useSmtpAuth = !isDisable(smtpUserId) && !isDisable(smtpUserPassword);

            bool usePopBeforeSmpt = !isDisable(popServerHostName) && popPort != 0

                && !isDisable(popUserId) && !isDisable(popUserPassword);

            var message = new MimeMessage();

            message.From.Add(new MailboxAddress(sendfrom));

            message.To.Add(new MailboxAddress(sendto));

            message.Subject = subject;

            if (attachFileNames.Length == 0)

            {

                message.Body = new TextPart("plain") { Text = body };

            }

            else

            {

                var multi = new Multipart();

                multi.Add(new TextPart("plain") { Text = body });

                foreach (var filename in attachFileNames)

                {

                    var attachment = new MimePart()

                    {

                        ContentObject = new ContentObject(File.OpenRead(filename), ContentEncoding.Default),

                        ContentDisposition = new ContentDisposition(ContentDisposition.Attachment),

                        ContentTransferEncoding = ContentEncoding.Base64,

                        FileName = Path.GetFileName(filename)

                    };

                    multi.Add(attachment);

                }

                message.Body = multi;

            }

            if (usePopBeforeSmpt)

            {

                using (var client = new Pop3Client())

                {

                    client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                    client.Connect(popServerHostName, popPort, true);

                    client.AuthenticationMechanisms.Remove("XOAUTH2");

                    client.Authenticate(popUserId, popUserPassword);

                    client.Disconnect(true);

                }

            }

            using (var client = new SmtpClient())

            {

                client.ServerCertificateValidationCallback = (s, c, h, e) => true;

                client.Connect(smtpServerHostName, smtpPort, true);

                client.AuthenticationMechanisms.Remove("XOAUTH2");

                client.Authenticate(smtpUserId, smtpUserPassword);

                client.Send(message);

                client.Disconnect(true);

            }

        }

経緯の説明 §

「実は.NET Frameworkの電子メール送信関係のクラスを見ている時、特に問題は無かったのだがMailkitを使ってね(英文の大意)という記述を発見してね。でも、問題は無いから無視しようと思った。ところが、問題ないというのは錯覚で実際は問題があった」

「どんな問題?」

「POP Before SMTPが必要とされていた」

「電子メールの送信クラスはPOPを叩けないね」

「だから、一気にMailkitにジャンプしたってわけだ。Mailkitそのものはnugetですぐ入る」

「それで、【SSL】【SMTPAuth】【POP before SMTP】を全部解決したわけだね?」

「そうだ。これで自社のクラウド上のメールサーバからダイレクトにメールを送れるようになった」

「もうローカル環境に非暗号化認証不要のSMTPサーバは無いんだね」

「無いよ。とっくに引退済みだ」

「これで問題は完全に解決?」

「あ、このソースだと接続先相手の妥当性をちゃんと検証してないから、そこは注意が必要だぞ」

Facebook

キーワード【 川俣晶の縁側ソフトウェア技術雑記
【技術雑記】の次のコンテンツ
(ありません)
【技術雑記】の前のコンテンツ
2017年
04月
19日
Visual Studio 2017を管理者権限で起動終了するとエラーが起きる
3days 47 count
total 293 count
【技術雑記】のコンテンツ全リスト【技術雑記】の表紙

このコンテンツを書いた川俣 晶へメッセージを送る

[メッセージ送信フォームを利用する]

メッセージ送信フォームを利用することで、川俣 晶に対してメッセージを送ることができます。

この機能は、100%確実に川俣 晶へメッセージを伝達するものではなく、また、確実に川俣 晶よりの返事を得られるものではないことにご注意ください。

このコンテンツへトラックバックするためのURL

http://mag.autumn.org/tb.aspx/20170420174638
サイトの表紙【技術雑記】の表紙【技術雑記】のコンテンツ全リスト 【技術雑記】の入手全リスト 【技術雑記】のRSS1.0形式の情報このサイトの全キーワードリスト 印刷用ページ

管理者: 川俣 晶連絡先

Google

Powered by MagSite2 Version 0.24 (Alpha-Test) Copyright (c) 2004-2015 Pie Dey.Co.,Ltd.