How to open default Mail Client with prepopulated

2020-04-22 17:00发布

问题:

I'm trying to to open the default Mail Client with prepopulated attachment in 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)
        {

        }
    }

回答1:

Using the answer from Williwyg on this question, I was wondering if it could work in 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.

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


标签: c# asp.net