Отправка электронной почты с вложениями из C#, вложения поступают как часть 1.2 в Thunderbird
У меня есть приложение C#, которое отправляет электронные сообщения из электронных таблиц Excel через сервер Exchange 2007 с помощью SMTP. Они прекрасно подходят для пользователей Outlook, но для пользователей Thunderbird и Blackberry вложения были переименованы в "часть 1.2".
Я нашел это статьи который описывает проблему, но, похоже, не дает мне обходного пути. У меня нет контроля над сервером 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 ответов:
явное заполнение полей 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); }
простой код для отправки электронной почты с приложением.
источник: 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); }
вот простой почтовый код отправки с вложением
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#
завершение решения Ranadheer, используя сервер.MapPath выберите файл
System.Net.Mail.Attachment attachment; attachment = New System.Net.Mail.Attachment(Server.MapPath("~/App_Data/hello.pdf")); mail.Attachments.Add(attachment);
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); }
попробуйте это:
private void btnAtt_Click(object sender, EventArgs e) { openFileDialog1.ShowDialog(); Attachment myFile = new Attachment(openFileDialog1.FileName); MyMsg.Attachments.Add(myFile); }
привет братья я сделал короткий код для этого, я хотел бы поделиться с вами
вот основной код
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 и оставить ваше имя пользователя и пароль пустыми, так как они будут автоматически заполняться вашим администратором.
Первоначально я попытался использовать EASendMail из менеджера пакетов nugent, только чтобы понять, что это плата за версию с 30-дневной пробной версией. Не тратьте свое время на это, если вы не планируете его покупать. Я заметил программа работала намного быстрее с помощью EASendMail, но для меня free trumped быстро.
только мои 2 цента стоит.