web-dev-qa-db-ja.com

Exchange Online経由でSystem.Net.Mailを使用してSMTPメールを送信する(Office 365)

新しいOffice 365ベータ版をテストしており、Exchange Onlineサービスにメールアカウントを持っています。今、テストアカウントからsmtpメールを送信できるLOBアプリケーションに接続しようとしています。

ただし、Exchange 365プラットフォームではポート587でTLS暗号化が必要であり、System.Net.Mail暗黙的なSSL暗号化を許可しません。

誰かがこのプラットフォームを介してC#からメールを送信することに成功しましたか?

メールを送信する次の基本的なコードがあります。アドバイスをいただければ幸いです。

SmtpClient server = new SmtpClient("ServerAddress");
server.Port = 587;
server.EnableSsl = true;
server.Credentials = new System.Net.NetworkCredential("[email protected]", "password");
server.Timeout = 5000;
server.UseDefaultCredentials = false;

MailMessage mail = new MailMessage();
mail.From = new MailAddress("[email protected]");
mail.To.Add("[email protected]");
mail.Subject = "test out message sending";
mail.Body = "this is my message body";
mail.IsBodyHtml = true;

server.Send(mail);
43
Adam Stewart

上記の作業コードのいくつかのタイプミスを修正しました。

MailMessage msg = new MailMessage();
msg.To.Add(new MailAddress("[email protected]", "SomeOne"));
msg.From = new MailAddress("[email protected]", "You");
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("your user name", "your password");
client.Port = 587; // You can use Port 25 if 587 is blocked (mine is!)
client.Host = "smtp.office365.com";
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.EnableSsl = true;
try
{
    client.Send(msg);
    lblText.Text = "Message Sent Succesfully";
}
catch (Exception ex)
{
    lblText.Text = ex.ToString();
}

上記のコードを使用する2つのWebアプリケーションがあり、どちらも問題なく動作します。

46
Sanjeev

クイックアンサー:送信元アドレスは送信元のアカウントと正確に一致する必要があります。一致しない場合、エラーが表示されます5.7.1クライアントにはこの送信者として送信する権限がありません。

私の推測では、Office 365アカウントでの電子メールのなりすましを防ぎます。そうしないと、sballmer @ Microsoft.comとして送信できる可能性があります。

もう1つ試すことは認証です。次のように3番目のフィールドにドメインを入力します

Dim smtpAuth = New System.Net.NetworkCredential(
    "TheDude", "hunter2password", "MicrosoftOffice365Domain.com")

それでもうまくいかない場合は、次のアカウントでログインできることを再確認してください。 https://portal.microsoftonline.com

さらに注意すべき点は、アンチウイルスソリューションが、スパム対策ソリューションとしてポート25および587へのプログラムによるアクセスをブロックしている可能性があることです。ノートンとマカフィーは、これらのポートへのアクセスを静かにブロックする場合があります。メールとソケットのデバッグのみを有効にすると、それに気付くことができます(以下を参照)。

最後に注意することは、 送る 方法は 非同期。あなたが電話した場合

廃棄する

