2008-09-04 27 views
48

Tôi đang gửi thư từ Ứng dụng C# của mình, sử dụng SmtpClient. Hoạt động tốt, nhưng tôi phải quyết định xem tôi có muốn gửi thư dưới dạng Văn bản thuần túy hay HTML hay không. Tôi tự hỏi, có cách nào để gửi cả hai? Tôi nghĩ đó được gọi là multipart.Gửi thư bằng cả HTML và Văn bản thuần túy trong .net

Tôi googled một chút, nhưng hầu hết các ví dụ về cơ bản đã không sử dụng SmtpClient nhưng sáng tác toàn bộ SMTP-Body mình, đó là một chút "đáng sợ", vì vậy tôi tự hỏi nếu một cái gì đó được xây dựng trong.

Nếu không, có thư viện bên thứ ba thực sự được sử dụng tốt/mạnh mẽ nào để gửi e-mail không?

Trả lời

53

Các tài liệu MSDN dường như bỏ lỡ một điều mặc dù, tôi đã phải thiết lập các nội dung gõ bằng tay, nhưng mặt khác, nó hoạt động như một nét duyên dáng :-)

MailMessage msg = new MailMessage(username, nu.email, subject, body); 
msg.BodyEncoding = Encoding.UTF8; 
msg.SubjectEncoding = Encoding.UTF8; 

AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent); 
htmlView.ContentType = new System.Net.Mime.ContentType("text/html"); 
msg.AlternateViews.Add(htmlView); 
+0

+1 Đã hủy bỏ phiếu bầu chọn xuống vì điều này hữu ích đối với tôi. – plntxt

+3

Dường như Tài liệu MSDN đã được cập nhật: phiên bản C# của mã ví dụ của họ sử dụng phiên bản AlternateView.CreateAlternateViewFromString lấy loại nội dung làm tham số. Phiên bản C++ không (họ có thể đã bị bỏ quên để cập nhật nó). – Babak

+2

@jep Tôi đã có thể ngăn chặn máy chủ smtp của tôi (tương tự như Exchange) từ mã hóa lại phiên bản thuần văn bản sang BASE64 bằng cách sử dụng msg.BodyEncoding = Encoding.ASCII. HtmlView không bị hấn gì. – secretwep

26

Chỉ muốn thêm rằng bạn có thể sử dụng hằng số định nghĩa MediaTypeNames.Text.HtmlMediaTypeNames.Text.Plain thay vì "text/html""text/plain", mà luôn luôn là một cách thích hợp hơn. Đó là trong không gian tên System.Net.Mime.

Vì vậy, trong ví dụ trên, nó sẽ là:

AlternateView htmlView = AlternateView.CreateAlternateViewFromString(htmlContent, null, MediaTypeNames.Text.Html); 
+3

Tôi sẽ đặt trước: var htmlView = AlternateView.CreateAlternateViewFromString (htmlContent, new ContentType (MediaTypeNames.Text.Html)); –

10

Tôi chỉ sẽ đặt một lưu ý ở đây cho bất cứ ai đó là gặp vấn đề và tìm cách của họ đến trang này - đôi khi, Outlook máy chủ SMTP sẽ hoàn nguyên email gửi đi. Nếu bạn thấy cơ thể thuần văn bản của bạn biến mất hoàn toàn và không có gì ngoài các tệp đính kèm được mã hóa base64, có thể là do máy chủ của bạn đang mã hóa lại email. Máy chủ SMTP của Google không mã hóa lại email - hãy thử gửi qua đó và xem điều gì xảy ra.

+2

Tôi đã thực sự tìm thấy con đường của tôi ở đây (hơn bốn năm sau) tìm kiếm điều đó. Bất kỳ cơ hội bạn hoặc bất cứ ai đọc điều này biết làm thế nào để làm cho nó dừng nó trên Microsoft Exchange Server 2010 SP3? – jep

+0

SmtpDeliveryMethod.SpecifiedPickupDirectory là người bạn của bạn để biết chính xác những gì được gửi đến máy khách SMTP gửi đi. Cho phép bạn lưu một bản sao của email RAW (mở bằng notepad) được gửi bởi .NET SmtpClient. – eselk

6

Trên đầu sử dụng chế độ xem AlternateViews để thêm cả html và chế độ xem văn bản thuần túy, đảm bảo bạn cũng không đặt nội dung của đối tượng Thư.

// do not do this: 
var msg = new MailMessage(model.From, model.To); 
msg.Body = compiledHtml; 

Vì nó sẽ làm cho email của bạn chứa nội dung html trong cả hai chế độ xem, ghi đè các chế độ xem thay thế.

4

Đối với những người (như tôi), người đã gặp vấn đề về gmail hiển thị phần chữ thô thay vì phần html.

Gmail dường như luôn hiển thị phần cuối cùng trong thư của bạn.

Vì vậy, nếu bạn đã thêm phần html trước khi phần văn bản thuần túy của bạn là gmail sẽ luôn hiển thị biến thể văn bản thuần túy.

Để khắc phục điều này, bạn chỉ cần thêm phần văn bản thuần túy trước phần html của mình.

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