简体   繁体   English

如何在Asp.net中打开带有预填充附件的默认Mail Client

[英]How to open default Mail Client with prepopulated attachment in Asp.net

I'm trying to to open the default Mail Client with prepopulated attachment in Asp.net. 我试图在Asp.net中打开带有预填充附件的默认邮件客户端

If i try this on a local server it's working fine but when deployed to the server it's not working anymore. 如果我在本地服务器上尝试此方法,则工作正常,但部署到该服务器后,它将不再工作。

This is what i've done so far: 到目前为止,这是我所做的:

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

        }
    }

Using the answer from Williwyg on this question , I was wondering if it could work in asp.net. 使用Williwyg 对此问题的回答 ,我想知道它是否可以在asp.net中工作。 After some modification it can work. 经过一些修改,它可以工作。 This snippet will create an email with attachment, convert it to an eml file and send it to the client. 该代码片段将创建带有附件的电子邮件,将其转换为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();
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM