2015-07-22 23 views
5

che sto cercando di connettersi a iCloud tramite SmtpClientMailkit SMTP - StartTLS & TLS bandiere

Le impostazioni che sto usando sono i seguenti:

nome

Server: smtp.mail.me.com
SSL Richiesto : Sì
Se viene visualizzato un messaggio di errore quando si utilizza SSL, provare a utilizzare TLS o STARTTLS.
Porto: 587
SMTP Autenticazione richiesta: Sì - con nome utente e la relativa password

Se uso SSL ottengo "sincronizzazione non riuscita a causa di formato del pacchetto inaspettato"

Se io non uso SSL visiva debugger in studio si blocca su connect.

Penso che il problema è che non sto dicendo a SmtpClient di usare tls ma non posso trovare la documentazione su come farlo.

Il codice è il seguente:

using (var client = new SmtpClient()) { 
    client.Timeout = 1000 * 20; 
    //client.Capabilities. 
    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Connect("SMTP.mail.me.com", 587, false); //dies here 
    //client.Connect(servername, port, useSsl); 
    //can I set tls or starttls here?? 
    client.Authenticate(username, password); 
    client.Send(FormatOptions.Default, message); 
} 

Am I in grado di impostare TLS o StartTLS manualmente. Una cosa che ho provato è la seguente, ma non sembra funzionare

client.Connect(new Uri("smtp://" + servername + ":" + port + "/?starttls=true")); 

Grazie per qualsiasi aiuto con questo.

+0

Perché stai passando 'false' per il flag' useSSL' se stai dicendo che hai bisogno di 'SSL'? – Rob

+0

@Rob Ho provato con true e ottengo un handshake non riuscito a causa del formato imprevisto del pacchetto. iCloud suggerisce questo: "Se viene visualizzato un messaggio di errore quando si utilizza SSL, provare a utilizzare TLS o STARTTLS." – cavej03

risposta

8

Il metodo Connect() che si sta utilizzando consente solo l'abilitazione/disabilitazione delle connessioni con SSL che non è la stessa cosa di StartTLS.

A causa della confusione, ho implementato un metodo separato Connect() che rende questo più evidente ciò che sta accadendo:

using (var client = new SmtpClient()) { 
    // Note: don't set a timeout unless you REALLY know what you are doing. 
    //client.Timeout = 1000 * 20; 

    // Removing this here won't do anything because the AuthenticationMechanisms 
    // do not get populated until the client connects to the server. 
    //client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Connect ("smtp.mail.me.com", 587, SecureSocketOptions.StartTls); 

    client.AuthenticationMechanisms.Remove ("XOAUTH2"); 

    client.Authenticate (username, password); 
    client.Send (message); 
} 

provare che.

+0

questo funziona .. @ cavej03 si prega di accettare questo anwser – om471987

0

È possibile impostare le opzioni per "SecureSocketOptions.Auto" qualcosa di simile

await client.ConnectAsync(mailService.Host, mailService.Port, SecureSocketOptions.Auto); 

MailKit deciderà automaticamente per utilizzare SSL o TLS.

+0

Che cosa usa per decidere? Il numero della porta? –

+0

Numero di porta che è necessario impostare nel modello. È solo il numero di porta da google mail o cosa mai. Quindi chiamo semplicemente il mio modello e chiedo la porta e l'host dal mio DB .... Ma ciò che è importante qui è "SecureSocketOptions.Auto" – error505

+0

@PaulKnopf Sì, MailKit usa la porta per decidere. Non è il miglior sistema al mondo, ma funziona il 99% delle volte. – jstedfast

Problemi correlati