2017-08-10 1 views
0

私はを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) 
     { 

     } 
    } 
+1

新しいOutlook.Application()を呼び出すと、サーバーで実行されています。そのため、ローカルで実行すると動作しますが、展開すると明らかにクライアントのマシンで実行されていません(巨大なセキュリティホールになりますが、拡張子を持たないとブラウザはそれを実行できません) – Martheen

答えて

0

this question上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("[email protected]", "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(); 
    } 
} 
関連する問題