web-dev-qa-db-ja.com

.netでMicrosoft Office 365をテストするSMTPメールを送信する

exchange Onlineサービスにメールアカウントを持っています。今、私はC#アプリケーションを介して顧客にメールを送信できるかどうかをテストしようとしています(varoiusドメインおよびMicrosoft Office 365)

以下のコードを実装しようとしましたが、エラーが発生しています

"リモート証明書は検証手順に従って無効です。"

MailMessage mail = null;                
mail = new MailMessage();

string[] strToList = "[email protected]"              
foreach (string strID in strToList)
{
    if (strID != null)
    {
        mail.To.Add(new MailAddress(strID));
    }
}

mail.From = "[email protected]";
mail.Subject = "testing"
mail.IsBodyHtml = true;
mail.Body = "mail body";

SmtpClient client = new SmtpClient("smtp.Outlook.office365.com");
client.Port = 587;
client.EnableSsl = true;
client.UseDefaultCredentials = false;
NetworkCredential cred = new System.Net.NetworkCredential("[email protected]", "mypassword");
client.Credentials = cred;
client.Send(mail);

私が何か間違ったことをしている場合はアドバイスをお願いします。事前に感謝します。

15
user166013

これは私のために働く( source から編集)


   ThreadPool.QueueUserWorkItem(t =>
            {
                SmtpClient client = new SmtpClient("smtp.office365.com",587);
                client.EnableSsl = true;
                client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");
                MailAddress from = new MailAddress("[email protected]", String.Empty, System.Text.Encoding.UTF8);
                MailAddress to = new MailAddress("[email protected]");
                MailMessage message = new MailMessage(from, to);
                message.Body = "The message I want to send.";
                message.BodyEncoding = System.Text.Encoding.UTF8;
                message.Subject = "The subject of the email";
                message.SubjectEncoding = System.Text.Encoding.UTF8;
                // Set the method that is called back when the send operation ends.
                client.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
                // The userState can be any object that allows your callback 
                // method to identify this send operation.
                // For this example, I am passing the message itself
                client.SendAsync(message, message);
            });

        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            // Get the message we sent
            MailMessage msg = (MailMessage)e.UserState;

            if (e.Cancelled)
            {
                // Prompt user with "send cancelled" message 
            }
            if (e.Error != null)
            {
                // Prompt user with error message 
            }
            else
            {
                // Prompt user with message sent!
                // as we have the message object we can also display who the message
                // was sent to etc 
            }

            // finally dispose of the message
            if (msg != null)
                msg.Dispose();
        }
13
Zakos

これは、メールを送信する最良の方法でもあります。私は自分のプロジェクトでそれを試してみましたが、うまく動作しています。

 SmtpClient client = new SmtpClient("smtp.office365.com", 587);
        client.EnableSsl = true;
        client.Credentials = new System.Net.NetworkCredential("[email protected]", "[email protected]");
        MailAddress from = new MailAddress("From Address Ex [email protected]", String.Empty, System.Text.Encoding.UTF8);
        MailAddress to = new MailAddress("From Address Ex [email protected]");
        MailMessage message = new MailMessage(from, to);
        message.Body = "This is your body message";
        message.BodyEncoding = System.Text.Encoding.UTF8;
        message.Subject = "Subject";
        message.SubjectEncoding = System.Text.Encoding.UTF8;

        client.Send(message);
5
Shashi Keshar

場合によっては、TLS認証により、smtp.office365.comをc#からSMTPとして使用する際に問題が発生する場合があります。 Send(msg)ステートメントの前に次の行を試してください(.TargetNameをオーバーライドします)。

client.TargetName = "STARTTLS/smtp.office365.com";

これは私のために働く

4
Joe Frank

Smtp.Outlook.office365.comの代わりにsmtp.office365.comを試してください

2

設定してみてください:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

これにより、サービスのSecurityPointがTLSになります。
ここで設定された回答に注意してください

ServicePointManager.ServerCertificateValidationCallback = 
    (sender, certificate, chain, sslPolicyErrors) => true;

テスト目的には良いかもしれませんが、それは主要なセキュリティリスクです!
prodアカウントまたはprod環境では使用しないでください。

1
Ori Nachum

エラー

SMTPサーバーに安全な接続が必要であるか、クライアントが認証されていません。サーバーの応答:5.7.1クライアントは認証されませんでした

多くの場合、関連するユーザーアカウントのパスワードの有効期限が切れているか、アカウントがロックされている場合に発生します。会社のパスワードポリシーに違反しない場合は、Active Directoryで[ユーザーパスワードを無期限にする]を設定してみてください:) o365 Exchange Online A/cでテスト中にこれが発生しました。

1
hiFI

使用してみてください:

ServicePointManager.ServerCertificateValidationCallback = 
    (sender, certificate, chain, sslPolicyErrors) => true;

このコードにより、無効な証明書を受け入れることができます。

Ori Nachumがコメントで言及しているように、これは非常に悪い習慣であり、テスト目的にのみ使用すべきです。これはセキュリティ上のリスクです!

0
Piotr Stapp