SmtpClient не будет аутентифицироваться при накачке из web.config - PullRequest
7 голосов
/ 14 января 2011

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

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

<system.net>
    <mailSettings>
        <smtp from="email@server.com">
            <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("me@server.com");
msg.To.Add(new MailAddress("me@server.com"));
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("me@server.com");
msg.To.Add(new MailAddress("me@server.com"));
msg.Body = "test";
tmp2.Send(msg);

Ответы [ 4 ]

3 голосов
/ 24 января 2011

Я попробовал ваши настройки из 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:<mailtest@mailserv.er>
SENT: 250 OK
RECEIVED: RCPT TO:<happyuser@mailserv.er>
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="mailtest@mailserv.er">
        <network host="my.mailserv.er" port="25" userName="mailtest@mailserv.er" 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("happyuser@mailserv.er"));
msg.Body = "I HAS A BODY";
mailer.Send(msg);
2 голосов
/ 24 января 2011

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

Пожалуйста, прокомментируйте, что используются 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>
1 голос
/ 14 января 2011

Попробуйте установить атрибут deliveryMethod, чтобы заставить конфигурацию использовать network-config

<system.net>
    <mailSettings>
        <smtp deliveryMethod="network" from="email@server.com">
            <network host="servermail.outsourced.com"
                     port="2525" 
                     defaultCredentials="false" 
                     userName="username" 
                     password="password"/>
        </smtp>
    </mailSettings>
</system.net>
0 голосов
/ 09 апреля 2013

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

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

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

End Sub

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

http://download -codeplex.sec.s-msft.com / Скачать / Release? ProjectName = smtp4dev & DownloadId = 269147 & FileTime = 129575689693530000 & Строить = 20393

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...