詳細な回答:Visual Studio(VB.NETまたはC#は関係ありません)を使用して、上記と同様に、メールメッセージを作成するボタンを含む単純なフォームを作成しました。次に、これをapplication.exe.config(プロジェクトのbin/debugディレクトリ)に追加しました。これにより、[出力]タブに詳細なデバッグ情報を表示できます。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.diagnostics>
        <sources>
            <source name="System.Net">
                <listeners>
                    <add name="System.Net" />
                </listeners>
            </source>
            <source name="System.Net.Sockets">
                <listeners>
                    <add name="System.Net" />
                </listeners>
            </source>
        </sources>
        <switches>
            <add name="System.Net" value="Verbose" />
            <add name="System.Net.Sockets" value="Verbose" />
        </switches>
        <sharedListeners>
            <add name="System.Net"
              type="System.Diagnostics.TextWriterTraceListener"
              initializeData="System.Net.log"
            />
        </sharedListeners>
        <trace autoflush="true" />
    </system.diagnostics>
</configuration>
12
The Dude

このスレッドは、この問題への回答を検索している可能性がありますいくつかのサイドノートです。 (このソリューションを実装する前に、下部の注意事項を必ずお読みください。)MS Office 365サブスクリプションにユーザーまたはドメインがないクライアントへのメール送信に問題がありました。 [email protected]365アカウントを介してSMTPを実行しようとしていましたが、.NETメールメッセージの宛先はでした[email protected]。これは、「5.7.1クライアントに権限がありません」というエラーが表示されたときです。修正するには、MailMessageクラスでSenderプロパティを、指定されたSMTP資格情報がO365で「送信者」に許可された電子メールアドレスに設定する必要がありました。次のコードに示すように、メインアカウントのメール([email protected])を使用することにしました。私のO365アカウントが「送信」する許可を持っている電子メールアドレス(つまり、Support @ MyDomain.com、no-reply @ MyDomain.comなど)を使用できた可能性があることに注意してください。

using System;
using System.Net.Mail;

namespace ConsoleApplication1
{
   class Program
   {
      static void Main(string[] args)
      {
         using (
            MailMessage message = new MailMessage
            {
               To = { new MailAddress("[email protected]", "Recipient 1") },
               Sender = new MailAddress("[email protected]", "Me"),
               From = new MailAddress("[email protected]", "Client"),
               Subject=".net Testing"
               Body="Testing .net emailing",
               IsBodyHtml=true,
            }
         )
         {
            using (
               SmtpClient smtp = new SmtpClient
               {
                  Host = "smtp.office365.com",
                  Port = 587,
                  Credentials = new System.Net.NetworkCredential("[email protected]", "Pa55w0rd"),
                  EnableSsl = true
               }
            )
            {
               try { smtp.Send(message); }
               catch (Exception excp)
               {
                  Console.Write(excp.Message);
                  Console.ReadKey();
               }
            }
         }
      }
   }
}

SmtpClientは使い捨てであり、.NET Framework 4のUsingブロックを使用できることに注意してください
。NET Framework 2〜3.5のユーザーは、SmtpClientを使用する必要があります...

SmtpClient smtp = new SmtpClient
{
   Host = "smtp.office365.com",
   Port = 587,
   Credentials = new System.Net.NetworkCredential("[email protected]", "Pa55w0rd"),
   EnableSsl = true
};
try { smtp.Send(message); }
catch (Exception excp)
{
   Console.Write(excp.Message);
   Console.ReadKey();
}

結果のメールのヘッダーは次のようになります。

Authentication-Results: spf=none (sender IP is )  
   [email protected];  
Received: from MyPC (192.168.1.1) by  
   BLUPR13MB0036.namprd13.prod.Outlook.com (10.161.123.150) with Microsoft SMTP  
   Server (TLS) id 15.1.318.9; Mon, 9 Nov 2015 16:06:58 +0000  
MIME-Version: 1.0  
From: Client <[email protected]>  
Sender: Me <[email protected]>  
To: Recipient 1 <[email protected]>  

-注意してください-
一部のメールクライアントは、送信者のアドレスをメモとして表示する場合があることに注意してください。たとえば、Outlookは閲覧ウィンドウのヘッダーに次の行に沿って何かを表示します。

クライアント<[email protected]>に代わってMe <[email protected]>

ただし、受信者が使用する電子メールクライアントが完全なゴミではない限り、これは返信先アドレスに影響を与えません。返信先は引き続き差出人アドレスを使用する必要があります。すべてのベースをカバーするために、MailMessage.ReplyToListプロパティを利用して、クライアントが正しい返信アドレスを使用する機会をすべて提供することもできます。

また、一部のメールサーバーは、ドメイン所有者ポリシーの制限を課している別の会社に代わって送信されるメールを完全に拒否する場合があることに注意してください。徹底的にテストし、跳ね返りがないかどうかを確認してください。私の個人的なHotmail(mail.live.com)メールアカウントは、私の特定のクライアントに代わって送信するメッセージを拒否するが、他のクライアントは問題なく通過するものであると言えます。クライアントのドメインTXT "spf1"レコードと関係があると思われますが、あるドメインのために送信された電子メールを別のドメインに対して拒否する理由については答えがありません。たぶん、知っている人がこの話題に光を当てることができますか?

6
ShaneLS

これを見たことがありますか? Smtp.mail.microsoftonline.comを使用した電子メールの送信

Credentialsの設定後にUseDefaultCredentialsを設定すると、Credentialsプロパティがリセットされます。

6
Phil Sayers

Office 365はsmtpサーバーと拡張サーバーを保護する2つのサーバーを使用します。

最初のサーバーはsmtp.office365.com(smtpクライアントのプロパティホスト)で、2番目のサーバーはSTARTTLS/smtp.office365.com(smtpクライアントのプロパティTargetName)です。もう1つは、ネットワーク資格情報を設定する前にUsedefaultcredential = falseを設定する必要があります。

    client.UseDefaultCredentials = False
    client.Credentials = New NetworkCredential("[email protected]", "Password")
    client.Host = "smtp.office365.com"
    client.EnableSsl = true
    client.TargetName = "STARTTLS/smtp.office365.com"
    client.Port = 587

    client.Send(mail)
4

Smtp.google.com:587に対して動作するために使用されるC#コードを、Office365経由で正常に動作するように移植しました。 Sslを使用する前後の資格情報のすべての組み合わせと、インターネットで行われたほぼすべての推奨事項を試しました-成功なし(5.7.1 ....エラーが発生しました)。

最後に、最後の手段として、.Send(message)の直前のどこかからこの行を取得しました

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

それ以来-すべてのsend()は大成功です。

3
Joe Frank

最後に、動作します!

smtpClient.UseDefaultCredentials = false;smtpClient.Credentials = credentials;その後、問題は解決しました!

            SmtpClient smtpClient = new SmtpClient(smtpServerName);                          
            System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(smtpUName, smtpUNamePwd);

            smtpClient.Credentials = credentials;
            smtpClient.UseDefaultCredentials = false;  <-- Set This Line After Credentials

            smtpClient.Send(mailMsg);
            smtpClient = null;
            mailMsg.Dispose();
1
Yeong