C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

C#でメール送信ができなくなりました

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■93042 / inTopicNo.1)  C#でメール送信ができなくなりました
  
□投稿者/ ダイチ (1回)-(2019/11/16(Sat) 14:55:49)

分類:[C#] 

C#で1日1回ヤフーメールで自分にメールを送るプログラムを作っており、
これまでは問題なく送信されていたのですが、急に送信されなくなってしまいました。
(半年以上は問題なく動作していましたが2週間前くらいからエラーがでています)

SmtpClientで作っていましたが、
SmtpClientは廃止とのことで、MailKitで作るため、
以下サイトのコードをそのままコピペして、ID,PWなど個別の情報を書き換えて作ったのですが、いずれもエラーが出ており、原因はわかりますでしょうか。
(これを機にMailKitで作れればと思います)

ユーザー認証のところで、以下エラーが出ています。
エラー内容:
MailKit.Net.Smtp.SmtpProtocolException: 'The SMTP server has unexpectedly disconnected.'

参考サイト:
https://www.atmarkit.co.jp/ait/articles/1811/21/news023.html

こちらのサイトのものも、うまく動きませんでした。
https://www.sukerou.com/2018/10/vb-c-mailkit.html

引用返信 編集キー/
■93049 / inTopicNo.2)  Re[1]: C#でメール送信ができなくなりました
□投稿者/ WebSurfer (1970回)-(2019/11/17(Sun) 09:50:07)
No93042 (ダイチ さん) に返信

> (半年以上は問題なく動作していましたが2週間前くらいからエラーがでています)

その原因は分かっているのでしょうか? その問題を引きずっているということは
ないのですか?
引用返信 編集キー/
■93050 / inTopicNo.3)  Re[2]: C#でメール送信ができなくなりました
□投稿者/ ダイチ (2回)-(2019/11/17(Sun) 10:48:54)
> その原因は分かっているのでしょうか? その問題を引きずっているということは
> ないのですか?

原因はわかっていませんが、以下コードで作っています。
(mySmtp.Send(myMSG);で以下エラーが出ています)
------------------------
System.Net.Mail.SmtpException: 'メールを送信できませんでした。'
内部例外
IOException: 転送接続からデータを読み取れません: net_io_connectionclosed。
------------------------

        public void YM00()
        {

            MailMessage myMSG = new MailMessage("UserID@yahoo.co.jp", "Password@yahoo.co.jp");
            myMSG.Subject = "【test】";

            myMSG.IsBodyHtml = true;
            myMSG.Body = "test";
            

            SmtpClient mySmtp = new SmtpClient("smtp.mail.yahoo.co.jp", 587);
            mySmtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            mySmtp.Credentials = new NetworkCredential("UserID", "Password");
            mySmtp.Send(myMSG);

            myMSG.Dispose();
            mySmtp.Dispose();
        }

引用返信 編集キー/
■93052 / inTopicNo.4)  Re[3]: C#でメール送信ができなくなりました
□投稿者/ 魔界の仮面弁士 (2483回)-(2019/11/17(Sun) 11:40:50)
2019/11/17(Sun) 11:58:10 編集(投稿者)

No93050 (ダイチ さん) に返信
> System.Net.Mail.SmtpException: 'メールを送信できませんでした。'
> 内部例外
> IOException: 転送接続からデータを読み取れません: net_io_connectionclosed。

Yahoo! からの送信は行ったことが無いのですが、上記エラーになる場合、
・SSLが無効化されているが、実際には必須である場合。
・SSLが有効化されているが、実際には不要である場合。
・セキュリティソフトでポートがブロックされている場合。
などが思い当たります。


今回、Submission ポート 587 が指定されていることから、恐らくは
STARTTLS を指定されているのかと思いますので、
 // System.Net.Mail.SmtpClient の場合
 mySmtp.EnableSsl = true;
 // MailKit.Net.Smtp.SmtpClient の場合
 mySmtp.Connect("smtp.mail.yahoo.co.jp", 587, MailKit.Security.SecureSocketOptions.StartTls);
を加えてみてはいかがでしょうか。うまくいくかは分かりませんが。
https://dobon.net/vb/dotnet/internet/smtpssltls.html


もしも STARTTLS (Port 587) ではなく、SMTP over SSL(SMTP/SSL、SMTPS)(Port 465) が
必要な場合、SmtpClient では対応していないので、MailKit に移行して
 using ( var mySmtpClient = new MailKit.Net.Smtp.SmtpClient())
 {
  mySmtpClient.Connect("smtp.mail.yahoo.co.jp", 465, MailKit.Security.SecureSocketOptions.SslOnConnect);
  mySmtpClient.Authenticate("UserID", "Password");
  mySmtpClient.Send(message);
  mySmtpClient.Disconnect(true);
 }
という感じになるかと思います。


