web-dev-qa-db-ja.com

Office 365経由で電子メールを送信しようとするとSMTP 5.7.57エラー

Office 365の認証済みSMTPサービス 経由でメールを送信するためのコードを設定しようとしています。

_var _mailServer = new SmtpClient();
_mailServer.UseDefaultCredentials = false;
_mailServer.Credentials = new NetworkCredential("[email protected]", "password");
_mailServer.Host = "smtp.office365.com";
_mailServer.TargetName = "STARTTLS/smtp.office365.com"; // same behaviour if this lien is removed
_mailServer.Port = 587;
_mailServer.EnableSsl = true;

var eml = new MailMessage();
eml.Sender = new MailAddress("[email protected]");
eml.From = eml.Sender;
eml.to = new MailAddress("[email protected]");
eml.Subject = "Test message";
eml.Body = "Test message body";

_mailServer.Send(eml);
_

これは機能していないようで、例外が表示されます。

SMTPサーバーに安全な接続が必要であるか、クライアントが認証されていません。サーバーの応答は、5.7.57 SMTP;クライアントはMAIL FROM中に匿名メールを送信するために認証されませんでした
at System.Net.Mail.MailCommand.Send(SmtpConnection conn、Byte [] command、String from)
at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender、MailAddressCollection recipients、String deliveryNotify、SmtpFailedRecipientException&exception)
System.Net.Mail.SmtpClient.Send(MailMessageメッセージ)

ネットワークトレースを有効にする を試してみましたが、セキュリティで保護された通信が確立されているようです(たとえば、「STARTTLS」コマンドのログに行があり、後でログに「Remote証明書はユーザーによって有効であることが確認されました。」、および次のSend()およびReceive()データはプレーンテキストとして読み取り可能ではなく、TLS/SSHパニックが含まれていないようです)

同じメールアドレスとパスワードを使用して http://portal.office.com/ にログオンし、OutlookメールWebメールを使用してメールを送受信することができます。プログラムでメールを送信するときに認証が失敗しますか?

暗号化されたストリームをさらにデバッグする方法はありますか?

8
Rowland Shaw

私の場合、この提案すべてを運なしで試した後、マイクロソフトのサポートに連絡しましたが、彼らの提案は単にパスワードを変更することでした。

これで問題が解決しました。

パスワードは有効期限が切れていないことに注意してください。office365に正常にログオンしましたが、リセットにより問題は解決しました。

教訓:Office 365のパスワードの有効期限を信頼しないでください。私の場合、パスワードは1〜2か月後に期限切れになりますが、機能しませんでした。これにより、コードを調査することになり、多くの時間を費やしてから、問題が "破損"または "期限切れ"のOffice365パスワードにあることに気付きました。

パスワードを「更新」するのを3か月ごとに忘れないでください。

4
Matteo Conta

デバッグを支援するには、一時的に MailKit に切り替えて、次のようなコードスニペットを使用してみてください。

_using System;

using MailKit.Net.Smtp;
using MailKit.Security;
using MailKit;
using MimeKit;

namespace TestClient {
    class Program
    {
        public static void Main (string[] args)
        {
            var message = new MimeMessage ();
            message.From.Add (new MailboxAddress ("", "[email protected]"));
            message.To.Add (new MailboxAddress ("", "[email protected]"));
            message.Subject = "Test message";

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

            using (var client = new SmtpClient (new ProtocolLogger ("smtp.log"))) {
                client.Connect ("smtp.office365.com", 587, SecureSocketOptions.StartTls);

                client.Authenticate ("[email protected]", "password");

                client.Send (message);
                client.Disconnect (true);
            }
        }
    }
}
_

これにより、トランザクション全体が「smtp.log」というファイルに記録されます。このファイルを読み通して、どこに問題があるのか​​を確認できます。

Smtp.logには_AUTH LOGIN_コマンドとそれに続くbase64エンコードされたいくつかのコマンド(これらはユーザー/パス)が含まれている可能性が高いことに注意してください。

System.Net.Mailで表示されるのと同じエラーが発生することを期待しますが、何が起こっているかを確認するのに役立ちます。

失敗すると仮定して(そして、そうなると思います)、_SecureSocketOptions.None_に変更するか、またはAuthenticate()をコメント化してみてください。

表示されるエラーがどのように変化するかを確認してください。

3
jstedfast

アカウントに実際のoffice365のメールアドレスを使用していることを確認してください。 Outlook365の[プロファイル]ボタンをクリックして見つけることができます。認証に使用しようとしている電子メールアドレスが実際のメールボックスの電子メールアカウントではないことに気付くまで、認証に取り組みました。実際のアカウントの電子メールの形式は、account @ company.onmicrosoft.comです。

3
Derek Wade

メールボックス(差出人アドレス)を「共有」から「通常」に変換することで機能しました。この変更の前に、GmailからOffice 365に移行したときに、アプリケーションはメールの送信を停止しました。ホストをsmtp.office365.comに設定する以外に、他のコード変更は必要ありませんでした。

2
Johnie Karr

私の場合、私の問題はコードに関連するものではなく、Exchangeメールボックスに関係するものでした。理由はわかりませんが、これで私の問題は解決しました。

  • そのユーザーのメールボックスの交換設定に移動し、メール委任にアクセスします
  • Send Asの下で、NT AUTHORITY\SELFを削除してから、ユーザーのアカウント。

これにより、ユーザーに代わってメールを送信する権限がユーザーに付与されます。理論的にはNT AUTHORITY\SELFは同じことをしているはずですが、何らかの理由で機能しませんでした。

ソース: http://edudotnet.blogspot.com.mt/2014/02/smtp-Microsoft-office-365-net-smtp.html

1
Matt R

Exchange Onlineを使用してメールを送信するためにテストしたコードを以下で確認してください。

        MailMessage msg = new MailMessage();
        msg.To.Add(new MailAddress("[email protected]", "XXXX"));
        msg.From = new MailAddress("[email protected]", "XXX");
        msg.Subject = "This is a Test Mail";
        msg.Body = "This is a test message using Exchange OnLine";
        msg.IsBodyHtml = true;

        SmtpClient client = new SmtpClient();
        client.UseDefaultCredentials = false;
        client.Credentials = new System.Net.NetworkCredential("[email protected]", "YourPassword");
        client.Port = 587; // You can use Port 25 if 587 is blocked
        client.Host = "smtp.office365.com";
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
        client.EnableSsl = true;
        try
        {
            client.Send(msg);

        }
        catch (Exception ex)
        {

        }

enter image description here メッセージ送信用にポート(587)が定義されました。ポート587はSTARTTLSを必須とはしていませんが、クライアントとサーバー間の通信のSSL/TLS暗号化が重要なセキュリティとプライバシーの問題であるという認識とほぼ同時にポート587の使用が一般的になりました。

1
Nan Yu

資格情報機能を変更する必要があります。必要な置換は次のとおりです。

変化する

-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password");*

このため

-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password", "domain");*
0
Calm

私の場合、パスワードの有効期限が切れていました。パスワードをリセットするだけで、再び機能し始めました。

0
lazydeveloper