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.

1voto

elaz Points 111

J'ai créé un code court pour faire cela et je veux le partager avec vous.

Voici le code principal :

public void Send(string from, string password, string to, string Message, string subject, string host, int port, string file)
{

  MailMessage email = new MailMessage();
  email.From = new MailAddress(from);
  email.To.Add(to);
  email.Subject = subject;
  email.Body = Message;
  SmtpClient smtp = new SmtpClient(host, port);
  smtp.UseDefaultCredentials = false;
  NetworkCredential nc = new NetworkCredential(from, password);
  smtp.Credentials = nc;
  smtp.EnableSsl = true;
  email.IsBodyHtml = true;
  email.Priority = MailPriority.Normal;
  email.BodyEncoding = Encoding.UTF8;

  if (file.Length > 0)
  {
    Attachment attachment;
    attachment = new Attachment(file);
    email.Attachments.Add(attachment);
  }

  // smtp.Send(email);
  smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallBack);
  string userstate = "sending ...";
  smtp.SendAsync(email, userstate);
}

private static void SendCompletedCallBack(object sender,AsyncCompletedEventArgs e) {
  string result = "";
  if (e.Cancelled)
  {    
    MessageBox.Show(string.Format("{0} envoi annulé.", e.UserState),"Message",MessageBoxButtons.OK,MessageBoxIcon.Information);
  }
  else if (e.Error != null)
  {
    MessageBox.Show(string.Format("{0} {1}", e.UserState, e.Error), "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }
  else {
    MessageBox.Show("votre message est envoyé", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
  }

}

Dans votre bouton faites quelque chose comme ceci
vous pouvez ajouter vos fichiers jpg ou pdf et plus encore .. ceci n'est qu'un exemple

using (OpenFileDialog attachement = new OpenFileDialog()
{
  Filter = "Exel Client|*.png",
  ValidateNames = true
})
{
if (attachement.ShowDialog() == DialogResult.OK)
{
  Send("votremail@gmail.com", "mot de passe gmail", 
       "destinataire@gmail.com", "juste un sourire", "mail avec pièce jointe",
       "smtp.gmail.com", 587, attachement.FileName);

}
}

0voto

Ashar Kashif Points 1

Essayer ceci :

private void btnAtt_Click(object sender, EventArgs e) {

    openFileDialog1.ShowDialog();
    Attachment myFile = new Attachment(openFileDialog1.FileName);

    MyMsg.Attachments.Add(myFile);

}

0voto

Aubrey Love Points 552

J'ai essayé le code fourni par Ranadheer Reddy (ci-dessus) et ça a très bien fonctionné. Si vous utilisez un ordinateur d'entreprise qui a un serveur restreint, vous devrez peut-être changer le port SMTP en 25 et laisser votre nom d'utilisateur et votre mot de passe vides car ils se rempliront automatiquement par votre administrateur.

À l'origine, j'ai essayé d'utiliser EASendMail du gestionnaire de packages nugent, pour réaliser ensuite que c'est une version payante avec un essai de 30 jours. Ne perdez pas votre temps avec cela à moins que vous prévoyiez de l'acheter. J'ai remarqué que le programme s'exécutait beaucoup plus rapidement avec EASendMail, mais pour moi, gratuit valait mieux que rapide.

Juste mes 2 cents.

0voto

Utilisez cette méthode sous votre service de messagerie électronique pour attacher tout corps de messagerie électronique et pièces jointes à Microsoft Outlook

à l'aide d'Outlook = Microsoft.Office.Interop.Outlook; // Référence Microsoft.Office.Interop.Outlook depuis local ou nuget si vous utiliserez un agent de build plus tard

 try {
                    var officeType = Type.GetTypeFromProgID("Outlook.Application");

                    if(officeType == null) {//Outlook n'est pas installé
                        return new PdfErrorResponse {
                            ErrorMessage = "Le système ne peut pas démarrer Outlook ! Assurez-vous qu'Outlook est installé sur votre ordinateur."
                        };
                    } else {
                        // Outlook est installé.    
                        // Continuez votre travail.
                        Outlook.Application objApp = new Outlook.Application();
                        Outlook.MailItem mail = null;
                        mail = (Outlook.MailItem)objApp.CreateItem(Outlook.OlItemType.olMailItem);
                        //La méthode CreateItem retourne un objet qui doit être typecasté en MailItem 
                        //avant de l'utiliser.
                        mail.Attachments.Add(attachmentFilePath,Outlook.OlAttachmentType.olEmbeddeditem,1,$"Pièce jointe {ordernumber}");
                        //Les paramètres sont expliqués ci-dessous
                        mail.To = recipientEmailAddress;
                        //mail.CC = "con@def.com";//Toutes les listes de diffusion doivent être séparées par le ';'

                        //Pour envoyer un email :
                        //mail.Send();
                        //Pour afficher la fenêtre de messagerie
                        await Task.Run(() => mail.Display());
                    }

                } catch (System.Exception) {
                    return new PdfErrorResponse {
                        ErrorMessage = "Le système ne peut pas démarrer Outlook ! Assurez-vous qu'Outlook est installé sur votre ordinateur."
                    };
                }

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