首页 文章

从C#发送附带附件的电子邮件,附件在Thunderbird中作为第1.2部分到达

提问于
浏览
96

我有一个C#应用程序,它使用SMTP通过Exchange 2007服务器通过电子邮件发送Excel电子表格报告 . 这些适用于Outlook用户,但对于Thunderbird和Blackberry用户,附件已重命名为“第1.2部分” .

我发现这个article描述了这个问题,但是没有控制Exchange服务器,因此无法在那里进行更改 . 我能在C#端做什么吗?我尝试过对身体使用短文件名和HTML编码,但两者都没有区别 .

我的邮件发送代码就是这样:

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

谢谢你的帮助 .

8 回答

  • 84

    使用附件发送电子邮件的简单代码 .

    来源: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);
    
    }
    
  • 1

    明确填写ContentDisposition字段就可以了 .

    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 ,如果是Gmail,您可能会遇到一些关于ssl secure甚至端口的例外情况!

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

    这是一个带附件的简单邮件发送代码

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

    阅读更多Sending emails with attachment in C#

  • 0

    完成Ranadheer的解决方案,使用 Server.MapPath 找到该文件

    System.Net.Mail.Attachment attachment;
    attachment = New System.Net.Mail.Attachment(Server.MapPath("~/App_Data/hello.pdf"));
    mail.Attachments.Add(attachment);
    
  • 4
    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);
    }
    
  • 0

    试试这个:

    private void btnAtt_Click(object sender, EventArgs e) {
    
        openFileDialog1.ShowDialog();
        Attachment myFile = new Attachment(openFileDialog1.FileName);
    
        MyMsg.Attachments.Add(myFile);
    
    
    }
    
  • 0

    我尝试了Ranadheer Reddy(上图)提供的代码,效果很好 . 如果您使用的是具有受限服务器的公司计算机,则可能需要将SMTP端口更改为25并将用户名和密码留空,因为它们将由管理员自动填写 .

    最初,我尝试使用来自nugent包管理器的EASendMail,只是意识到它是30天试用版的付费 . 除非你打算买它,否则不要浪费时间 . 我注意到程序使用EASendMail运行得更快,但对我来说,免费快速 .

    只需2美分 .

  • 82

    我已经制作了一个简短的代码,我希望与您分享 .

    这里的主要代码:

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

    在你的按钮做这样的事情,你可以添加你的jpg或pdf文件等...这只是一个例子

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

相关问题