123 votes

Envoyer un e-mail avec des pièces jointes depuis C#, les pièces jointes arrivent en tant que Partie 1.2 dans Thunderbird

J'ai une application C# qui envoie des rapports de feuille de calcul Excel par e-mail via un serveur Exchange 2007 en utilisant SMTP. Ils arrivent bien pour les utilisateurs d'Outlook, mais pour les utilisateurs de Thunderbird et de Blackberry, les pièces jointes ont été renommées en "Part 1.2".

J'ai trouvé cet article qui décrit le problème, mais ne semble pas me donner de solution de contournement. Je n'ai pas le contrôle du serveur Exchange donc je ne peux pas y apporter de modifications. Y a-t-il quelque chose que je peux faire du côté C# ? J'ai essayé d'utiliser des noms de fichiers courts et le codage HTML pour le corps mais cela n'a rien changé.

Mon code d'envoi de mail est simplement le suivant:

public static void SendMail(string recipient, string subject, string body, string attachmentFilename)
{
    SmtpClient smtpClient = new SmtpClient();
    NetworkCredential basicCredential = new NetworkCredential(MailConst.Username, MailConst.Password);
    MailMessage message = new MailMessage();
    MailAddress fromAddress = new MailAddress(MailConst.Username);

    // setup up the host, increase the timeout to 5 minutes
    smtpClient.Host = MailConst.SmtpServer;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = basicCredential;
    smtpClient.Timeout = (60 * 5 * 1000);

    message.From = fromAddress;
    message.Subject = subject;
    message.IsBodyHtml = false;
    message.Body = body;
    message.To.Add(recipient);

    if (attachmentFilename != null)
        message.Attachments.Add(new Attachment(attachmentFilename));

   smtpClient.Send(message);
}

Merci pour toute aide.

0 votes

Avez-vous essayé de définir / modifier la propriété Attachment.Name ?

0 votes

Non, je ne l'ai pas - "Obtient ou définit la valeur du nom du type de contenu MIME", avez-vous une suggestion quant à quelle valeur essayer ? Merci.

0 votes

Le Nom est affiché comme le nom de la pièce jointe lors de la réception de l'e-mail avec la pièce jointe. Vous pouvez donc essayer n'importe quelle valeur.

128voto

K.R.R Points 999

Code simple pour envoyer un e-mail avec une pièce jointe.

source: http://www.coding-issues.com/2012/11/sending-email-with-attachments-from-c.html

using System.Net;
using System.Net.Mail;

public void email_send()
{
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
    mail.From = new MailAddress("votre e-mail@gmail.com");
    mail.To.Add("destinataire@gmail.com");
    mail.Subject = "Test Mail - 1";
    mail.Body = "e-mail avec pièce jointe";

    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("c:/textfile.txt");
    mail.Attachments.Add(attachment);

    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential("votre e-mail@gmail.com", "votre mot de passe");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}

21 votes

Vous devez envelopper les `MailMessage` et `SmtpClient` avec des déclarations `using` pour vous assurer qu'ils sont correctement disposés

1 votes

@Andrew - Comment puis-je faire ça?

0 votes

J'ai essayé ce code et j'ai reçu l'erreur indiquée dans ce post - stackoverflow.com/questions/20845469/…

101voto

Jon Points 2043

Remplir explicitement les champs ContentDisposition a fait l'affaire.

if (attachmentFilename != null)
{
    Attachment attachment = new Attachment(attachmentFilename, MediaTypeNames.Application.Octet);
    ContentDisposition disposition = attachment.ContentDisposition;
    disposition.CreationDate = File.GetCreationTime(attachmentFilename);
    disposition.ModificationDate = File.GetLastWriteTime(attachmentFilename);
    disposition.ReadDate = File.GetLastAccessTime(attachmentFilename);
    disposition.FileName = Path.GetFileName(attachmentFilename);
    disposition.Size = new FileInfo(attachmentFilename).Length;
    disposition.DispositionType = DispositionTypeNames.Attachment;
    message.Attachments.Add(attachment);                
}

BTW, en cas de Gmail, vous pouvez rencontrer des exceptions concernant la sécurité ssl ou même le port!

smtpClient.EnableSsl = true;
smtpClient.Port = 587;

2 votes

Pourquoi n'utiliseriez-vous pas un objet FileInfo pour obtenir les propriétés CreationTime, LastWriteTime et LastAccessTime? Vous en créez un de toute façon pour obtenir la propriété Length.

1 votes

N'oubliez pas d'appeler attachment.Dispose() sinon ce fichier restera verrouillé et vous ne pourrez pas écrire de données dessus.

7voto

Pankaj Prakash Points 758

Voici un code simple d'envoi de mail avec pièce jointe

try  
{  
    SmtpClient mailServer = new SmtpClient("smtp.gmail.com", 587);  
    mailServer.EnableSsl = true;  

    mailServer.Credentials = new System.Net.NetworkCredential("monemail@gmail.com", "monmotdepasse");  

    string from = "monemail@gmail.com";  
    string to = "destinataire@gmail.com";  
    MailMessage msg = new MailMessage(from, to);  
    msg.Subject = "Entrez le sujet ici";  
    msg.Body = "Le message va ici.";
    msg.Attachments.Add(new Attachment("D:\\monfichier.txt"));
    mailServer.Send(msg);  
}  
catch (Exception ex)  
{  
    Console.WriteLine("Impossible d'envoyer l'e-mail. Erreur : " + ex);  
}

En savoir plus Envoi d'e-mails avec pièce jointe en C#

5voto

diabolickman Points 68

Compléter la solution de Ranadheer, en utilisant Server.MapPath pour localiser le fichier

System.Net.Mail.Attachment attachment;
attachment = New System.Net.Mail.Attachment(Server.MapPath("~/App_Data/hello.pdf"));
mail.Attachments.Add(attachment);

0 votes

D'où vient Server.MapPath et quand devrait-il être utilisé?

0 votes

La personne qui a écrit cela était probablement un programmeur ASP.NET, et je pense que cela aide simplement à donner un nom de fichier entièrement qualifié à partir d'un nom de fichier relatif. La question originale ne mentionnait pas ASP.NET ; vous pouvez simplement mettre une référence complète à un nom de fichier là-bas.

1voto

Khang Pham Points 11
private void btnSent_Click(object sender, EventArgs e)
{
    try
    {
        MailMessage mail = new MailMessage();
        SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

        mail.From = new MailAddress(txtAcc.Text);
        mail.To.Add(txtToAdd.Text);
        mail.Subject = txtSub.Text;
        mail.Body = txtContent.Text;
        System.Net.Mail.Attachment attachment;
        attachment = new System.Net.Mail.Attachment(txtAttachment.Text);
        mail.Attachments.Add(attachment);

        SmtpServer.Port = 587;
        SmtpServer.Credentials = new System.Net.NetworkCredential(txtAcc.Text, txtPassword.Text);

        SmtpServer.EnableSsl = true;

        SmtpServer.Send(mail);
        MessageBox.Show("email envoyé");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.ToString());
    }
}

private void button1_Click(object sender, EventArgs e)
{
    MailMessage mail = new MailMessage();
    openFileDialog1.ShowDialog();
    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment(openFileDialog1.FileName);
    mail.Attachments.Add(attachment);
    txtAttachment.Text = Convert.ToString(openFileDialog1.FileName);
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X