2010-07-15 11 views
6

utilizzare questa classe per inviare mail attraverso un account gmail:System.Net.Mail - tentando di inviare una mail con allegato a Gmail, ma funziona per i piccoli allegati solo

public class GmailAccount 
    { 
     public string Username; 
     public string Password; 
     public string DisplayName; 

     public string Address 
     { 
      get 
      { 
       return Username + "@gmail.com"; 
      } 
     } 

     private SmtpClient client; 

     public GmailAccount(string username, string password, string displayName = null) 
     { 
      Username = username; 
      Password = password; 
      DisplayName = displayName; 

      client = new SmtpClient 
      { 
       Host = "smtp.gmail.com", 
       Port = 587, 
       EnableSsl = true, 
       DeliveryMethod = SmtpDeliveryMethod.Network, 
       UseDefaultCredentials = false, 
       Credentials = new NetworkCredential(Address, password) 
      }; 
     } 

     public void SendMessage(string targetAddress, string subject, string body, params string[] files) 
     { 
      MailMessage message = new MailMessage(new MailAddress(Address, DisplayName), new MailAddress(targetAddress)) 
      { 
       Subject = subject, 
       Body = body 
      }; 

      foreach (string file in files) 
      { 
       Attachment attachment = new Attachment(file); 
       message.Attachments.Add(attachment); 
      } 

      client.Send(message); 
     } 
    } 

Ecco un esempio di come lo uso:

GmailAccount acc = new GmailAccount("zippoxer", "******", "Moshe"); 
acc.SendMessage("[email protected]", "Hello Self!", "like in the title...", "C:\\822d14ah857.r"); 

l'ultimo parametro del metodo diSendMessage è la posizione di un attaccamento che voglio aggiungere.

Ho provato a inviare una mail con un allegato di 400 KB, ha funzionato benissimo (anche 900KB funziona). Ma poi ho provato a caricare un allegato di 4 MB, non ha funzionato. Provato 22 MB -> non ha funzionato troppo.

Ci dovrebbe essere un limite di 25 MB per messaggio in Gmail. L'oggetto e il corpo del mio messaggio sono quasi vuoti quindi non considerarli parte della dimensione del messaggio. Perché ho quel limite basso?

+0

Funziona in un normale client di posta? – SLaks

+0

Sì, ho dimenticato di dirlo. Ho appena caricato un file da 22 MB tramite www.gmail.com. –

+1

C'è un messaggio di errore o l'e-mail viene inviata senza l'allegato? Stai eseguendo questo da un server o localmente? Puoi provare a testare più dimensioni di file per trovare un limite più preciso? (2MB? 4MB? La tecnica di ricerca binaria potrebbe funzionare) –

risposta

5

Secondo questo post, si tratta di un bug in .Net 4.0. Il limite specificato nel post è 3.050.417 byte. Puoi provare il codice di aggancio incluso nel post. Spero che questo ti aiuti.

http://connect.microsoft.com/VisualStudio/feedback/details/544562/cannot-send-e-mails-with-large-attachments-system-net-mail-smtpclient-system-net-mail-mailmessage

+0

Grazie mille. –

+0

Fino al prossimo service pack. Una patch pubblica è ora disponibile per questo problema. Puoi trovarlo qui: https://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=30226 – excalibur

0

Verificare e vedere se l'oggetto SmtpClient sta uscendo dall'ambito o in altro modo viene eliminato prima che l'invio sia completato e ha inviato il QUIT al server.

+0

Non penso perché, quando provo a caricare un file di grandi dimensioni, mi viene immediatamente comunicato che l'invio è fallito. –

1

E 'ancora possibile inviare. Basta cambiare la codifica dell'allegato in qualcosa di diverso da Base64. Ho provato a provare questo e ho trovato che c'è un IndexOutOfBoundsException nel codice di codifica Base64. Sono stato in grado di inviare un file da 11 MB a me stesso utilizzando TransferEncoding.SevenBit.

0

OK, questo è un bug in .net 4. Microsoft dice che verrà risolto nel prossimo service pack.