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

时间:2017-08-10 07:22:04

标签: c# asp.net

我正在尝试在Asp.net中使用预先填充的附件打开default Mail Client

如果我在本地服务器上尝试此操作它可以正常工作但是当部署到服务器时它不再工作了。

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

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

        }
    }

1 个答案:

答案 0 :(得分:0)

使用Williwyg在this question上的回答,我想知道它是否可以在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><head></head><body><font size=\"3\" color=\"#ff0000\">HTML formatted email body.</body></html>";

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