Beim Senden von E-Mails mit Anhängen von C # kommen Anhänge als Teil 1.2 in Thunderbird an


112

Ich habe eine C # -Anwendung, die Excel-Tabellenberichte über einen Exchange 2007-Server mit SMTP per E-Mail versendet. Diese kommen für Outlook-Benutzer gut an, aber für Thunderbird- und Blackberry-Benutzer wurden die Anhänge in "Teil 1.2" umbenannt.

Ich habe diesen Artikel gefunden, der das Problem beschreibt, mir aber keine Problemumgehung zu bieten scheint. Ich habe keine Kontrolle über den Exchange-Server und kann dort keine Änderungen vornehmen. Kann ich am C # -Ende etwas tun? Ich habe versucht, kurze Dateinamen und HTML-Codierung für den Körper zu verwenden, aber keiner hat einen Unterschied gemacht.

Mein Mail-Sendecode lautet einfach:

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);
}

Vielen Dank für jede Hilfe.


Haben Sie versucht, eine Attachment.NameEigenschaft zu definieren / zu ändern ?
Alex

Nein, ich habe nicht - "Ruft den Wert des MIME-Inhaltstyps ab oder legt diesen fest". Haben Sie einen Vorschlag, welchen Wert Sie ausprobieren sollten? Vielen Dank.
Jon

Das Namewird als Name des Anhangs angezeigt, wenn die E-Mail mit dem Anhang empfangen wird. Sie können also einen beliebigen Wert ausprobieren.
Alex

Antworten:


115

Einfacher Code zum Senden von E-Mails mit Anhang.

Quelle: 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);

}

21
Sie sollten MailMessage und SmtpClient mit Anweisungen umschließen, um sicherzustellen, dass sie korrekt angeordnet sind
Andrew

1
@ Andrew - wie mache ich das?
Steam

Ich habe diesen Code ausprobiert und den in diesem Beitrag angezeigten
Steam

1
@Steam können Sie so tunusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
Shamseer K

90

Das explizite Ausfüllen der ContentDisposition-Felder hat den Trick getan.

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);                
}

Übrigens , im Fall von Google Mail können Sie einige Ausnahmen über SSL Secure oder sogar Port haben!

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

2
Warum würden Sie nicht verwenden FileInfoObjekt zu erhalten CreationTime, LastWriteTimeund LastAccessTimeEigenschaften? Sie erstellen eine, um die LengthImmobilie trotzdem zu erhalten.
Sampathsris

1
Vergessen Sie nicht den Anhang. Dispose () oder diese Datei bleibt gesperrt und Sie können keine Daten darauf schreiben.
Pau Dominguez

7

Hier ist ein einfacher Mail-Sendecode mit Anhang

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);  
}

Lesen Sie mehr Senden von E-Mails mit Anhang in C #


4

Vervollständigen der Ranadheer-Lösung mithilfe von Server.MapPath zum Auffinden der Datei

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

Woher kommt Server.MapPathes und wann sollte es verwendet werden?
Kimmax

1
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

Ich habe dafür einen kurzen Code erstellt und möchte ihn mit Ihnen teilen.

Hier der Hauptcode:

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);
  }

}

In Ihrer Schaltfläche können Sie solche
JPG- oder PDF-Dateien und mehr hinzufügen. Dies ist nur ein Beispiel

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);

}
}

0

Versuche dies:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}

0

Ich habe den von Ranadheer Reddy (oben) bereitgestellten Code ausprobiert und er hat großartig funktioniert. Wenn Sie einen Firmencomputer mit einem eingeschränkten Server verwenden, müssen Sie möglicherweise den SMTP-Port auf 25 ändern und Ihren Benutzernamen und Ihr Kennwort leer lassen, da diese automatisch von Ihrem Administrator ausgefüllt werden.

Ursprünglich habe ich versucht, EASendMail vom nugent-Paketmanager zu verwenden, nur um festzustellen, dass es sich um eine kostenpflichtige Version mit 30-Tage-Testversion handelt. Lassen Sie Ihre Zeit nicht hinter sich, es sei denn, Sie planen, es zu kaufen. Ich bemerkte, dass das Programm mit EASendMail viel schneller lief, aber für mich trumpfte kostenlos schnell.

Nur meine 2 Cent wert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.