追記:
Yahoo!メールヘルプによれば、SSL 接続のために
SMTP 465 (POP 995) を使うよう案内されていますね。
SSL を使わない場合は、SMTP 587 (POP 110) 。
https://www.yahoo-help.jp/app/answers/detail/p/622/a_id/79799/~/
引用返信 編集キー/
■93053 / inTopicNo.5)  Re[4]: C#でメール送信ができなくなりました
□投稿者/ ダイチ (3回)-(2019/11/17(Sun) 13:16:32)
ありがとうございます。

以下で作っているのですが、ユーザー認証のところでエラーが出ています。
(UserID,Passwordはもちろん正しいものを入れています)

        public void YM04()
        {
            using (var mySmtpClient = new MailKit.Net.Smtp.SmtpClient())
            {

                var mail = new MimeKit.MimeMessage();
                var builder = new MimeKit.BodyBuilder();

                mail.From.Add(new MimeKit.MailboxAddress("", "xxxxx@yahoo.co.jp"));
                mail.To.Add(new MimeKit.MailboxAddress("", "xxxxx@yahoo.co.jp"));
                mail.Subject = "メールの件名";
                builder.TextBody = "メールの本文です。\n\n以上";
                mail.Body = builder.ToMessageBody();


                mySmtpClient.Connect("smtp.mail.yahoo.co.jp", 465, MailKit.Security.SecureSocketOptions.SslOnConnect);
                mySmtpClient.Authenticate("UserID", "Password");
                
                mySmtpClient.Send(mail);
                mySmtpClient.Disconnect(true);
            }
        }

エラー詳細は、以下ですがやはり認証のところでエラーが出ているのでしょうか。

MailKit.Net.Smtp.SmtpProtocolException
  HResult=0x80131500
  Message=The SMTP server has unexpectedly disconnected.
  Source=MailKit
  スタック トレース:
   場所 MailKit.Net.Smtp.SmtpStream.<ReadAheadAsync>d__39.MoveNext()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 MailKit.Net.Smtp.SmtpStream.<ReadResponseAsync>d__46.MoveNext()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 MailKit.Net.Smtp.SmtpStream.ReadResponse(CancellationToken cancellationToken)
   場所 MailKit.Net.Smtp.SmtpClient.<SendCommandAsync>d__61.MoveNext()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 MailKit.Net.Smtp.SmtpClient.<AuthenticateAsync>d__67.MoveNext()
   場所 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   場所 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   場所 MailKit.Net.Smtp.SmtpClient.Authenticate(Encoding encoding, ICredentials credentials, CancellationToken cancellationToken)
   場所 MailKit.MailService.Authenticate(Encoding encoding, String userName, String password, CancellationToken cancellationToken)
   場所 MailKit.MailService.Authenticate(String userName, String password, CancellationToken cancellationToken)

引用返信 編集キー/
■93054 / inTopicNo.6)  Re[5]: C#でメール送信ができなくなりました
□投稿者/ 魔界の仮面弁士 (2484回)-(2019/11/17(Sun) 13:55:25)
No93053 (ダイチ さん) に返信
> using (var mySmtpClient = new MailKit.Net.Smtp.SmtpClient())

SmtpClient のコンストラクタ引数に、
ProtocolLogger クラスのインスタンスを渡して、
通信ログを記録してみたらどうなりますか?
引用返信 編集キー/
■93055 / inTopicNo.7)  Re[6]: C#でメール送信ができなくなりました
□投稿者/ ダイチ (4回)-(2019/11/17(Sun) 16:59:14)
ログは、こちらでよかったでしょうか。
(初心者なので、詳しくはわかっておりませんが、一部伏字にしております)

迷惑投稿判定が出たので全角に変換しています。
Connected to smtps://smtp.mail.yahoo.co.jp:465/
S: 220 smtpgate609.mail.ssk.ynwp.yahoo.co.jp ESMTP ready
C: EHLO [xxx.xxx.x.xx]
S: 250−smtpgate609.mail.ssk.ynwp.yahoo.co.jp
S: 250−PIPELINING
S: 250−8BITMIME
S: 250−SIZE 20480000
S: 250 AUTH PLAIN LOGIN XYMYCONNECT
C: AUTH PLAIN xxxxxxxxxxxxxxx==
S: 535 authorization failed (#5.7.0)
C: AUTH LOGIN
引用返信 編集キー/
■93056 / inTopicNo.8)  Re[7]: C#でメール送信ができなくなりました
□投稿者/ 魔界の仮面弁士 (2485回)-(2019/11/17(Sun) 18:58:39)
No93055 (ダイチ さん) に返信
> 迷惑投稿判定が出たので全角に変換しています。
連続した半角xが原因かと思います。


> S: 250 AUTH PLAIN LOGIN XYMYCONNECT
AUTH PLAIN と
AUTH LOGIN の両方をサポートしているようですね。


