如何在Asp.net中打开带预先填充附件的默认邮件客户端

我正在尝试在Asp.net中打开带预先填充附件的默认邮件客户端 。

如果我在本地服务器上尝试它,它工作正常,但当部署到服务器时,它不再工作。

这是我到目前为止所做的:

public void SendEmail() { try { int count = GridViewDocuments.Rows.Count; Outlook.Application oApp = new Outlook.Application(); Outlook._MailItem oMailItem = (Outlook._MailItem)oApp.CreateItem(Outlook.OlItemType.olMailItem); if (count > 0) { foreach (GridViewRow gr in GridViewDocuments.Rows) { CheckBox chckEmail = (CheckBox)gr.FindControl("chckEmail"); Label lblDocumentId = (Label)gr.FindControl("lblDocumentId"); if (chckEmail.Checked == true) { string documentId = lblDocumentId.Text; string DocumentTile = ""; int DocumentId = 0; if (documentId != "") { DocumentId = Convert.ToInt32(documentId); } DocumentTile = GridViewDocuments.Rows[gr.RowIndex].Cells[1].Text; EmailLogs(DocumentId, DocumentTile); string filepath = GetDocumentByReceivingInquiryIdandReceivingInquiryForm(DocumentId); //OpenFileDialog attachment = new OpenFileDialog(); if (filepath.Length > 0) { oMailItem.Attachments.Add(Server.MapPath(filepath), Outlook.OlAttachmentType.olByValue, 1); } filepath = ""; } } } oMailItem.To = toEmail; oMailItem.Subject = Subject; InserLog("Sending Email By Sending Inquriy Workspace", SendingInqId.ToString()); } catch (Exception ex) { } } 

使用Williwyg关于这个问题的答案,我想知道它是否可以在asp.net中运行。 经过一些修改后,它可以工作。 此代码段将创建一个包含附件的电子邮件,将其转换为eml文件并将其发送到客户端。

 using System.Web; using System.Text; using System.IO; using System.Net.Mail; using System.Reflection; protected void Button1_Click(object sender, EventArgs e) { //create an email MailMessage message = new MailMessage(); message.From = new MailAddress("your@email.com", "MyCompany"); message.Subject = "Email subject goes here"; message.IsBodyHtml = true; message.Body = "HTML formatted email body."; //add the attachment message.Attachments.Add(new Attachment(Server.MapPath("test.pdf"))); //get the message as byte array byte[] bin = getEmailAsEML(message); //send the email to the client as eml Response.ClearHeaders(); Response.Clear(); Response.Buffer = true; Response.ContentType = "message/rfc822"; Response.AddHeader("content-length", bin.Length.ToString()); Response.AddHeader("content-disposition", "attachment; filename=\"email.eml\""); Response.OutputStream.Write(bin, 0, bin.Length); Response.Flush(); HttpContext.Current.ApplicationInstance.CompleteRequest(); } public byte[] getEmailAsEML(MailMessage message) { using (MemoryStream ms = new MemoryStream()) { var binaryWriter = new BinaryWriter(ms); //Write the Unsent header to the file so the mail client knows this mail must be presented in "New message" mode binaryWriter.Write(Encoding.UTF8.GetBytes("X-Unsent: 1" + Environment.NewLine)); var assembly = typeof(SmtpClient).Assembly; var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); // Get reflection info for MailWriter contructor var mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null); // Construct MailWriter object with our FileStream var mailWriter = mailWriterContructor.Invoke(new object[] { ms }); // Get reflection info for Send() method on MailMessage var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic); sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { mailWriter, true, true }, null); // Finally get reflection info for Close() method on our MailWriter var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic); // Call close method closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); return ms.ToArray(); } }