2011-12-19 17 views
6

Tôi đang làm việc trên một ứng dụng web sắp phát hành và hiện tôi đang cố gắng tìm ra cách tốt nhất để xử lý việc gửi email từ ứng dụng. Tôi hiểu hoàn toàn CÁCH gửi email từ ứng dụng bằng cách sử dụng các lớp MailMessage và SmtpClient, tuy nhiên câu hỏi của tôi là từ một góc độ khác. Mục đích chính của tôi trong công việc của tôi trước khi dự án này hỗ trợ các ứng dụng cũ đã được phát triển trước thời gian của tôi. Trong các ứng dụng này, khi chúng cần gửi email, chúng mã hóa cứng bất kỳ thư nào trong thư thực tế với tất cả các thẻ HTML được nhúng trực tiếp vào mã C#.Điều gì sẽ được coi là cách tốt nhất để kiến ​​trúc sư gửi email từ một ứng dụng web C#?

Ứng dụng mà tôi đang làm việc sẽ có mẫu để gửi email, như một loại vùng chứa kiểu dáng và các thông điệp khác nhau sẽ được nhúng vào phần nội dung chính của mẫu. Tôi muốn tránh hardcoding các mẫu trong ứng dụng này, vì vậy tôi đã cố gắng tìm ra cách tốt nhất để bố trí dự án của tôi. Tôi đã nghĩ đến việc sử dụng một mẫu t4, và đọc các t4 khác nhau vào ứng dụng và áp dụng một String.Format với các tham số được chỉ định để thêm tên/email vào các tin nhắn được gửi đi. Tuy nhiên, tôi không chắc chắn đây là cách tốt nhất để làm điều đó.

Ý tưởng khác của tôi là xác định một lớp cho từng loại thư, tuy nhiên điều này sẽ kết thúc việc mã hóa lại thư, như tôi đã nói tôi không muốn làm.

Câu hỏi của tôi là, bạn đã tiếp cận điều này như thế nào trong quá khứ? Điều gì làm việc, và những gì không và vì lý do gì? Tôi đã xem xét tất cả trực tuyến, nhưng một trong hai nội dung duy nhất có trên CÁCH để gửi tin nhắn, hoặc tôi đã không sử dụng đúng từ Google quyền lực.

+0

Bạn có quyền truy cập vào cơ sở dữ liệu không? Bạn có thể lưu trữ từng loại tin nhắn, người nhận, chủ đề, cơ thể, vv trong một cơ sở dữ liệu và xây dựng một thói quen bảo trì đơn giản trên đầu trang của nó.Bạn cũng có thể nhập các thẻ khác nhau bên trong nội dung email để hoạt động như trình giữ chỗ cho văn bản khác (như tên của người dùng). Tôi đã làm điều này trước và nó hoạt động khá tốt. – hawkke

+0

Ứng dụng này có một cơ sở dữ liệu, và đây là một trong những điều mà tôi đã thực sự cân nhắc thực hiện. Tôi rất lo lắng về việc làm điều này lúc đầu, vì tôi đã không chắc chắn rằng các tin nhắn nên được lưu trữ trong cơ sở dữ liệu, nhưng nó là definetly một pro rằng tin nhắn có thể được cập nhật bất cứ lúc nào. Những người nhận cũng hiện đang được lưu trữ trong cơ sở dữ liệu. Cảm ơn các đầu vào, và tôi chắc chắn sẽ xem xét nó nhiều hơn bây giờ mà tôi biết ai đó đã làm tốt nó. Tôi vẫn băn khoăn liệu có hay không có cách nào tốt hơn. – tostringtheory

+0

Bạn đã cố gắng gì cho riêng mình từ trước đến nay về mã trò chuyện mà bạn có để ai đó trực tuyến có thể xem và có thể giúp bạn ..? Phụ thuộc vào những gì bạn đang thực sự tìm kiếm để gửi email không phải là một nhiệm vụ khó khăn vì .NET cung cấp cho bạn rất nhiều tùy chọn sử dụng System.Net.Mail hoặc thông qua ứng dụng web bằng cách sử dụng System.Web.Mail có rất nhiều ví dụ trước đó bạn có thể tìm kiếm và nghiên cứu trên trang web này hoặc kiểm tra rất nhiều ví dụ tuyệt vời – MethodMan

Trả lời

2

tôi làm điều đó theo cách này:

  • Mã nó theo cách thông thường với ViewModel và Razor Template
  • Bằng cách tạo e-mail, sử dụng http://razorengine.codeplex.com/ để tải và phân tích mẫu
  • Hãy nhận biết để không sử dụng trình trợ giúp Html và Url nếu bạn muốn gửi e-mail trong một chuỗi, vì chúng dựa trên HttpContext mà bạn không có trong trường hợp đó. Xây dựng người giúp đỡ của riêng bạn nếu cần.

