将自动生成的pdf附加到asp.net应用程序中的电子邮件中
我有一个非常具体的要求。 在我的网络应用程序中,我必须从数据库值和电子邮件正文生成pdf发票。 我可以使用SMTP轻松发送它,这是完美的。
但是,问题是我们不能依靠系统来永远完美,而这是一张发票。 因此,我们需要打开默认邮件客户端而不是使用SMTP。 现在,我有以下代码
//Code to create the script for email string emailJS = ""; emailJS += "window.open('mailto:testmail@gmail.com?body=Test Mail" + "&attachment=" + emailAttachment + "');"; //Register the script for post back ClientScript.RegisterStartupScript(this.GetType(), "mailTo", emailJS, true);
这将完美地打开电子邮件,但没有附件正常工作。 路径应该是/Web/Temp/123.pdf
。
如果我使用与下面的普通url相同的路径,它会在新窗口中正确打开文件。
ClientScript.RegisterStartupScript(this.GetType(), "newWindow", "window.open('/Web/Temp/123.pdf');", true);
因此,显然文件存在,但它存在于服务器上。 另一方面,Outlook在客户端计算机上打开。 所以,我不能使用完整的路径,如C:\Web\Temp\123.pdf
。 如果我尝试这样做,它将尝试在客户端计算机上找到该文件,该文件夹本身可能不存在。
我想知道我能在这做什么。 如果有另一种方法我应该尝试。
PS不,我不能直接发送电子邮件。 这对我来说将来会造成更大的问题。
编辑:我也发现了一个奇怪的问题。 如果我在附件中的文件路径中添加双引号,则会自动添加\。 @"&attachment=""" + Server.MapPath(emailAttachment) + @"""');"
输出为&attachment=\"C:\Web\Temp\123.pdf\"
。
我试图逃避那个双引号,并以某种方式增加了斜线。 我知道这是一个完全不同的问题,但我想在这里应该提一下,而不是创建一个新问题。
编辑:我尝试了localhost上的固定路径。 所以,我基本上是在存储文件的同一台机器上测试应用程序。 仍然没有任何依恋。
string emailJS = ""; emailJS += @"window.open('mailto:jitendragarg@gmail.com?body=Test Mail" + emailAttachment + @"&attachment="; emailJS += @"""D:\Dev\CSMS\CSMSWeb\Temp\635966781817446275.Pdf""');"; //emailJS += Server.MapPath(emailAttachment) + @"');"; //Register the script for post back ClientScript.RegisterStartupScript(this.GetType(), "mailTo", emailJS, true);
更新了路径以确保其正确无误。 现在,它只是抛出错误说command line argument not valid
。
编辑:
我还能尝试其他方法吗? 我在服务器端有文件路径。 也许我可以自动将文件下载到客户端计算机上的某个默认文件夹并从那里打开? 那可能吗?
编辑:我尝试了另外一个选项。
emailJS += @"mailto:testmail@gmail.com?body=Test Mail" + @"&attachment="; emailJS += @"\\localhost\CSMSWeb\Temp\635966781817446275.Pdf"; //emailJS += Server.MapPath(emailAttachment) + @"');"; Process.Start(emailJS);
Process.Start
行可以工作,但它什么都不做。 没有进程启动,也没有错误。
编辑:耶。 我终于让用户批准使用单独的表单来显示主题和正文,而不是打开默认的邮件客户端。 虽然,我仍然希望按原样解决这个问题。
所以,这里的问题是mailto
只支持附件的直接文件路径。 也就是说,路径必须是本地的才能使用机器或网络内的内部网路径。
换句话说,像http://yourapp/Web/Temp/123.pdf
这样的路径不起作用,而/Web/Temp/123.pdf
基本相同也不起作用。 这些不是路径,而是指向必须在本地下载和存储的文件的链接,然后才能将它们用作附件 – mailto协议不支持这些。
但是,由于您的应用程序是Intranet,您可以做的是确保目标用户可以访问服务器上的某个网络共享文件夹,然后为他们提供文件的网络路径,即\\theserver\files\123.pdf