SMTP-клиент не может отправить сообщение на локальном узле, успешно на удаленном узле


У меня есть небольшой tcp-сервер, который используется, среди прочего, для отправки почты через SMTP-сервер.

Проблема в том, что он работает правильно, когда я запускаю его на своей машине разработки (удаленное подключение к smtp-серверу), однако при запуске приложения на той же машине, что и SMTP-сервер (Windows Server 2008 R2), я получаю следующее исключение:

Системы.Чистая.Почте.SmtpException: сбой при отправке электронной почты. --- >System.IO.IOException: не удается прочитать данные из транспортное соединение: net_io_connectionclosed.

SMTP-сервер настроен на разрешение ретрансляции только с 127.0.0.1 и IP-адреса, к которому привязано приложение tcp, а также моей машины разработки. Он также настроен на разрешение подключений только из одного списка IP-адресов.

Бит C# для отправки почты выглядит следующим образом:

var mail = new MailMessage();
mail.To.Add(recipient);
mail.From = new MailAddress("me@mydomain.com");
mail.Subject = "subject";
mail.Body = "message";
var smtpClient = new SmtpClient(MailServerAddress, Constants.MAIL_SERVER_PORT);         
smtpClient.Send(mail);

MailServerAddress определяется при первом запуске приложения.
Я попытался установить его как на 127.0.0.1, так и на настроенный IP-адрес SMTP-сервера адрес, но я все равно получаю то же исключение.

Проверка журналов сервера не показывает никаких признаков соединения, что соответствует приведенному выше исключению.

Что я здесь делаю не так?

2 2

2 ответа:

Просто удар в темноте ответ, но попробуйте это, так как у меня была подобная проблема около 3 лет назад, но не могу вспомнить исправление, но эта строка кода выделяется для меня, когда я посмотрел

_client.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;

Поэтому, возможно, попробуйте (предполагая, что вы используете IIS для SMTP):

var smtpClient = new SmtpClient(MailServerAddress, Constants.MAIL_SERVER_PORT); 
smtpClient.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;        
smtpClient.Send(mail);

Ответ скопирован из здесь :

Unable to read data from the transport connection: net_io_connectionclosed


What this error means is that System.net.mail was unable to find the smtp server.

The answer will vary depending on whether you have a fixed IP or a dynamic IP but,
basically, you need to assign a valid IP to your smtp server.

With fixed IP's this is relatively straightforward.
With dynamic IP's it takes a bit of tweaking.

Open the IIS Manager and check the properties for the smtp server.

In the Default SMTP Virtual Server's properties, in the "Access" tab,
in the Connection Control and Relay dialogs, make sure that your local IP is assigned.
( In my case, it's 10.0.0.2... )

You may also need to modify your hosts file, to point 127.0.0.1 to your machine name.
( \WINDOWS\system32\drivers\etc\hosts )

Then, in your code, assign your machine name to the smtp client :

SmtpClient client = New SmtpClient("yourmachinename")
client.Send(mail)

Что-то еще, возможно, ваш брандмауэр блокирует ваш тест. Отключитесь от интернета и отключите брандмауэр, если это возможно, не создавая угрозы безопасности. Посмотрим, сработает ли он тогда. Если это так, вам нужно будет заглянуть глубже в настройки брандмауэра. Если нет, то это действительно может быть ваш IP-адрес, как описано выше.