我有一个非常具体的要求.在我的网络应用程序中,我必须从数据库值和电子邮件正文生成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);
Run Code Online (Sandbox Code Playgroud)
这将完美地打开电子邮件,但没有附件正常工作.路径应该是/Web/Temp/123.pdf.
如果我使用与下面的普通网址相同的路径,它会在新窗口中正确打开文件.
ClientScript.RegisterStartupScript(this.GetType(), "newWindow", "window.open('/Web/Temp/123.pdf');", true);
Run Code Online (Sandbox Code Playgroud)
因此,显然文件存在,但它存在于服务器上.另一方面,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);
Run Code Online (Sandbox Code Playgroud)
更新了路径以确保其正确无误.现在,它只是抛出错误说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);
Run Code Online (Sandbox Code Playgroud)
这Process.Start条生产线有效,但它什么都不做.没有进程启动,也没有错误.
编辑:耶.我终于让用户批准使用单独的表单来显示主题和正文,而不是打开默认的邮件客户端.虽然,我仍然希望按原样解决这个问题.
因此,这里的问题是mailto仅支持附件的直接文件路径。也就是说,路径必须是本地才能使用机器,或者是网络内的 Intranet 路径。
换句话说,路径相似http://yourapp/Web/Temp/123.pdf是行不通的,/Web/Temp/123.pdf本质上相同也是行不通的。这些不是路径,而是指向文件的链接,这些文件必须下载并存储在本地才能用作附件 - mailto 协议对此不支持。
但是,由于您的应用程序是 Intranet,您可以做的是确保目标用户可以访问您服务器上的某些网络共享文件夹,然后向他们提供该文件的网络路径,即\\theserver\files\123.pdf