2009-02-09 14 views
7

Sto lavorando a un'app che utilizza System.Net.Mail.MailAddress e ad amici per l'invio di e-mail. Questo parser implementa l'intero RFC5322 o un sottoinsieme o cosa? MSDN non è molto imminente su questo argomento.Qual è il formato accettato dal parser System.Net.Mail.MailAddress?

Eventuali suggerimenti apprezzati.

+0

Ottieni e installa Reflector di RedGate, quindi vai allo spazio dei nomi System.Net.Mail e guarda il codice per vedere cosa fa. Lo farei ma ora sono a casa sul mio Mac. – tvanfosson

+3

Forse sono strano, ma preferirei vedere un documento (preferibilmente da MS o ECMA) affermando che quella dannata cosa "accetta gli indirizzi RFC e così via eccetto le sezioni X, Y e Z perché IETF non lo sa sh * t su internet "che dover smontare la cosa. –

+0

D'accordo, ma in assenza di tale documentazione - e forse anche con essa - l'esame del codice risponderebbe definitivamente alla domanda. – tvanfosson

risposta

4

ho scritto un piccolo frammento per testare la funzione:

foreach (int i in Enumerable.Range(32,128-32)) 
{ 
    char c = (char)i; 
    string addr = String.Format("par.t1{0}pa.r{0}[email protected]", c); 
    try 
    { 
     var mailAddr = new MailAddress(addr); 
    } 
    catch 
    { 
     Console.WriteLine("MailAddress failed '{0}' ({1}): {2}", c, i, addr); 
    } 
} 

con i seguenti risultati su 3.5 SP1:

 
MailAddress failed ' ' (32): par.t1 pa.r [email protected] 
MailAddress failed '"' (34): par.t1"pa.r"[email protected] 
MailAddress failed '(' (40): par.t1(pa.r([email protected] 
MailAddress failed ')' (41): par.t1)pa.r)[email protected] 
MailAddress failed ',' (44): par.t1,pa.r,[email protected] 
MailAddress failed ':' (58): par.t1:pa.r:[email protected] 
MailAddress failed ';' (59): par.t1;pa.r;[email protected] 
MailAddress failed '<' (60): par.t1<pa.r<[email protected] 
MailAddress failed '>' (62): par.t1>pa.r>[email protected] 
MailAddress failed '@' (64): [email protected]@[email protected] 
MailAddress failed '[' (91): par.t1[pa.r[[email protected] 
MailAddress failed '\' (92): par.t1\pa.r\[email protected] 
MailAddress failed ']' (93): par.t1]pa.r][email protected] 
MailAddress failed '⌂' (127): par.t1⌂pa.r⌂[email protected] 

Inoltre non sembra per sostenere "-stringa tra virgolette "Parti locali, come "blah"@example.com.

Non credo che un validatore possa accettare meno prima di diventare inutilizzabile.

3

Nella discussione sulla Dominic Sayers isemail article, Jerry O'Brien ha detto che ha letto casi di test di conformità RFC di Dominic contro la classe System.Net.MailAddress:

System.Net.MailAddress è solo il 59% conforme alle specifiche RFC. I commenti di follow-up hanno rilevato i casi specifici in cui ha generato falsi positivi e falsi negativi.

Le RFC sono estremamente deboli su ciò che costituisce un indirizzo di posta elettronica valido. Consentono una gamma di formati insoliti e impopolari. Quindi immagino che la vera domanda sia, è System.Net.MailAddress abbastanza buono nella maggior parte delle situazioni del mondo reale?

+1

Grazie per questo link interessante! Inoltre, una buona domanda sul parser è "abbastanza buono". L'implementazione specifica che ho provato era abbastanza buona per l'applicazione che ho fatto. Come ho cercato di spiegare nei commenti alla domanda, il problema più ampio per me è che questo, come molti altri posti nel BCL, è una documentazione terribilmente inadeguata; creare dipendenze non necessarie sui dettagli di implementazione (vedere il commento del riflettore). –

+0

Sono assolutamente d'accordo con te. Nei luoghi in cui gli standard esistono (cose come formati di date, URI, indirizzi e-mail, ecc.) Sarebbe bello sapere quali sono le specifiche di progettazione per la classe e anche i test unitari pubblicati! – dthrasher

+0

Io uso questo metodo, ma test @ test passa la convalida. Bummer. – Scott

Problemi correlati