1

ASP.NET WebアプリケーションからSMTPサーバーを介して電子メールを送信するときに、不思議な(私にとって)エラーが発生します。「xxx@yyy.zzzを中継できません」という有名なエラーが表示されます。私にとって不思議なのは、電子メールを通常の.NET Windowsフォームアプリケーションに送信するのとまったく同じコードを切り取って貼り付け、このアプリケーションで電子メールを送信すると、すべて正常に機能することです。これにより、おそらく問題は、Windowsフォームアプリケーションがドメインユーザーアカウントで実行されているときにASP.NETアプリケーションがネットワークサービスとして実行されていることだと思いましたが、別のASP.NETアプリケーションが同じ経由で電子メールを送信していることがわかりました同じIISのNETWORKSERVERで実行されているSMTPサーバーであり、このアプリケーションではこの問題は発生しません。

さらに、ポート25でSMTPサーバーにtelnetを使用し、SMTPプロトコルを手動で実行して、SMTPサーバーを介して手動で電子メールを送信しようとしましたが、すべて正常に機能します。SMTPサーバーは、いかなる種類の認証またはSSLでも構成されていません。

もう1つの不思議な事実は、ASP.NETアプリケーションが同じドメイン内のアドレスから同じドメイン内の電子メールアドレスに電子メールを送信できることですが、ドメイン外のアドレスには送信できません。ただし、まったく同じコードを使用するWindowsフォームアプリケーションは、ドメイン内外の任意のアドレスから任意のアドレスに電子メールを送信できます。

要約すると:

  • ASP.NETアプリケーションは、ドメイン内のアドレスからドメイン内のアドレスに電子メールを送信できますが、ドメイン外のアドレスには送信できません。
  • 同じコンピューター上で同じコードを実行しているWindowsフォームアプリケーションは、任意のアドレスから任意のアドレスに電子メールを送信できます。
  • 同じアカウント(NETWORK SERVICE)で実行されている同じIIS上の別のASP.NETアプリケーションは、同じSMTPサーバーを使用して任意のアドレスから任意のアドレスに電子メールを送信できます。
  • SMTPサーバーに認証が構成されていません。
  • ASP.NETアプリケーションとWindowsフォームアプリケーションはどちらも、System.Net.Mail.SmtpClientクラスを利用してSystem.Net.Mail.MailMessageを送信します。

電子メールマッサージを送信するコードは次のとおりです。

private void button1_Click(object sender, EventArgs e)
        {
            MailMessage mesasge = new MailMessage(txtFrom.Text, txtTo.Text, "Test mail", txtBody.Text);
            SmtpClient client = new SmtpClient();
            if (!(string.IsNullOrEmpty(txtUserName.Text)))  //Is false since txtUserName.Text is empty
                client.Credentials = new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
            client.EnableSsl = false;
            client.Host = txtServer.Text;
            client.Port = 25;
            try
            {
                client.Send(mesasge);
            }
            catch (Exception ex)
            {
                txtResponse.Text = ex.Message;
            }
        }

私が理解できる限り、これはコーディングの問題ではなく、構成の問題であるはずです。誰かが問題が何であるか、そしておそらくこれをどのように解決できるかについての考えを持っていますか?ありがとう!

4

2 に答える 2

1

これは間違いなく認証の問題のように聞こえます。または、誤って2つの異なるSMTPサーバーを使用しています。

両方のアプリケーションでログを有効にして、ログを表示することをお勧めします。ログを表示すると、違いを確認でき、できればコードまでさかのぼることができます。

System.Net.Mailにログインするには、.configファイルにいくつかのエントリを追加する必要があります。

<configuration>
  <system.diagnostics>
    <trace autoflush="true" />

    <sources>

      <source name="System.Net" >
        <listeners>
          <add name="MyTraceFile"/>
        </listeners>
      </source>

      <source name="System.Net.Sockets">
        <listeners>
          <add name="MyTraceFile"/>
        </listeners>
      </source>

    </sources>


    <sharedListeners>
      <add
        name="MyTraceFile"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="System.Net.trace.log"                />
    </sharedListeners>

    <switches>
      <add name="System.Net" value="Verbose" />
      <add name="System.Net.Sockets" value="Verbose" />
    </switches>
 </configuration>

詳細情報へのリンクは次のとおりです。

http://systemnetmail.com/faq/4.10.aspx

于 2010-01-27T13:12:46.753 に答える
0

web.configにimpersonate=trueがありますか?

これを行う:

new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);

私の知る限り、なりすましを許可するようにweb.configを設定する必要があります。

これをweb.configに追加してみてください(そこにない場合)

    <system.web>
    <identity impersonate="true"  />
于 2010-01-27T08:58:02.633 に答える