Envoi d'e-mail avec des pièces jointes à partir de 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 via un serveur Exchange 2007 utilisant SMTP. Ceux-ci arrivent bien pour les utilisateurs Outlook, mais pour les utilisateurs Thunderbird et Blackberry, les pièces jointes ont été renommées "partie 1.2".

J'ai trouvé cet article qui décrit le problème, mais ne semble pas me donner une solution de contournement. Je n'ai pas le contrôle du serveur Exchange, donc je ne peux pas y apporter de modifications. Y at-il quelque chose que je peux faire sur la fin C#? J'ai essayé à l'aide de courts les noms de fichiers et l'encodage HTML pour le corps mais aucun n'a fait de différence.

Mon code d'envoi de courrier est simplement ceci:

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.

87
demandé sur davmos 2010-05-13 14:16:10

8 réponses

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);                
}
77
répondu Jon 2014-02-25 14:38:40

Code Simple pour envoyer un e-mail avec 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("your mail@gmail.com");
    mail.To.Add("to_mail@gmail.com");
    mail.Subject = "Test Mail - 1";
    mail.Body = "mail with attachment";

    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("your mail@gmail.com", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}
75
répondu Ranadheer Reddy 2017-03-27 15:27:15

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

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

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

    string from = "myemail@gmail.com";  
    string to = "reciever@gmail.com";  
    MailMessage msg = new MailMessage(from, to);  
    msg.Subject = "Enter the subject here";  
    msg.Body = "The message goes here.";
    msg.Attachments.Add(new Attachment("D:\\myfile.txt"));
    mailServer.Send(msg);  
}  
catch (Exception ex)  
{  
    Console.WriteLine("Unable to send email. Error : " + ex);  
}

Lire la suite envoi d'e-mails avec pièce jointe en C #

6
répondu Pankaj Prakash 2015-10-26 14:02:06

Fin de la solution de Ranadheer, en utilisant Serveur.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);
4
répondu Nuno Ribeiro 2014-05-21 13:51:57
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("mail send");
    }
    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);
}
1
répondu Khang Pham 2016-04-24 11:04:31

Essayez ceci:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}
0
répondu Ashar Kashif 2014-12-29 15:51:55

Bonjour les frères, j'ai fait un code court pour le faire que je voudrais 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} send canceled.", 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("your message is sended", "Message", MessageBoxButtons.OK, MessageBoxIcon.Information);
}

}

Dans votre bouton Faire des choses comme ça
vous pouvez ajouter des filtres jpg ou pdf et plus encore .. c'est juste un exemple

using (OpenFileDialog attachement = new OpenFileDialog()
{
Filter = "Exel Client|*.png",
ValidateNames = true
})
{
if (attachement.ShowDialog() == DialogResult.OK)
{
Send("yourmail@gmail.com", "gmail_password", "tomail@gmail.com", "just smile ", "mail with attachement", "smtp.gmail.com", 587, attachement.FileName);

}
}

Votez-le s'il est utile de donner un commentaire merci

0
répondu elaz 2016-12-13 09:54:45

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

A L'origine, J'ai essayé D'utiliser EASendMail du gestionnaire de paquets nugent, seulement pour réaliser que c'est une version payante avec un essai de 30 jours. Ne pas la taille de votre temps avec elle à moins que vous prévoyez de l'acheter. J'ai remarqué que le programme a couru beaucoup plus vite en utilisant EASendMail, mais pour moi, libre forgé rapidement.

Juste mes 2 cents.

0
répondu Aubrey Love 2018-04-27 16:16:28