2010-05-13 17 views
80

Mam aplikację C#, która wysyła e-maile z raportów arkusza Excel za pośrednictwem serwera Exchange 2007 za pomocą protokołu SMTP. Dotyczy to użytkowników programu Outlook, ale w przypadku użytkowników Thunderbird i Blackberry załączniki zostały zmienione na "Część 1.2".Wysyłanie wiadomości e-mail z załącznikami z C#, załączniki przychodzą jako część 1.2 w Thunderbirdie

Znalazłem ten article, który opisuje problem, ale nie wydaje mi się, aby dać obejście tego problemu. Nie mam kontroli nad serwerem Exchange, więc nie mogę wprowadzać w nim zmian. Czy jest coś, co mogę zrobić na końcu C#? Próbowałem używać krótkich nazw plików i kodowania HTML dla ciała, ale nie zrobiłem żadnej różnicy.

skrzynce wysyłając kod jest po prostu tak:

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

Dzięki za wszelką pomoc.

+0

Czy próbował zdefiniować/zmienić 'Attachment Właściwość .Name? – Alex

+0

Nie, nie mam - "Pobiera lub ustawia wartość nazwy typu treści MIME", czy masz sugestię co do wartości? Dzięki. – Jon

+0

"Nazwa" jest wyświetlana jako nazwa załącznika po otrzymaniu wiadomości e-mail z załącznikiem. Możesz spróbować dowolnej wartości. – Alex

Odpowiedz

71

Jawne wypełnianie pól ContentDisposition rozwiązało problem.

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

Dlaczego nie używać obiektu 'FileInfo' do pobierania właściwości' CreationTime', 'LastWriteTime' i' LastAccessTime'? Tworzysz go, aby uzyskać właściwość "Długość". – Krumia

63

Prosty kod do wysyłania wiadomości e-mail z załącznikiem.

źródło: 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 [email protected]"); 
    mail.To.Add("[email protected]"); 
    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 [email protected]", "your password"); 
    SmtpServer.EnableSsl = true; 

    SmtpServer.Send(mail); 

} 
+10

Powinieneś zawinąć MailMessage i SmtpClient za pomocą instrukcji using, aby upewnić się, że są one prawidłowo umieszczone – Andrew

+1

@Andrew - jak to zrobić? – Steam

+0

Próbowałem tego kodu i dostałem błąd pokazany w tym poście - http://stackoverflow.com/questions/20845469/finding-the-exact-cause-for--exception-system-net-sockets-socketexception – Steam

4

Kończenie rozwiązanie Ranadheer korzystając Server.MapPath, aby zlokalizować plik

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

Skąd pochodzi' Server.MapPath' i kiedy należy go użyć? – Kimmax

0

Spróbuj tego:

private void btnAtt_Click(object sender, EventArgs e) { 

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

    MyMsg.Attachments.Add(myFile); 


} 
6

Oto prosty kod do wysyłania wiadomości z załącznikiem

try 
{ 
    SmtpClient mailServer = new SmtpClient("smtp.gmail.com", 587); 
    mailServer.EnableSsl = true; 

    mailServer.Credentials = new System.Net.NetworkCredential("[email protected]", "mypassword"); 

    string from = "[email protected]"; 
    string to = "[email protected]"; 
    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); 
} 

Czytaj więcej Sending emails with attachment in C#

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

hello braci zrobiłem krótki kod za to, że chciałbym się z wami podzielić

tutaj główny kod

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

} 

w twoim guziku robić rzeczy w ten sposób
można dodać Cię filtruje JPG lub PDF i więcej .. jest to tylko przykład

using (OpenFileDialog attachement = new OpenFileDialog() 
{ 
Filter = "Exel Client|*.png", 
ValidateNames = true 
}) 
{ 
if (attachement.ShowDialog() == DialogResult.OK) 
{ 
Send("[email protected]", "gmail_password", "[email protected]", "just smile ", "mail with attachement", "smtp.gmail.com", 587, attachement.FileName); 

} 
} 

głosowanie to jeśli pomocny od dać sprzężenie zwrotne dzięki

Powiązane problemy