2011-01-18 34 views
6

tôi đang phải đối mặt với một vấn đề giải mã một email với chủ đề sau đây:javax.mail - Vấn đề giải mã đối tượng

Subject: = ISO-8859-1 Q Re: Re: Re: Fwd?? : (GI = = ISO-8859-1 Q Hỗ trợ-Id:??? 11.729) =

JavaMail giải mã nó như:?

= ISO-8859-1 Q Re: Re: Re: Fwd: (GI? = Hỗ trợ-Id: 11729)

đây có phải là chủ đề hợp lệ không? hoặc javamail có thể đọc được điều này không?

liên quan

Trả lời

6

Nó không đúng định dạng. You're not permitted to have whitespace characters in the middle of an RFC 2047 encoded-word, và do đó JavaMail ngừng cố gắng giải mã đối tượng khi nó chạm vào một khoảng trắng trước khi nó chạm vào thiết bị đầu cuối ?=. Hầu hết các trình phân tích cú pháp sẽ linh hoạt về những thứ như thế này, do rất nhiều thông báo không đúng theo cách này, nhưng JavaMail hơi quá nghiêm ngặt trong vấn đề này. Nó không phải là sai, nhưng chắc chắn không phải là "tự do trong những gì nó chấp nhận". Đây là những gì RFC phải nói:

QUAN TRỌNG: 'từ mã hóa' được thiết kế để được công nhận là 'atom's bởi trình phân tích cú pháp RFC 822. Kết quả là, không gian trắng không được mã hóa ký tự (chẳng hạn như SPACE và HTAB) là FORBIDDEN trong một từ được mã hóa '. Ví dụ, chuỗi ký tự

=?iso-8859-1?q?this is some text?= 

sẽ được phân tích như bốn 'của nguyên tử, chứ không phải như một đĩa đơn 'nguyên tử'(bởi một RFC 822 phân tích cú pháp) hoặc 'mã hóa-word'(bằng một cú pháp mà hiểu 'từ được mã hóa'). Cách chính xác để mã hóa chuỗi "đây là một số văn bản " cũng là để mã hóa các ký tự KHÔNG GIAN, ví dụ:

=?iso-8859-1?q?this=20is=20some=20text?= 

Bạn có thể thay thế tất cả các không gian trong đó có ký tự gạch dưới, nhưng điều đó có thể nhận được lộn xộn bởi vì bạn muốn về cơ bản phải viết phân tích cú pháp của riêng bạn để biết khi nào để làm điều đó.

Bạn cũng có thể thử đặt thuộc tính hệ thống mail.mime.decodetext.strict thành false, nhưng xem lướt qua mã JavaMail có vẻ như không giúp ích gì. (Vẫn đáng để thử, mặc dù.)

+0

@Cancer Lee: viết "Tôi đã thử đề xuất, nó hoạt động." Vì vậy, hãy thử 'mail.mime.decodetext.strict'. – dkarp

2

Bạn có gọi javax.mail.internet.MimeUtility decodeText về chủ đề không?

+1

'MimeMessage.getSubject()' thực hiện điều đó tự động. – dkarp

+0

dkarp, bạn nói đúng nhưng chúng tôi không có thông tin về phương pháp mà Gerhard đã sử dụng. – andcoz

+0

Kiểm tra ví dụ của anh ấy. Từ mã hóa được định dạng tốt được giải mã và từ được định dạng không đúng. Anh ta được gọi là 'MimeUtility.decodeText()' hoặc được gọi là 'MimeMessage.getSubject() ', nhưng trong cả hai trường hợp, một lệnh gọi tới' decodeText' sẽ không giúp ích gì. – dkarp

0

chỉnh sửa: sorrry câu trả lời này là hoàn toàn tào lao, có được hai lớp trong các dự án của chúng tôi, imlpemeting cũng MimeUtility và nhiều hơn nữa, làm công cụ nhiều crappy. Xin lỗi !!!!!

+1

MimeUtiliy trong gói nào? Không có phương thức như vậy trong javax.mail –

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