我有一个非常具体的要求。在我的网络应用程序中,我必须从数据库值和电子邮件正文生成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
。
如果我使用与普通网址相同的路径,则会在新窗口中正确打开文件。
ClientScript.RegisterStartupScript(this.GetType(), "newWindow", "window.open('/Web/Temp/123.pdf');", true);
因此,显然文件存在,但它存在于服务器上。另一方面,Outlook在客户端计算机上打开。所以,我不能使用完整的路径,如C:\Web\Temp\123.pdf
。如果我尝试,它将尝试在客户端计算机上找到该文件,文件夹本身可能不存在。
我想知道我能在这做什么。如果有另一种方法我应该尝试。
P.S。不,我不能直接发送电子邮件。这对我来说将来会造成很多问题。
编辑:
我还发现了一个奇怪的问题。如果我在附件中的文件路径中添加双引号,则会自动添加\。 @"&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
行有效,但它什么都不做。没有进程启动,也没有错误。
编辑: 好极了。我终于让用户批准使用单独的表单来显示主题和正文,而不是打开默认的邮件客户端。虽然,我仍然希望按原样解决这个问题。
答案 0 :(得分:2)
因此,问题在于mailto
仅支持附件的直接文件路径。也就是说,路径必须是本地的才能使用机器或网络中的内部网路径。
换句话说,http://yourapp/Web/Temp/123.pdf
之类的路径不起作用,/Web/Temp/123.pdf
基本相同也不会起作用。这些不是路径,而是链接到必须在本地下载和存储才能用作附件的文件 - mailto协议不支持。
但是,由于您的应用程序是Intranet,您可以做的是确保目标用户可以访问服务器上的某个网络共享文件夹,然后为他们提供文件的网络路径,即\\theserver\files\123.pdf
< / p>