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メールを使用してメールを送受信することができます。プログラムでメールを送信するときに認証が失敗しますか?
暗号化されたストリームをさらにデバッグする方法はありますか?
私の場合、この提案すべてを運なしで試した後、マイクロソフトのサポートに連絡しましたが、彼らの提案は単にパスワードを変更することでした。
これで問題が解決しました。
パスワードは有効期限が切れていないことに注意してください。office365に正常にログオンしましたが、リセットにより問題は解決しました。
教訓:Office 365のパスワードの有効期限を信頼しないでください。私の場合、パスワードは1〜2か月後に期限切れになりますが、機能しませんでした。これにより、コードを調査することになり、多くの時間を費やしてから、問題が "破損"または "期限切れ"のOffice365パスワードにあることに気付きました。
パスワードを「更新」するのを3か月ごとに忘れないでください。
デバッグを支援するには、一時的に 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()
をコメント化してみてください。
表示されるエラーがどのように変化するかを確認してください。
アカウントに実際のoffice365のメールアドレスを使用していることを確認してください。 Outlook365の[プロファイル]ボタンをクリックして見つけることができます。認証に使用しようとしている電子メールアドレスが実際のメールボックスの電子メールアカウントではないことに気付くまで、認証に取り組みました。実際のアカウントの電子メールの形式は、account @ company.onmicrosoft.comです。
メールボックス(差出人アドレス)を「共有」から「通常」に変換することで機能しました。この変更の前に、GmailからOffice 365に移行したときに、アプリケーションはメールの送信を停止しました。ホストをsmtp.office365.com
に設定する以外に、他のコード変更は必要ありませんでした。
私の場合、私の問題はコードに関連するものではなく、Exchangeメールボックスに関係するものでした。理由はわかりませんが、これで私の問題は解決しました。
これにより、ユーザーに代わってメールを送信する権限がユーザーに付与されます。理論的にはNT AUTHORITY\SELFは同じことをしているはずですが、何らかの理由で機能しませんでした。
ソース: http://edudotnet.blogspot.com.mt/2014/02/smtp-Microsoft-office-365-net-smtp.html
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)
{
}
メッセージ送信用にポート(587)が定義されました。ポート587はSTARTTLSを必須とはしていませんが、クライアントとサーバー間の通信のSSL/TLS暗号化が重要なセキュリティとプライバシーの問題であるという認識とほぼ同時にポート587の使用が一般的になりました。
資格情報機能を変更する必要があります。必要な置換は次のとおりです。
変化する
-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password");*
このため
-*_mailServer.Credentials = new NetworkCredential("[email protected]", "password", "domain");*
私の場合、パスワードの有効期限が切れていました。パスワードをリセットするだけで、再び機能し始めました。