Почему MailMessage отправляется на любой адрес из приложения Windows Forms, но не из приложения ASP.NET, когда оба используют один и тот же SMTP-сервер?

StackOverflow https://stackoverflow.com/questions/2145437

Вопрос

Я сталкиваюсь с загадочной (для меня) ошибкой при отправке электронных писем через SMTP-сервер из веб-приложения ASP.NET.Я получаю известную ошибку "невозможно выполнить ретрансляцию для xxx@yyy.zzz".Что для меня загадочно, так это то, что когда я вырезаю и вставляю точно такой же код, который отправляет электронное письмо, в обычное приложение.ЧИСТОЕ приложение Windows Forms, отправляйте электронное письмо с помощью этого приложения, все работает просто отлично.Это заставило меня подумать, что, возможно, проблема в том, что ASP.NET приложение запускается как СЕТЕВАЯ СЛУЖБА, в то время как приложение Windows Forms работает в учетной записи пользователя домена, но оказывается, что у меня есть другая ASP.NET приложение, отправляющее электронную почту через тот же SMTP-сервер, работающий под управлением СЕТЕВОГО СЕРВЕРА в том же IIS, и это приложение не сталкивается с этой проблемой.

Далее я попытался отправлять электронные письма через SMTP-сервер вручную, подключив telnet к SMTP-серверу на порт 25 и запустив SMTP-протокол вручную, и все это работает нормально.SMTP-сервер не настроен на какой-либо вид аутентификации или SSL.

Другим загадочным фактом является то, что ASP.NET приложение может отправлять электронные письма с адреса в пределах того же домена на адрес электронной почты в пределах того же домена, но не на какой-либо адрес за пределами домена.Но приложение Windows Forms, которое использует точно такой же код, может отправлять электронные письма с любого адреса на любой адрес как внутри домена, так И за его пределами.

Итак, подведем итог:

  • ASP.NET Приложение может отправлять электронные письма с адресов в пределах домена на адреса внутри домена, но не на адреса за пределами домена.
  • Приложение Windows Forms, работающее с тем же кодом на том же компьютере может отправлять электронные письма с ЛЮБОГО адреса на ЛЮБОЙ адрес.
  • Другое ASP.NET приложение на том же IIS, работающее под той же учетной записью (СЕТЕВОЙ СЕРВИС), может отправлять электронные письма с использованием того же SMTP-сервера с ЛЮБОГО адреса на ЛЮБОЙ адрес.
  • Аутентификация не настроена на SMTP-сервере.
  • Как приложение ASP.NET, так и приложение Windows Forms использует класс 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;
            }
        }

Насколько я могу понять, это должно быть вопросом конфигурации, а не проблем с кодированием.У кого-нибудь есть идея, в чем может заключаться проблема и, возможно, как это можно было бы решить?Спасибо!

Это было полезно?

Решение

Это определенно звучит как проблема с аутентификацией или вы случайно используете 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

Другие советы

У вас есть impersonate = true в web.config?

Делая это:

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

Насколько я знаю, требуется, чтобы web.config был настроен на разрешение олицетворения.

Попробуйте добавить это в свой web.config (если у вас его там нет)

    <system.web>
    <identity impersonate="true"  />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top