Mengirim email dengan lampiran dari C #, lampiran datang sebagai Bagian 1.2 di Thunderbird


113

Saya memiliki aplikasi C # yang mengirimkan laporan spreadsheet Excel melalui email melalui server Exchange 2007 menggunakan SMTP. Ini datang dengan baik untuk pengguna Outlook, tetapi untuk pengguna Thunderbird dan Blackberry, lampiran telah diubah namanya menjadi "Bagian 1.2".

Saya menemukan artikel ini yang menjelaskan masalah tersebut, tetapi sepertinya tidak memberi saya solusi. Saya tidak memiliki kendali atas server Exchange sehingga tidak dapat membuat perubahan di sana. Apakah ada yang bisa saya lakukan di ujung C #? Saya telah mencoba menggunakan nama file pendek dan pengkodean HTML untuk tubuh tetapi tidak ada bedanya.

Kode pengiriman email saya hanyalah ini:

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

Terima kasih atas bantuannya.


Sudahkah Anda mencoba mendefinisikan / mengubah Attachment.Nameproperti?
Alex

Tidak, saya belum - "Mendapat atau menyetel nilai nama jenis konten MIME", apakah Anda punya saran tentang nilai yang harus dicoba? Terima kasih.
Jon

The Nameditampilkan sebagai nama lampiran ketika email dengan lampiran diterima. Jadi Anda dapat mencoba nilai apa pun.
Alex

Jawaban:


115

Kode sederhana untuk mengirim email dengan lampiran.

sumber: 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
Anda harus membungkus MailMessage dan SmtpClient dengan menggunakan pernyataan untuk memastikan mereka dibuang dengan benar
Andrew

1
@ Andrew - bagaimana cara melakukannya?
Steam

Saya mencoba kode ini dan saya mendapatkan kesalahan yang ditunjukkan dalam posting ini - stackoverflow.com/questions/20845469/…
Steam

1
@Steam Anda dapat melakukan seperti iniusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
Shamer K

92

Mengisi bidang ContentDisposition secara eksplisit berhasil.

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 , dalam kasus Gmail, Anda mungkin memiliki beberapa pengecualian tentang ssl secure atau bahkan port!

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

2
Mengapa Anda tidak menggunakan FileInfoobjek untuk mendapatkan CreationTime, LastWriteTimedan LastAccessTimeproperti? Anda tetap membuatnya untuk mendapatkan Lengthproperti itu.
sampathsris

1
Jangan lupa lampiran.Dispose () atau file ini tetap terkunci dan Anda tidak dapat menulis data di dalamnya.
Pau Dominguez

7

Berikut adalah kode pengiriman email sederhana dengan lampiran

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

Baca lebih lanjut Mengirim email dengan lampiran di C #


4

Menyelesaikan solusi Ranadheer, menggunakan Server.MapPath untuk mencari file

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

Dari mana Server.MapPathasalnya dan kapan harus digunakan?
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

Saya telah membuat kode singkat untuk melakukannya dan saya ingin membagikannya dengan Anda.

Berikut kode utamanya:

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

}

Di tombol Anda, lakukan hal-hal seperti ini,
Anda dapat menambahkan file jpg atau pdf dan banyak lagi .. ini hanya sebuah contoh

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

Coba ini:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}

0

Saya mencoba kode yang disediakan oleh Ranadheer Reddy (di atas) dan berhasil dengan baik. Jika Anda menggunakan komputer perusahaan yang memiliki server terbatas, Anda mungkin perlu mengubah port SMTP ke 25 dan membiarkan nama pengguna dan kata sandi Anda kosong karena mereka akan diisi secara otomatis oleh admin Anda.

Awalnya, saya mencoba menggunakan EASendMail dari manajer paket nugent, hanya untuk menyadari bahwa ini adalah versi berbayar dengan uji coba 30 hari. Jangan mengurangi waktu Anda dengannya kecuali jika Anda berencana untuk membelinya. Saya perhatikan programnya berjalan lebih cepat menggunakan EASendMail, tetapi bagi saya, gratis mengalahkan dengan cepat.

Hanya 2 sen saya.


0

Gunakan metode ini di bawah layanan email Anda, ia dapat melampirkan badan email dan lampiran apa pun ke Microsoft Outlook

menggunakan Outlook = Microsoft.Office.Interop.Outlook; // Referensi Microsoft.Office.Interop.Outlook dari lokal atau nuget jika Anda akan menggunakan agen build nanti

 try {
                    var officeType = Type.GetTypeFromProgID("Outlook.Application");
    
                    if(officeType == null) {//outlook is not installed
                        return new PdfErrorResponse {
                            ErrorMessage = "System cant start Outlook!, make sure outlook is installed on your computer."
                        };
                    } else {
                        // Outlook is installed.    
                        // Continue your work.
                        Outlook.Application objApp = new Outlook.Application();
                        Outlook.MailItem mail = null;
                        mail = (Outlook.MailItem)objApp.CreateItem(Outlook.OlItemType.olMailItem);
                        //The CreateItem method returns an object which has to be typecast to MailItem 
                        //before using it.
                        mail.Attachments.Add(attachmentFilePath,Outlook.OlAttachmentType.olEmbeddeditem,1,$"Attachment{ordernumber}");
                        //The parameters are explained below
                        mail.To = recipientEmailAddress;
                        //mail.CC = "con@def.com";//All the mail lists have to be separated by the ';'
    
                        //To send email:
                        //mail.Send();
                        //To show email window
                        await Task.Run(() => mail.Display());
                    }
    
                } catch(System.Exception) {
                    return new PdfErrorResponse {
                        ErrorMessage = "System cant start Outlook!, make sure outlook is installed on your computer."
                    };
                }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.