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.

Jon
quelle
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 [email protected]");
    mail.To.Add("[email protected]");
    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 [email protected]", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}
Ranadheer Reddy
quelle
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;
Jon
quelle
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("[email protected]", "mypassword");  

    string from = "[email protected]";  
    string to = "[email protected]";  
    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 #

Pankaj Prakash
quelle
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);
Nuno Ribeiro
quelle
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);
}
Khang Pham
quelle
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("[email protected]", "gmail_password", 
       "[email protected]", "just smile ", "mail with attachement",
       "smtp.gmail.com", 587, attachement.FileName);

}
}
elaz
quelle
0

Versuche dies:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}
Ashar Kashif
quelle
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.

Aubrey Liebe
quelle