2011-01-13 4 views
7

Podczas korzystania z ustawień system.net/mail web.config w celu skonfigurowania mojego SmtpClient, nie wysyła wiadomości e-mail z "błędem protokołu" opisanym najlepiej przez kodowanie i uwierzytelnianie Base64 problemy:SmtpClient nie będzie uwierzytelniał, gdy zostanie zawyżony z web.config

Przykład:
z następującymi Config

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

a kod:

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); 

Produkuje się komunikat o błędzie:

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) 

Jednak w poniższym kodzie, gdzie ręcznie ustawić wszystkie właściwości, kod działa bez wyjątku, a e-mail zostanie dostarczona.

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); 
+3

Jeśli zdekodujesz UGFzc3dvcmQ6, otrzymasz "Password:", więc najwyraźniej problem z uwierzytelnieniem. Testowałem to sam bez żadnych problemów.Możliwy duplikat: http://stackoverflow.com/questions/2380531/problem-in-sending-mail-with-smtpclient – thomasvdb

+0

To było moje początkowe podejrzenie, z wyjątkiem tego, że te same poświadczenia powodują błąd po ustawieniu przez konfigurację internetową i działają po ustawieniu przy użyciu kodu. –

+0

Jaki jest używany serwer pocztowy? – Hawxby

Odpowiedz

3

Próbowałem ustawienia konfiguracyjne od wewnątrz LINQPad przeciwko mojego serwera hMailServer mail, a oni pracowali świetnie. Domyślam się, że serwer pocztowy, z którym się komunikujesz, jest w nieoczekiwany sposób uzgadniany z klientem. Kiedy byłem testowania, ja schwytany dziennik SMTP z mojego serwera, a oto jak to wyglądało (odkażane, oczywiście):

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. 

Serwer wymaga SMTP AUTH i widać, że po mój klient wysyła Polecenie AUTH, serwer odpowiada kodem statusu 334 i kodowaną podstawową reprezentacją Password:. Tak więc, polecam turning on the trace functionality dla SmtpClient, aby można było zobaczyć, co dzieje się podczas obu scenariuszy.

biegałam LINQPad 4,31, a mój plik linqpad.config zawierała:

<?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> 

Zapytanie LINQPad był następujący:

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); 
1

Spróbuj ustawić atrybut deliveryMethod wymusić konfigurację aby korzystać z sieci-config

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

Dzięki za rekomendację. Nie miało to żadnego skutku. –

+0

Czy próbowałeś debugowania i sprawdzania właściwości serwera SMTP po tym, jak zostały poprawnie wypełnione podczas używania web.config do przechowywania poświadczeń? Może tam jest nieprawidłowa wartość. – Scott

2

Dodaj to do logowania

Prosimy o komentarz, co Używane są moduły uwierzytelniania (znajdziesz je w pliku network.log). Na moim pudełku SmtpLoginAuthenticationModule # jest stale używany, ale są inne możliwe.

<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> 
+0

Gdzie można wyświetlić te logi? – brenjt

0

Guys Ten kod jest ok próbuję za pomocą devsmtp na lokalnym komputerze i działać dobrze

Protected Sub Button1_Click (ByVal nadawcy jako obiekt, ByVal e As EventArgs) Uchwyty 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 

należy pobrać devsmtp na lokalnym komputerze z

http://download-codeplex.sec.s-msft.com/Download/Release?ProjectName=smtp4dev&DownloadId=269147&FileTime=129575689693530000&Build=20393