Gửi email có tệp đính kèm từ C #, tệp đính kèm đến như Phần 1.2 trong Thunderbird


113

Tôi có một ứng dụng C # gửi báo cáo bảng tính Excel qua máy chủ Exchange 2007 sử dụng SMTP. Những điều này đến với người dùng Outlook, nhưng đối với người dùng Thunderbird và Blackberry, các tệp đính kèm đã được đổi tên thành "Phần 1.2".

Tôi đã tìm thấy bài viết này mô tả sự cố, nhưng dường như không cung cấp cho tôi cách giải quyết. Tôi không có quyền kiểm soát máy chủ Exchange nên không thể thực hiện thay đổi ở đó. Tôi có thể làm gì ở đầu C # không? Tôi đã thử sử dụng tên tệp ngắn và mã hóa HTML cho nội dung nhưng không tạo ra sự khác biệt.

Mã gửi thư của tôi chỉ đơn giản là:

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

Cảm ơn vì bất kì sự giúp đỡ.


Bạn đã cố gắng xác định / thay đổi thuộc Attachment.Nametính chưa?
Alex

Không, tôi chưa - "Nhận hoặc đặt giá trị tên loại nội dung MIME", bạn có gợi ý về giá trị nào để thử không? Cảm ơn.
Jon

Các Nameđược hiển thị như tên của tập tin đính kèm khi email với tập tin đính kèm được nhận. Vì vậy, bạn có thể thử bất kỳ giá trị nào.
Alex,

Câu trả lời:


115

Mã đơn giản để gửi email với tệp đính kèm.

nguồn: 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
Bạn nên quấn MailMessage và SmtpClient với việc sử dụng báo cáo để đảm bảo chúng được xử lý một cách chính xác
Andrew

1
@Andrew - làm cách nào để làm điều đó?
Steam

Tôi đã thử mã này và gặp lỗi được hiển thị trong bài đăng này - stackoverflow.com/questions/20845469/…
Steam

1
@Steam bạn có thể làm như thế nàyusing(SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com")) { //code goes here using(MailMessage mail = new MailMessage()){ //code goes here } }
Shamseer K

92

Việc điền rõ ràng vào các trường ContentDisposition đã thực hiện được mẹo.

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 , trong trường hợp của Gmail, bạn có thể có một số ngoại lệ về cổng ssl secure hoặc thậm chí!

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

2
Tại sao bạn không sử dụng một FileInfođối tượng để có được CreationTime, LastWriteTimeLastAccessTimetính chất? LengthDù sao thì bạn cũng đang tạo một cái để lấy tài sản.
sampathsris

1
Đừng quên tệp đính kèm.Dispose () nếu không tệp này vẫn bị khóa và bạn sẽ không thể ghi dữ liệu trên đó.
Pau Dominguez

7

Đây là một mã gửi thư đơn giản với tệp đính kèm

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

Đọc thêm Gửi email có tệp đính kèm trong C #


4

Hoàn thành giải pháp của Ranadheer, sử dụng Server.MapPath để định vị tệp

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

Nguồn Server.MapPathgốc từ đâu và khi nào nên sử dụng?
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

Tôi đã tạo một đoạn mã ngắn để làm điều đó và tôi muốn chia sẻ nó với bạn.

Đây là mã chính:

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

}

Trong nút của bạn, làm những thứ như thế này,
bạn có thể thêm tệp jpg hoặc pdf của mình và hơn thế nữa .. đây chỉ là một ví dụ

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

Thử cái này:

private void btnAtt_Click(object sender, EventArgs e) {

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

    MyMsg.Attachments.Add(myFile);


}

0

Tôi đã thử mã do Ranadheer Reddy cung cấp (ở trên) và nó hoạt động tốt. Nếu bạn đang sử dụng máy tính của công ty có máy chủ bị hạn chế, bạn có thể cần phải thay đổi cổng SMTP thành 25 và để trống tên người dùng và mật khẩu của bạn vì chúng sẽ được quản trị viên của bạn tự động điền.

Ban đầu, tôi đã thử sử dụng EASendMail từ trình quản lý gói nugent, chỉ để nhận ra rằng đó là phiên bản trả phí cho bản dùng thử 30 ngày. Đừng thắt chặt thời gian của bạn với nó trừ khi bạn có kế hoạch mua nó. Tôi nhận thấy chương trình chạy nhanh hơn nhiều khi sử dụng EASendMail, nhưng đối với tôi, miễn phí nhanh hơn hẳn.

Chỉ đáng giá 2 xu của tôi.


0

Sử dụng phương pháp này nó trong dịch vụ email của bạn, nó có thể đính kèm bất kỳ nội dung email và tệp đính kèm nào vào Microsoft outlook

sử dụng Outlook = Microsoft.Office.Interop.Outlook; // Tham khảo Microsoft.Office.Interop.Outlook từ local hoặc nuget nếu sau này bạn sẽ sử dụng build agent

 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."
                    };
                }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.