SmtpClient не будет аутентифицироваться при накачке из web.config

При использовании параметров system.net/mail web.config для настройки моего SmtpClient, он не может доставлять электронную почту, с "ошибкой протокола", которая лучше всего описывается проблемами кодирования и аутентификации Base64:

Пример:
Со следующей конфигурацией

<system.net>
    <mailSettings>
        <smtp from="[email protected]">
            <network host="servermail.outsourced.com"
                     port="2525" 
                     defaultCredentials="false" 
                     userName="username" 
                     password="password"/>
        </smtp>
    </mailSettings>
</system.net>

И код:

var tmp = new SmtpClient();

MailMessage msg = new MailMessage();
msg.Subject = "test";
msg.From = new MailAddress("[email protected]");
msg.To.Add(new MailAddress("[email protected]"));
msg.Body = "test";
tmp.Send(msg);

Создает сообщение об ошибке:

System.Net.Mail.SmtpException: The server committed a protocol violation The server response was: UGFzc3dvcmQ6
   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException
& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)

Однако в следующем коде, где я вручную устанавливаю все свойства, код выполняется без исключения и электронная почта доставляется.

var tmp2 = new SmtpClient("servermail.outsourced.com", 2525);
tmp2.Credentials = new NetworkCredential("username", "password");
tmp2.UseDefaultCredentials = false;

MailMessage msg = new MailMessage();
msg.Subject = "test";
msg.From = new MailAddress("[email protected]");
msg.To.Add(new MailAddress("[email protected]"));
msg.Body = "test";
tmp2.Send(msg);
7 голосов | спросил Matt Murrell 14 Jam1000000amFri, 14 Jan 2011 00:02:48 +030011 2011, 00:02:48

3 ответа


0

Я попробовал ваши настройки в LINQPad на моем почтовом сервере hMailServer, и они отлично работали. Итак, я предполагаю, что почтовый сервер, с которым вы общаетесь, неожиданно связывается с клиентом. Когда я проводил тестирование, я захватил журнал SMTP со своего сервера, и вот как он выглядел (конечно, продезинфицирован):

SENT: 220 my.mailserv.er ESMTP
RECEIVED: EHLO CLIENTAPP
SENT: 250-my.mailserv.er[nl]250-SIZE 25600000[nl]250 AUTH LOGIN
RECEIVED: AUTH login bWFpbHRlc3RAbXkubWFpbHNlcnYuZXI=
SENT: 334 UGFzc3dvcmQ6
RECEIVED: ***
SENT: 235 authenticated.
RECEIVED: MAIL FROM:<[email protected]>
SENT: 250 OK
RECEIVED: RCPT TO:<[email protected]>
SENT: 250 OK
RECEIVED: DATA
SENT: 354 OK, send.

Мой сервер требует SMTP AUTH, и вы можете видеть, что после того, как мой клиент отправляет команду AUTH, сервер отвечает кодом состояния 334 и представлением в кодировке base-64 Password:. Поэтому я бы рекомендовал включить функцию трассировки для SmtpClient, чтобы вы могли видеть, что происходит в обоих сценариях.

Я запускал LINQPad 4.31, и мой файл linqpad.config содержал:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <mailSettings>
      <smtp from="[email protected]">
        <network host="my.mailserv.er" port="25" userName="[email protected]" password="supersecure"/>
      </smtp>
    </mailSettings>
  </system.net>
</configuration>

Запрос LINQPad был следующим:

SmtpClient mailer = new SmtpClient();

Guid g = Guid.NewGuid();
g.Dump("Message GUID");

MailMessage msg = new MailMessage();
msg.Subject = "Test:" + g;
msg.To.Add(new MailAddress("[email protected]"));
msg.Body = "I HAS A BODY";
mailer.Send(msg);
ответил arcain 24 Jam1000000amMon, 24 Jan 2011 11:17:01 +030011 2011, 11:17:01
0

Добавить это для регистрации

Пожалуйста, прокомментируйте, что используются AuthenticationModules (вы найдете их в network.log). На моем ящике SmtpLoginAuthenticationModule # используется постоянно, но возможны и другие.

  <system.diagnostics>
    <sources>
      <source name="System.Net" tracemode="includehex">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Sockets">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
      <source name="System.Net.Cache">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>

    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
      <add name="System.Net.Sockets" value="Verbose"/>
      <add name="System.Net.Cache" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="System.Net"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="network.log"
      />
    </sharedListeners>
    <trace autoflush="true"/>

  </system.diagnostics>
ответил rene 24 Jpm1000000pmMon, 24 Jan 2011 14:17:01 +030011 2011, 14:17:01
0

Ребята, с этим кодом все в порядке, я пытаюсь использовать devsmtp для локальной машины, и он работает нормально

Защищенный вложенный Button1_Click (отправитель ByVal как объект, ByVal и как EventArgs) обрабатывает Button1.Click

    Using tmp = New SmtpClient()
        Dim msg As New MailMessage() With {.Subject = "test", .From = New MailAddress("[email protected]")}
        msg.[To].Add(New MailAddress("[email protected]"))
        msg.Body = "test"
        tmp.Send(msg)
    End Using

End Sub

пожалуйста, скачайте devsmtp для локальной машины с

ответил grayjer 9 AMpTue, 09 Apr 2013 04:10:54 +040010Tuesday 2013, 04:10:54

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132