> C: AUTH PLAIN ***************==
15 文字 + "==" でしたか?
後ろの文字数は、末尾 == も含めて「4 の倍数長」になるはずなんですが…。

この場所には
 Convert.ToBase64String(Encoding.ASCII.GetBytes(userID + "\0" + userID + "\0" + password))
に相当する文字列が渡されるはずです。


> S: 535 authorization failed (#5.7.0)
認証エラーですね。
指定した userID と password の組み合わせが間違っているようです。

userID が Yahoo! メールアドレスもしくは YBB メールアドレスの「@ より前の部分」になっていますか?


> C: AUTH LOGIN
PLAIN 認証 が弾かれたので、LOGIN 認証でのやり取りで再チャレンジしているようです。
引用返信 編集キー/
■93057 / inTopicNo.9)  Re[8]: C#でメール送信ができなくなりました
□投稿者/ ダイチ (5回)-(2019/11/17(Sun) 23:33:26)
> C: AUTH PLAIN ***************==
こちらは、==を含めて4の倍数でした。
(文字数に意味があるとは知らず適当に記載してました)

> S: 535 authorization failed (#5.7.0)
Yahoo!メールアドレスなので、
userIDは、メアドでも、メアドの「@より前の部分」でも試したのですが、いずれとも以下エラーがでてます。

MailKit.Net.Smtp.SmtpProtocolException: 'The SMTP server has unexpectedly disconnected.'

引用返信 編集キー/
■93058 / inTopicNo.10)  Re[9]: C#でメール送信ができなくなりました
□投稿者/ 魔界の仮面弁士 (2486回)-(2019/11/18(Mon) 10:12:28)
2019/11/18(Mon) 10:24:00 編集(投稿者)

No93057 (ダイチ さん) に返信
>>S: 535 authorization failed (#5.7.0)
> Yahoo!メールアドレスなので、
> userIDは、メアドでも、メアドの「@より前の部分」でも試したのですが、いずれとも以下エラーがでてます。

Yahoo! メールの管理画面で、Yahoo!メールのアクセス範囲(IMAP/POP/SMTPアクセスフィルター)が、
「公式のみ有効」ではなく「公式以外も有効」になっているかどうかを確認してみてください。


また、アカウント名は Web ページ上のアカウント名とは必ずしも
一致しないことがありますので、正しい接続情報について、
Yahoo! の登録情報画面で今一度確認してみてください。
たとえばソフトバンクやワイモバイルユーザーの場合、メール送受信時に
用いるアカウント名が、「メールアドレスの @ より前の部分」ではなく、
初期契約の携帯電話番号に設定されているようなケースがあります。
引用返信 編集キー/
■93060 / inTopicNo.11)  Re[1]: C#でメール送信ができなくなりました
□投稿者/ 魔界の仮面弁士 (2487回)-(2019/11/18(Mon) 11:33:34)
No93042 (ダイチ さん) に返信
> (これを機にMailKitで作れればと思います)

ポート 465(SSLあり) / 587 (SSL無し) 共に、
AUTH-LOGIN を明示したところ、当方では送信されました。

namespace Wankuma93042
{
    using MailKit;
    using MailKit.Net.Smtp;
    using MailKit.Security;
    using MimeKit;
    class Program
    {
        static void Main()
        {
            using (var mySmtpClient = new SmtpClient())
            {
                var mail = new MimeMessage();
                mail.From.Add(new MailboxAddress("自分(Yahoo)", YahooMailAddress));
                mail.To.Add(new MailboxAddress("自分(hotmail)", HotMailMailAddress));
                mail.Subject = "メールの件名";
                var builder = new BodyBuilder { TextBody = "メールの本文です。\n\n以上" };
                mail.Body = builder.ToMessageBody();

                string host = "smtp.mail.yahoo.co.jp";
                int port = 465; // 587
                string userId = Properties.Settings.Default.userId;
                string password = Properties.Settings.Default.password;

                mySmtpClient.Connect(host, port, SecureSocketOptions.Auto);
                mySmtpClient.Authenticate(new SaslMechanismLogin(userId, password));
                mySmtpClient.Send(mail);
                mySmtpClient.Disconnect(true);
            }
        }
    }
}

引用返信 編集キー/
■93111 / inTopicNo.12)  Re[10]: C#でメール送信ができなくなりました
□投稿者/ ダイチ (6回)-(2019/11/20(Wed) 21:23:23)

> Yahoo! メールの管理画面で、Yahoo!メールのアクセス範囲(IMAP/POP/SMTPアクセスフィルター)が、
> 「公式のみ有効」ではなく「公式以外も有効」になっているかどうかを確認してみてください。

Yahoo!メールの管理画面が「公式のみ有効」になっていました。
ご指定の方法で送信できるようになりました。
プログラム以外の点からもサポートいただき、本当にありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