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