2009-07-28 24 views
23

Obecnie używam poniższy sposób otworzyć konto e-mail programu Outlook użytkowników i wypełnić maila z odpowiednią zawartością do wysyłania:C# MailTo z załącznikiem?

public void SendSupportEmail(string emailAddress, string subject, string body) 
{ 
    Process.Start("mailto:" + emailAddress + "?subject=" + subject + "&body=" 
       + body); 
} 

chcę jednak być w stanie wypełnić e-mail z załączonym plikiem.

coś takiego:

public void SendSupportEmail(string emailAddress, string subject, string body) 
{ 
    Process.Start("mailto:" + emailAddress + "?subject=" + subject + "&body=" 
     + body + "&Attach=" 
     + @"C:\Documents and Settings\Administrator\Desktop\stuff.txt"); 
} 

Jednak to nie wydają się działać. Czy ktoś wie o sposobie, który pozwoli to zadziałać !?

Pomoc bardzo doceniam.

Pozdrawiam.

Odpowiedz

10

mailto: nie obsługuje oficjalnie załączników. Słyszałem Outlook 2003 będzie współpracować z tej składni:

<a href='mailto:[email protected]?Subject=SubjTxt&Body=Bod_Txt&Attachment=""C:\file.txt"" '> 

Lepszym sposobem obsługi to jest do wysłania wiadomości na serwerze z wykorzystaniem System.Net.Mail.Attachment.

public static void CreateMessageWithAttachment(string server) 
    { 
     // Specify the file to be attached and sent. 
     // This example assumes that a file named Data.xls exists in the 
     // current working directory. 
     string file = "data.xls"; 
     // Create a message and set up the recipients. 
     MailMessage message = new MailMessage(
      "[email protected]", 
      "[email protected]", 
      "Quarterly data report.", 
      "See the attached spreadsheet."); 

     // Create the file attachment for this e-mail message. 
     Attachment data = new Attachment(file, MediaTypeNames.Application.Octet); 
     // Add time stamp information for the file. 
     ContentDisposition disposition = data.ContentDisposition; 
     disposition.CreationDate = System.IO.File.GetCreationTime(file); 
     disposition.ModificationDate = System.IO.File.GetLastWriteTime(file); 
     disposition.ReadDate = System.IO.File.GetLastAccessTime(file); 
     // Add the file attachment to this e-mail message. 
     message.Attachments.Add(data); 

     //Send the message. 
     SmtpClient client = new SmtpClient(server); 
     // Add credentials if the SMTP server requires them. 
     client.Credentials = CredentialCache.DefaultNetworkCredentials; 

     try { 
      client.Send(message); 
     } 
     catch (Exception ex) { 
      Console.WriteLine("Exception caught in CreateMessageWithAttachment(): {0}", 
       ex.ToString());    
     } 
     data.Dispose(); 
    } 
4

Czy ta aplikacja naprawdę musi używać Outlooka? Czy istnieje powód, aby nie używać przestrzeni nazw System.Net.Mail?

Jeśli naprawdę trzeba używać programu Outlook (i nie polecam, bo wtedy jesteś opierając swoją aplikację na 3rd zależności partyjnych, które mogą zmienić) trzeba będzie zajrzeć do nazw Microsoft.Office

Zacznę tutaj: http://msdn.microsoft.com/en-us/library/microsoft.office.interop.outlook.aspx

+0

Tak, to robi ....... – Goober

47

Jeśli chcesz uzyskać dostęp do domyślnego klienta e-mail, możesz użyć MAPI32.dll (działa tylko w systemie Windows). Spójrz na poniższy owijki:

http://www.codeproject.com/KB/IP/SendFileToNET.aspx

Kod wygląda następująco:

MAPI mapi = new MAPI(); 
mapi.AddAttachment("c:\\temp\\file1.txt"); 
mapi.AddAttachment("c:\\temp\\file2.txt"); 
mapi.AddRecipientTo("[email protected]"); 
mapi.AddRecipientTo("[email protected]"); 
mapi.SendMailPopup("testing", "body text"); 

// Or if you want try and do a direct send without displaying the mail dialog 
// mapi.SendMailDirect("testing", "body text"); 
+0

Ten artykuł w kodeprojektie jest bardzo dobry. – Jeremy

+4

Ten kod jest przydatny do wysyłania załączników do domyślnego klienta poczty e-mail. Nie wszyscy korzystają z Outlooka, więc ten kod jest świetny! – Brent

+0

Ja też go użyłem, działa idealnie! :] – Eduardo

2

Spróbuj

var proc = new System.Diagnostics.Process(); 
proc.StartInfo.FileName = string.Format("\"{0}\"", Process.GetProcessesByName("OUTLOOK")[0].Modules[0].FileName); 
proc.StartInfo.Arguments = string.Format(" /c ipm.note /m {0} /a \"{1}\"", "[email protected]", @"c:\attachments\file.txt"); 
proc.Start(); 
Powiązane problemy