2013-01-03 71 views
15

Tôi đã viết một tập lệnh viết một tin nhắn vào một tập tin văn bản và cũng gửi nó dưới dạng email. Mọi thứ diễn ra tốt đẹp, ngoại trừ email cuối cùng dường như là tất cả trong một dòng.Làm thế nào để ngắt dòng trong e-mail được gửi bằng cách sử dụng smtplib của Python?

Tôi thêm ngắt dòng theo \n và nó hoạt động cho tệp văn bản nhưng không hoạt động đối với email. Bạn có biết nguyên nhân có thể là gì không?


Dưới đây là mã của tôi:

import smtplib, sys 
import traceback 
def send_error(sender, recipient, headers, body): 

    SMTP_SERVER = 'smtp.gmail.com' 
    SMTP_PORT = 587 
    session = smtplib.SMTP('smtp.gmail.com', 587) 
    session.ehlo() 
    session.starttls() 
    session.ehlo 
    session.login(sender, 'my password') 
    send_it = session.sendmail(sender, recipient, headers + "\r\n\r\n" + body) 
    session.quit() 
    return send_it 


SMTP_SERVER = 'smtp.gmail.com' 
SMTP_PORT = 587 
sender = '[email protected]' 
recipient = '[email protected]' 
subject = 'report' 
body = "Dear Student, \n Please send your report\n Thank you for your attention" 
open('student.txt', 'w').write(body) 

headers = ["From: " + sender, 
       "Subject: " + subject, 
       "To: " + recipient, 
       "MIME-Version: 1.0", 
       "Content-Type: text/html"] 
headers = "\r\n".join(headers) 
send_error(sender, recipient, headers, body) 

Trả lời

12

Bạn có nội dung thư của bạn tuyên bố có nội dung HTML ("Content-Type: text/html"). Mã HTML cho ngắt dòng là <br>. Bạn nên thay đổi loại nội dung của mình thành text/plain hoặc sử dụng đánh dấu HTML cho ngắt dòng thay vì đồng bằng \n vì sau này bị bỏ qua khi hiển thị tài liệu HTML.


Lưu ý phụ, cũng có xem email package. Có một số lớp có thể đơn giản hóa định nghĩa của tin nhắn E-Mail cho bạn (with examples).

Ví dụ, bạn có thể thử (chưa được kiểm tra):

import smtplib 
from email.mime.text import MIMEText 

# define content 
recipients = ["[email protected]"] 
sender = "[email protected]" 
subject = "report reminder" 
body = """ 
Dear Student, 
Please send your report 
Thank you for your attention 
""" 

# make up message 
msg = MIMEText(body) 
msg['Subject'] = subject 
msg['From'] = sender 
msg['To'] = ", ".join(recipients) 

# sending 
session = smtplib.SMTP('smtp.gmail.com', 587) 
session.starttls() 
session.login(sender, 'my password') 
send_it = session.sendmail(sender, recipients, msg.as_string()) 
session.quit() 
21

Thật không may cho tất cả chúng ta, không phải mọi loại chương trình hoặc ứng dụng sử dụng các tiêu chuẩn tương tự mà python không.

Nhìn vào câu hỏi của bạn tôi nhận thấy tiêu đề của bạn là: "Content-Type: text/html"

Có nghĩa là bạn cần phải sử dụng tag style của HTML cho mới đường dây của bạn, chúng được gọi là dòng-chia. <br>

văn bản của bạn nên là:

"Dear Student, <br> Please send your report<br> Thank you for your attention" 

Nếu bạn muốn sử dụng loại nhân vật mới-dòng, bạn phải thay đổi tiêu đề để đọc: "Content-Type: text/plain"

Bạn vẫn sẽ phải thay đổi mới- ký tự dòng từ một đơn \n đến số \r\n được sử dụng trong email.

văn bản của bạn sẽ là:

"Dear Student, \r\n Please send your report\r\n Thank you for your attention" 
+0

Cảm ơn bạn rất nhiều. '\ r \ n' không hoạt động đối với tôi, nhưng'
'thì không. –

0

Thiết lập tiêu đề content-type để Content-Type: text/plain (với \r\n ở cuối) cho phép tôi gửi nhiều dòng email văn bản đơn giản.

0

Outlook sẽ xóa nguồn cấp dữ liệu dòng khỏi văn bản thuần túy mà nó tin là phần bổ sung. https://support.microsoft.com/en-us/kb/287816

Bạn có thể thử cập nhật bên dưới để làm cho các đường trông giống như viên đạn. Điều đó làm việc cho tôi.

body = "Dear Student, \n- Please send your report\n- Thank you for your attention" 
+0

Tại sao bỏ phiếu xuống? – edW

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