2009-04-24 17 views
7

Chạy vào sự kỳ lạ với get_payload: có vẻ như không có dấu hiệu gì khi nó thấy một dấu bằng trong thông điệp giải mã. Đây là mã hiển thị lỗi:Python: giải mã get_payload email không thành công khi nhấn dấu bằng?

import email 

data = file('testmessage.txt').read() 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 

Và đây là thông báo mẫu: test message.

Thư chỉ được in cho đến "=" đầu tiên. Phần còn lại bị bỏ qua. Có ai biết chuyện gì đang diễn ra không?

Kịch bản tương tự với "decode = False" trả về toàn bộ thư, vì vậy nó xuất hiện giải mã không hài lòng với dấu bằng.

Đây là phiên bản Python 2.5.

Trả lời

6

Bạn có vấn đề về kết thúc dòng. Phần thân của thông báo thử nghiệm của bạn sử dụng trả về vận chuyển trần (\ r) không có dòng mới (\ n). Nếu bạn sửa các kết thúc dòng trước khi phân tích cú pháp email, tất cả sẽ hoạt động:

import email, re 
data = file('testmessage.txt').read() 
data = re.sub(r'\r(?!\n)', '\r\n', data) # Bare \r becomes \r\n 
msg = email.message_from_string(data) 
payload = msg.get_payload(decode=True) 
print payload 
+0

Cảm ơn Richie, hoạt động. Tuy nhiên, tôi cũng sẽ xử lý các tệp đính kèm không phải là văn bản, vì vậy tôi có thể không muốn thực hiện việc thay thế lại một cách bừa bãi. Tôi sẽ cần phải phát hiện văn bản/đồng bằng và chỉ làm thay thế sau đó, đó là một chút tinh tế kể từ khi tôi thấy loại mime cho phần tin nhắn tôi đã qua cuộc gọi message_from_string. Có thể gọi mã hóa riêng biệt bên ngoài lệnh gọi get_payload không? – Parand

+1

Bạn có chắc chắn sẽ bao giờ xử lý các tệp đính kèm nhị phân thực sự không? Tệp đính kèm thường được mã hóa trong email sử dụng base64 hoặc tương tự, vì vậy mặc dù chúng đại diện cho tệp nhị phân, chúng được mã hóa dưới dạng văn bản trong email. – RichieHindle

+0

Bạn lại đúng; Tôi đã thử nghiệm với một số lượng phong nha của các ví dụ và tất cả họ làm việc tốt với sự thay thế bạn đề nghị. Cảm ơn một lần nữa. – Parand

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