2011-02-04 37 views
25

Tôi đang gửi email và tôi nhận được email chính xác nhưng mã hóa của chủ đề không chính xác. Tôi đang gửi "invitación" nhưng tôi nhận được "invitaci? N". Nội dung của tin nhắn là OK.Sự cố với mã hóa chủ đề khi gửi email

Nội dung của thông điệp đến từ việc chuyển đổi Mẫu tốc độ trong khi chủ đề được đặt trong biến Chuỗi.

Tôi đã googled xung quanh và tôi đã thấy rằng một số người nói rằng MimeUtility.encodeText() có thể giải quyết vấn đề, nhưng tôi đã không thành công với nó.

Tôi làm cách nào để khắc phục sự cố? Đây là mã tôi có cho đến nay.

String subject = "Invitación"; 
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model); 

Properties props = new Properties(); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    String encodingOptions = "text/html; charset=UTF-8"; 
    Message msg = new MimeMessage(session); 
    msg.setHeader("Content-Type", encodingOptions); 
    msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

    msg.setSubject(subject); 
    msg.setContent(msgBody, encodingOptions); 
    Transport.send(msg); 

    } catch (AddressException e) { 
     ... 
    } catch (MessagingException e) { 
     ... 
    } 

Cảm ơn

Trả lời

41

JavaMail có lẽ một chút quá nhiều trừu tượng, và bạn đang trở thành nạn nhân để nó ở đây. Khi bạn sử dụng

Message msg = new MimeMessage(session); 

bạn tạo một đối tượng MimeMessage nhưng đối xử với nó như là một đối tượng Message. Message chỉ có phương thức setSubject(String subject), sử dụng bộ mã mặc định nền tảng để mã hóa chủ đề. Nếu mặc định nền tảng không thể mã hóa nó, bạn nhận được ? ký tự trong tiêu đề kết quả. Tuy nhiên, MimeMessage có phương thức setSubject(String subject, String charset) cho phép bạn chỉ định bộ ký tự mà bạn muốn sử dụng để mã hóa đối tượng. Vì vậy, chỉ cần chuyển mã của bạn thành

MimeMessage msg = new MimeMessage(session); 
msg.setHeader("Content-Type", encodingOptions); 
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom)); 
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo)); 

msg.setSubject(subject, "UTF-8"); 

và nó sẽ hoạt động.

+0

Chỉ lớp con được gửi đi của 'Thông điệp' là' MimeMessage'. Tôi nghi ngờ rằng ai đó đã triển khai một lớp con khác. JavaMail sẽ ít gắt gỏng hơn nếu chúng chỉ thu gọn 'javax.mail' và' javax.mail.internet' - lớp trừu tượng bổ sung đó có nghĩa là bạn liên tục truyền đến lớp con. – dkarp

+0

Điều này không giải quyết được vấn đề của tôi (gửi biểu tượng £ trong dòng chủ đề) –

+1

@Mark: Bạn đã thử 'msg.setSubject (" \ u00a3 "," UTF-8 ")' và nó không mã hóa đối tượng đúng cách? Tiêu đề Chủ đề kết quả là gì? – dkarp

4

lẽ bạn có thể thử: msg.setSubject(subject, "UTF8");

+1

Không có phương pháp này cho javax.mail.Message. Tôi đang sử dụng API Java Mail do AppEngine cung cấp. – Javi

+0

Ồ, xin lỗi! Tôi đã không nhận thấy rằng có liên quan đến AppEngine! – ksimon

+0

Tôi đã quên lúc đầu. Tôi đã chỉnh sửa bài đăng sau này để gắn thẻ nó dưới dạng AppEngine. Dù sao cũng cảm ơn bạn. – Javi

6

bạn có thể sử dụng, nó hoạt động

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q")); 
0

Trong trường hợp của tôi là điều duy nhất mà làm việc được thay đổi vị trí hệ thống với một trong đó hỗ trợ mong muốn bộ ký tự. Trước đó tôi đã thử nhiều cách khác nhau bao gồm câu trả lời được chấp nhận từ chủ đề này, nhưng không ai trong số họ đã giúp.

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