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

2023-11-30

我正在尝试打开默认邮件客户端带有 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("[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();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Asp.net 中打开带有预填充附件的默认邮件客户端 的相关文章

  • 为 Visual Studio 2013 编译 Tesseract

    我正在尝试使用tesseract在 Visual Studio 2013 中 我在链接器 gt 输入 不是 libtesseract302 static lib 中使用 libtesseract302 lib 一切都正常 并且已编译并运行
  • 互斥体实现可以互换(独立于线程实现)

    所有互斥体实现最终都会调用相同的基本系统 硬件调用吗 这意味着它们可以互换吗 具体来说 如果我使用 gnu parallel算法 使用openmp 并且我想让他们称之为线程安全的类我可以使用boost mutex用于锁定 或者我必须编写自己
  • XamlReader.Load 在后台线程中。是否可以?

    WPF 应用程序具有从单独的文件加载用户控件的操作 使用XamlReader Load method StreamReader mysr new StreamReader pathToFile DependencyObject rootOb
  • 如何从 .resx 文件条目获取注释

    资源文件中的字符串有名称 值和注释 The ResXResourceReader类让我可以访问名称和值 有办法看评论吗 你应该能够得到Comment via ResXDataNode class http msdn microsoft co
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 当下拉列表内部触发选定索引更改事件时,引导模式关闭

    我在 Bootstrap 模式中有一个 ASP NET 图表 一切都工作正常 直到我在里面添加了一个下拉列表 每次我在下拉列表中选择一个新项目时 所选项目更改事件都会触发 并且如果事件内没有代码 则 Boostrap 模式会关闭 这是模式引
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 使用 JNI 从 Java 代码中检索 String 值的内存泄漏

    我使用 GetStringUTFChars 从使用 JNI 的 java 代码中检索字符串的值 并使用 ReleaseStringUTFChars 释放该字符串 当代码在 JRE 1 4 上运行时 不会出现内存泄漏 但如果相同的代码在 JR
  • 未定义的行为或误报

    我 基本上 在野外遇到过以下情况 x x 5 显然 它可以在早期版本的 gcc 下编译干净 在 gcc 4 5 1 下生成警告 据我所知 警告是由 Wsequence point 生成的 所以我的问题是 这是否违反了标准中关于在序列点之间操
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • 无需安装即可部署 Expression Encoder SDK

    我试图在使用 Microsoft Expression Encoder 3 SDK 时证明一个概念 我正在尝试将 SDK 部署到我的托管 Web 服务器 以了解更多关于它是否有效以及还需要安装什么的信息 我无法在服务器上进行任何操作 以下是
  • 使用 Moq 使用内部构造函数模拟类型

    我正在尝试模拟 Microsoft Sync Framework 中的一个类 它只有一个内部构造函数 当我尝试以下操作时 var fullEnumerationContextMock new Mock
  • 私有模板函数

    我有一堂课 C h class C private template
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 英特尔 Pin 与 C++14

    问题 我有一些关于在 C 14 或其他 C 版本中使用英特尔 Pin 的问题 使用较新版本从较旧的 C 编译代码很少会出现任何问题 但由于 Intel Pin 是操作指令级别的 如果我使用 C 11 或 C 14 编译它 是否会出现任何不良
  • Linq-to-entities,在一个查询中获取结果+行数

    我已经看到了有关此事的多个问题 但它们已经有 2 年 或更长 的历史了 所以我想知道这方面是否有任何变化 基本思想是填充网格视图并创建自定义分页 所以 我还需要结果和行数 在 SQL 中 这将类似于 SELECT COUNT id Id N
  • 当另一个线程可能设置共享布尔标志(最多一次)时,是否可以读取共享布尔标志而不锁定它?

    我希望我的线程能够更优雅地关闭 因此我尝试实现一个简单的信号机制 我不认为我想要一个完全事件驱动的线程 所以我有一个工作人员有一种方法可以使用关键部分优雅地停止它Monitor 相当于C lock我相信 绘图线程 h class Drawi
  • 如何正确使用 std::condition_variable?

    我很困惑conditions variables以及如何 安全 使用它们 在我的应用程序中 我有一个创建 gui 线程的类 但是当 gui 是由 gui 线程构造时 主线程需要等待 情况与下面的函数相同 主线程创建互斥体 锁和conditi

随机推荐