2015-10-26 13 views
5

Quando sto tentando di inviare un'e-mail con allegato con più di un destinatario tramite il mio codice C# un System.Net.Mail.SmtpException è lanciato dicendo "Fallimento invio di posta". L'eccezione interna è "Uno degli stream è già stato utilizzato e non può essere ripristinato all'origine".SMTPException Uno degli stream è già stato utilizzato e non può essere ripristinato all'origine

Capisco che questo tipo di errore potrebbe accadere a causa del mio attaccamento. Ho creato il mio attaccamento in una classe diversa da -

Attatchment file; 
string fileContents = File.ReadAllText(fileName); 
file = Attachment.CreateAttachmentFromString(fileContents, fileName); 

Sto inviando in questo formato per la mia classe che invia l'e-mail. Il seguente accade in questa classe -

try 
{  
    email.Subject = subject; 
    email.Body = body; 
    if (file != null) 
    { 
     email.Attachments.Add(file); 
    } 
    _smtpClient.Send(email); 
} 
catch 
{ 
    mailSent = false; 
} 

La posta viene sempre inviata al primo destinatario ma non riesce per tutto il resto. Qualche idea sul perché questo potrebbe accadere?

+0

Immagino che potrebbe essere necessario disporre di "file" prima di tentare di usarlo di nuovo. – ChrisBint

+0

@ChrisBint Sareste in grado di dirmi perché? Perché questo errore non si verifica in modo coerente neanche. Questa è la prima volta che è spuntata. L'ho usato per un po '. Ci proverò ora, grazie. – DeeDeeR

+0

@ChrisBint Sarei più incline a indovinare che 'file' ha internamente un oggetto stream che non può essere resettato per iniziare. – DavidG

risposta

6

Internamente alla classe Attachment sembra utilizzare un Stream per contenere i dati. Alcuni tipi di stream non ti consentono di ripristinare la posizione all'inizio e genereranno un InvalidOperationException con il messaggio che vedi sopra.

vostre soluzioni sono:

  1. Invia un plico unico, ma ha messo tutti i destinatari nel campo Bcc.
  2. Crea l'allegato per ogni messaggio che invii, non riutilizzare lo stesso oggetto ogni volta.
  3. Questo potrebbe non funzionare, ma è possibile provare a utilizzare il costruttore per Attachment che accetta uno stream come parametro anziché stringa. Metti tutti i tuoi dati di stringa in un MemoryStream che consente il riposizionamento. Per esempio:

    public Stream StringToStream(string s) 
    { 
        MemoryStream stream = new MemoryStream(); 
        StreamWriter writer = new StreamWriter(stream); 
        writer.Write(s); 
        writer.Flush(); 
        stream.Position = 0; 
        return stream; 
    } 
    

    Allora questo:

    var stream = StringToStream(File.ReadAllText(fileName)); 
    Attatchment file = new Attachment(stream, fileName); 
    

Nota: Stai inizializzazione l'oggetto di attacco in modo non corretto. Nello constructor che richiede due parametri string, il secondo parametro è il tipo di supporto, non il nome file.

+0

Oh. C'è un modo per impostare il nome del file nell'allegato? La maggior parte degli aiuti online sembra suggerire di impostare la proprietà name che è in realtà il tipo di contenuto MIME. – DeeDeeR

+0

Sì, la proprietà name è ciò che dovresti usare. – DavidG

Problemi correlati