SMTP Invia sta chiudendo i miei file - c #
-
18-09-2019 - |
Domanda
Ho una funzione questo è l'invio di messaggi (un sacco di loro) e relativi allegati.
E 'loop essenzialmente attraverso una struttura di directory e crea messaggi di posta elettronica da una struttura di file, ad esempio
c:\emails\message01
\attachments
c:\emails\message02
\attachments
La creazione dei messaggi avviene tramite .net c #, roba standard.
Dopo aver creato tutti i messaggi ... io ho un'altra funzione che viene eseguito direttamente in seguito che copia il messaggio della cartella in un'altra posizione.
Il problema è - file sono bloccati ...
Nota: Non sto spostando i file, semplicemente copiandole ....
Qualche suggerimento su come copiare i file bloccati, utilizzando c #?
Aggiorna
Ho questo metodo di aggiungere allegati
private void AddAttachments(MailMessage mail)
{
string attachmentDirectoryPath = "c:\messages\message1";
DirectoryInfo attachmentDirectory = new DirectoryInfo(attachmentDirectoryPath);
FileInfo[] attachments = attachmentDirectory.GetFiles();
foreach (FileInfo attachment in attachments)
{
mail.Attachments.Add(new Attachment(attachment.FullName));
}
}
Soluzione
Come stai leggendo i file per creare il messaggio di posta elettronica? Essi dovrebbero essere aperti in sola lettura, con un FileShare
impostato FileShare.ReadWrite
... allora non devono essere bloccate. Se si utilizza un FileStream
si dovrebbe anche avvolgere la logica la parola using
in modo che la risorsa è disposto correttamente.
Aggiornamento:
Credo che smaltire il messaggio di posta stesso si chiuderà le risorse al suo interno e sbloccare i file:
using (var mail = new MailMessage())
{
AddAttachments(mail);
}
// File copy code should work here
Altri suggerimenti
odio rispondendo mio post, ma sì per la prossima povero ragazzo che ha questo problema qui è la correzione:
DOPO aver inviato il messaggio
// Send the mail
client.Send(message);
//Clean up attachments
foreach (Attachment attachment in message.Attachments)
{
attachment.Dispose();
}
Smaltire gli allegati ... cancella il blocco, e messaggi saranno comunque inviati con allegati. Smaltire NON eliminare i file, basta cancella gli allegati:)
Stai chiudendo il file dopo aver finito di leggerli? Se li si apre per la lettura, ma non si chiude quando hai finito, dovrebbe mantenere un blocco su di esso fino a quando il programma viene chiuso e chiude automaticamente tutti i file.
MailMessage email = new MailMessage();
email.From = txtFrom.Text;
email.To = txtToEmail.Text;
email.Subject = txtMSubject.Text;
email.Body = txtBody.Text;
SmtpClient mailClient = new SmtpClient();
mailClient.Host = "smtp.emailAddress";
mailClient.Port = 2525;
mailClient.Send(email );
email.Dispose();
// After Disposing the email object you can call file delete
if (filePath != "")
{
if (System.IO.File.Exists(filePath))
{
System.IO.File.Delete(filePath);
}
}
Vedo questo molto quando l'invio di allegati. Io di solito uso qualcosa di simile al seguente:
Nel codice che sposta i file in una posizione diversa, è possibile utilizzare il seguente schema:
All'interno del ciclo per il ciclo attraverso il file
bool FileOk = false;
while (!FileOk)
{
try
{
// code to move the file
FileOk = true;
}
catch(Exception)
{
// do nothing or write some code to pause the thread for a few seconds.
}
}