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

При отправке электронной почты через SMTP-сервер из веб-приложения ASP.NET я испытываю загадочную (для меня) ошибку. Я получаю известную ошибку "невозможно передать по адресу xxx@yyy.zzz". Что для меня загадочно, так это то, что когда я вырезал и вставлял тот же самый код, который отправляет электронное письмо в обычное приложение .NET Windows Forms, отправлял электронное письмо с этим приложением, все это прекрасно работало. Это заставило меня подумать, что, возможно, проблема в том, что приложение ASP.NET работает как NETWORK SERVICE, в то время как приложение Windows Forms работает под учетной записью пользователя домена, но оказывается, что у меня есть другое приложение ASP.NET, отправляющее электронную почту через ту же SMTP-сервер работает под NETWORK SERVER на том же IIS, и это приложение не испытывает этой проблемы.

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

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

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

  • Приложение ASP.NET может отправлять электронные письма с адресов в пределах домен по адресам внутри домена, но не по адресам за пределами домен.
  • Приложение Windows Forms работает тот же код на том же компьютере можно отправлять электронные письма с любого адреса ЛЮБОЙ адрес.
  • Другое приложение ASP.NET на тот же IIS работает под тем же аккаунт (NETWORK SERVICE) можно отправить электронная почта, использующая тот же 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;
            }
        }

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

Ответы [ 2 ]

1 голос
/ 27 января 2010

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

0 голосов
/ 27 января 2010

Есть ли у вас олицетворение = true в файле web.config?

Делаем это:

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

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

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

    <system.web>
    <identity impersonate="true"  />
...