SmtpClient не будет аутентифицироваться при раздувании из интернета.конфиг
при использовании system.net/mail веб.настройки конфигурации чтобы настроить мой 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 ответов
я попробовал ваши настройки конфигурации из 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, а база-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);
добавить это для ведения журнала
прокомментируйте, какие AuthenticationModules используются (вы найдете их в сети.бревно.) На моем поле 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>
попробуйте установить атрибут 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>
ребята, этот код в порядке, я пытаюсь использовать devsmtp для локальной машины, и он работает нормально
защищенные суб методе button1_click(как byval отправителя как объект, как byval E Как равно EventArgs) обрабатывает кнопки button1.Нажмите
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 для локальной машины из