2016-04-19 16 views
5

Tôi có một yêu cầu rất cụ thể. Trong ứng dụng web của tôi, tôi phải tạo ra một hóa đơn pdf từ các giá trị cơ sở dữ liệu, và một cơ thể email. Tôi có thể dễ dàng gửi điều này bằng cách sử dụng SMTP hoạt động hoàn hảo.Đính kèm pdf được tạo tự động vào email trong ứng dụng asp.net

Nhưng, vấn đề là chúng tôi không thể dựa vào hệ thống để luôn hoàn hảo và đây là một hóa đơn. Vì vậy, chúng ta cần mở ứng dụng thư mặc định thay vì sử dụng SMTP. Ngay bây giờ, tôi có mã sau đây

//Code to create the script for email 
string emailJS = ""; 
emailJS += "window.open('mailto:[email protected]?body=Test Mail" + "&attachment=" + emailAttachment + "');"; 
//Register the script for post back 
ClientScript.RegisterStartupScript(this.GetType(), "mailTo", emailJS, true); 

Điều này mở email hoàn toàn, nhưng không có tệp đính kèm nào hoạt động. Đường dẫn được cho là /Web/Temp/123.pdf.

Nếu tôi sử dụng cùng một đường dẫn như url bình thường như dưới đây, nó sẽ mở tệp trong cửa sổ mới chính xác.

ClientScript.RegisterStartupScript(this.GetType(), "newWindow", "window.open('/Web/Temp/123.pdf');", true); 

Vì vậy, tệp rõ ràng tồn tại, nhưng nó tồn tại trên máy chủ. Outlook mặt khác mở trên máy khách. Vì vậy, tôi không thể sử dụng đường dẫn được xác định đầy đủ như C:\Web\Temp\123.pdf. Nếu tôi thử điều đó, nó sẽ cố gắng tìm tệp trên máy khách, nơi thư mục có thể không tồn tại.

Tôi đang cố gắng tìm ra những gì tôi có thể làm ở đây. Nếu có một phương pháp khác tôi nên thử.

P.S. Không, tôi không thể gửi email trực tiếp. Điều đó sẽ gây ra nhiều vấn đề hơn trong tương lai cho tôi.

Chỉnh sửa: Tôi cũng tìm thấy một vấn đề lạ. Nếu tôi thêm dấu ngoặc kép vào đường dẫn tệp trong tệp đính kèm, \ được thêm tự động. @"&attachment=""" + Server.MapPath(emailAttachment) + @"""');" cho tôi kết quả là &attachment=\"C:\Web\Temp\123.pdf\".

Tôi đang cố gắng thoát khỏi dấu ngoặc kép đó và bằng cách nào đó nó thêm dấu gạch chéo. Tôi biết đây là một vấn đề hoàn toàn khác, nhưng tôi nên đề cập đến ở đây, thay vì tạo ra một câu hỏi mới.

Chỉnh sửa: Tôi đã thử một đường dẫn cố định trên máy chủ cục bộ. Vì vậy, về cơ bản tôi đang thử nghiệm ứng dụng trên cùng một máy nơi tệp được lưu trữ. vẫn không có chấp trước.

string emailJS = ""; 

emailJS += @"window.open('mailto:[email protected]?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); 

Đã cập nhật đường dẫn để đảm bảo nó phù hợp. Bây giờ, nó chỉ ném lỗi nói rằng command line argument not valid.

Chỉnh sửa:

Tôi có thể thử phương pháp nào khác không? Tôi có đường dẫn tệp ở phía máy chủ. Có lẽ tôi có thể tải tập tin tự động về một số thư mục mặc định trên máy khách và mở từ đó? Điều đó có thể không?

Chỉnh sửa: Tôi đã thử một tùy chọn khác.

emailJS += @"mailto:[email protected]?body=Test Mail" + @"&attachment="; 
emailJS += @"\\localhost\CSMSWeb\Temp\635966781817446275.Pdf"; 
//emailJS += Server.MapPath(emailAttachment) + @"');"; 
Process.Start(emailJS); 

Dòng Process.Start hoạt động nhưng không có gì cả. Không có quy trình nào bắt đầu, cũng không có lỗi.

Chỉnh sửa: yay. Cuối cùng, tôi đã cho phép người dùng phê duyệt bằng cách sử dụng biểu mẫu riêng để hiển thị chủ đề và nội dung, thay vì mở ứng dụng thư khách mặc định. mặc dù, tôi vẫn muốn giải quyết vấn đề này như hiện nay.

+0

Is ứng dụng interanet này bạn đang làm việc trên? Nếu vậy, nó có thể được thực hiện với một số hạn chế, nếu không nó không thể. – Andrei

+0

Có, ứng dụng mạng nội bộ. – jitendragarg

Trả lời

2

Vì vậy, vấn đề ở đây là thực tế là mailto chỉ hỗ trợ đường dẫn tệp trực tiếp cho tệp đính kèm.Đó là, đường dẫn phải là cục bộ để sử dụng máy, hoặc đường dẫn mạng nội bộ trong mạng.

Nói cách khác, đường dẫn như http://yourapp/Web/Temp/123.pdf sẽ không hoạt động và /Web/Temp/123.pdf về cơ bản giống nhau sẽ không hoạt động. Đây không phải là đường dẫn, nhưng liên kết đến các tệp phải được tải xuống và lưu trữ cục bộ trước khi chúng có thể được sử dụng dưới dạng tệp đính kèm - giao thức mailto không hỗ trợ điều đó.

Tuy nhiên, kể từ khi ứng dụng của bạn là mạng nội bộ, những gì bạn có thể làm là đảm bảo dự định người dùng có quyền truy cập vào một số mạng chia sẻ thư mục trên máy chủ của bạn, và sau đó cung cấp cho họ đường dẫn mạng đến tập tin, đó là \\theserver\files\123.pdf

+0

Vì vậy, trong trường hợp này, khi tôi đang gỡ lỗi trên máy tính của mình, '\\ localhost \ web \ temp \ 123.pdf' hoặc' C: \ web \ temp.pdf'. Điều gì sẽ là cần thiết? – jitendragarg

+0

Không có. Trước tiên, bạn cần phải tạo một thư mục chia sẻ, và trong quá trình này các cửa sổ sẽ cho bạn thấy đường dẫn mạng đến nó. Đó là cái bạn cần. Một lần nữa, hãy chắc chắn rằng khách hàng của bạn có quyền truy cập các tệp trong thư mục này – Andrei

+0

Ok, chỉ để thử nghiệm, đây là những gì tôi đã làm. Một con đường cố định trực tiếp. Ngay cả khi thất bại, trong khi gỡ lỗi trên máy địa phương. Kiểm tra chỉnh sửa được đề cập và xem liệu bạn có thể tìm ra vấn đề không. Có lẽ tôi đang thiếu cái gì khác ở đây. Ý tôi là, trong trường hợp này, máy chủ giống như máy khách, vì vậy triển vọng có quyền truy cập trực tiếp. Tôi chắc chắn để thoát khỏi đường dẫn tập tin đúng cách. Vẫn còn vấn đề tương tự. : / – jitendragarg

Các vấn đề liên quan