Ví dụ, nếu bạn có một ViewModel Car trong ứng dụng của bạn được hiển thị ở đâu đó, bạn cũng có thể sử dụng ViewModel này như @model trong một Template Razor cho e-mail.

+0

Cảm ơn bạn đã liên kết. Điều này chắc chắn là gần hơn với những gì tôi đang tìm kiếm theo cách nào đó. Tôi có đúng khi giả định rằng bạn có mẫu như một tệp riêng biệt thực sự không, hoặc bạn có đang mã hóa nó như chúng hiển thị trên trang chủ của họ không? – tostringtheory

+0

Tất nhiên không có mã hóa cứng, đối với mỗi e-mail, tôi có một tệp cshtml. Vì vậy, bạn sẽ có thể sử dụng điều này như là một bản xem trước e-mail trong ứng dụng của bạn quá. – Marc

+0

Hmmm .. Đây là một dấu cộng để có thể xem trước một tin nhắn. Tôi nghiêm túc thích ý tưởng về chức năng này. – tostringtheory

0

Tôi đã phải thực hiện việc này trong một vài trường hợp. Ban đầu tôi đã sử dụng công cụ tạo mẫu ASP.Net dựa trên bài viết trên blog của Rick Strahl. Nó hoạt động nhưng luôn luôn có một số vấn đề tôi đã đập đầu của tôi chống lại.

Tôi đã chuyển sang sử dụng công cụ mẫu NVelocity và nhận thấy đây là cách thực sự đơn giản để tạo và duy trì mẫu email. Có một số công cụ tạo mẫu khác và tôi nghi ngờ lần tới tôi có thể có một cái nhìn nghiêm túc về số Razorengine.

Mã cho việc sáp nhập các giá trị vào mẫu:

private string Merge(ManualTypeEnum manualType, Object mergeValues) 
{ 
    var body = ""; 
    var templateFile = string.Format("{0}MailTemplate.vm", manualType); 
    var velocity = new VelocityEngine(); 
    var props = new ExtendedProperties(); 
    props.AddProperty("file.resource.loader.path", Config.EmailTemplatePath); 
    velocity.Init(props); 
    var template = velocity.GetTemplate(templateFile); 
    var context = new VelocityContext(); 
    context.Put("Change", mergeValues); 
    using (var writer = new StringWriter()) 
    { 
     template.Merge(context, writer); 
     body = writer.ToString(); 
    } 
    return body; 
} 

Giá trị sáp nhập được thông qua như là một đối tượng ẩn danh, và có thể bao gồm nhiều loại hình bao gồm danh sách vv ví dụ

var emailBody = Merge(newDocument.ManualType, new 
{ 
    ManualType = newDocument.ManualType.ToString(), 
    Message = change.Message, 
    NewTitle = newDocument.Title ?? "", 
    NewVersion = newDocument.Version ?? "", 
    Contact = From, 
    Changes = change.ToList(), 
}); 
+0

Hmm .. Có vẻ như tôi có thể làm điều này với một tệp, nhưng tôi có thể xem xét việc kết hợp công cụ Dao cạo với cơ sở dữ liệu, để lấy thông tin từ một datarow, sau đó chuyển đổi nó. Điều gì về tách mối quan tâm? Bạn có nghĩ rằng điều này sẽ trộn chúng quá nhiều? – tostringtheory

+0

Đó là tất cả về ngữ cảnh. Các ứng dụng sử dụng mã trên đã cũ và crufty bởi thời gian tôi đã nhận nó và sử dụng một cơ sở dữ liệu để lưu trữ các mẫu sẽ có được overkill cho khối lượng/phức tạp của các email được gửi đi. Hãy xem xét một mẫu chỉ là một chuỗi sau đó bạn có thể lưu trữ chuỗi đó trong một tệp hoặc một cơ sở dữ liệu, tùy theo ý nghĩa nào cho ứng dụng của bạn. Một trong những lợi ích của việc sử dụng các mẫu Razor là hỗ trợ Visual Studio, do đó bạn sẽ nhận được màu cú pháp. Nếu bạn lưu trữ chúng trong cơ sở dữ liệu, bạn sẽ bổ sung thêm một vài bước bất cứ khi nào bạn muốn sửa đổi chúng, tức là trích xuất, thay đổi, cập nhật. –

+0

Rất đúng. Tuy nhiên việc lưu trữ nó trong cơ sở dữ liệu có thể sẽ dễ dàng hơn trong tình huống của tôi.Tôi có thể tất nhiên có các tập tin trên máy của tôi, và cập nhật db thông qua mã khi cần thiết. Phải mất mãi mãi để triển khai một sự thay đổi để xanh, và tôi sẽ do dự để triển khai lại cho một sự thay đổi nhỏ như vậy. – tostringtheory

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