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

我有一个 C # 应用程序,它使用 SMTP 通过 Exchange2007服务器发送 Excel 电子表格报告。对于 Outlook 用户来说,这些附件很好,但是对于雷鸟和黑莓用户来说,这些附件已经被重新命名为“ Part 1.2”。

I found this 文章 which describes the problem, but doesn't seem to give me a workaround. I don't have control of the Exchange server so can't make changes there. Is there anything I can do on the C# end? I have tried using short filenames and HTML encoding for the body but neither made a difference.

我的邮件发送代码很简单:

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

谢谢你的帮助。

362019 次浏览

显式填充 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);
}

顺便说一句,对于 Gmail,你可能会有一些 ssl 安全甚至端口的例外!

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

发送附件电子邮件的简单代码。

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


}

完成 Ranadheer 的解决方案,使用 Server.MapPath定位文件

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

试试这个:

private void btnAtt_Click(object sender, EventArgs e) {


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


MyMsg.Attachments.Add(myFile);




}

下面是一个简单的附件邮件发送代码

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#

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

我已经做了一个简短的代码来做到这一点,我想与你分享它。

这里是主要代码:

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


}
}

我尝试了 Ranadheer Reddy (上图)提供的代码,效果非常好。如果您使用的公司计算机有一个受限制的服务器,您可能需要更改 SMTP 端口为25,并留下您的用户名和密码空白,因为他们将自动填写您的管理员。

最初,我尝试使用来自 Nugent 软件包管理器的 EASendMail,结果意识到这是一个30天试用期的付费版本。除非你打算买它,否则不要浪费你的时间。我注意到使用 EASendMail 的程序运行速度要快得多,但对我来说,免费更快。

只有我的两分钱。

使用此方法它在您的电子邮件服务它可以附加任何电子邮件主体和附件到微软的展望

使用 Outlook = Microsoft。办公室。互联系统。Outlook;//如果以后要使用构建代理,请从本地或 nuget 引用 Microsoft.Office.Interop.Outlook

 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."
};
}