Почему MailMessage отправляется на любой адрес из приложения Windows Forms, но не из приложения ASP.NET, когда оба используют один и тот же SMTP-сервер?
-
23-09-2019 - |
Вопрос
Я сталкиваюсь с загадочной (для меня) ошибкой при отправке электронных писем через 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>
Вот ссылка с дополнительной информацией:
Другие советы
У вас есть impersonate = true в web.config?
Делая это:
new System.Net.NetworkCredential(txtUserName.Text, txtPassword.Text);
Насколько я знаю, требуется, чтобы web.config был настроен на разрешение олицетворения.
Попробуйте добавить это в свой web.config (если у вас его там нет)
<system.web>
<identity impersonate="true" />