Python HTML邮件:如何在HTML邮件中插入列表项

3

我曾经费尽心思去解决这个问题,但最终无功而返,只好向大家寻求帮助。我有一个HTML电子邮件(使用Python的smtplib)。以下是代码:

Message = """From: abc@abc.com>
To: abc@abc.com>
MIME-Version: 1.0
Content-type: text/html
Subject: test

Hello,
Following is the message 
""" + '\n'.join(mail_body)  + """
Thank you.
"""

在上面的代码中,mail_body是一个包含来自进程输出的行的列表。现在我想要的是,在HTML电子邮件中逐行显示这些行。现在正在发生的是,它只是一行接着一行地添加。例如:
我像这样存储进程的输出:
for line in cmd.stdout.readline()
    mail_body.append()

当前 HTML 电子邮件的输出为:
Hello,
abc
Thank you.

What i want :

Hello,
a
b
c
Thank you.

我想把我的进程输出逐行附加到HTML电子邮件中。有什么方法可以实现吗?

谢谢和问候

2个回答

3
你可以使用email包(来自stdlib)生成要发送的电子邮件内容,例如:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from cgi import escape
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from smtplib import SMTP_SSL

login, password = 'me@example.com', 'my password'

# create message
msg = MIMEMultipart('alternative')
msg['Subject'] = Header('subject…', 'utf-8')
msg['From'] = login
msg['To'] = ', '.join([login,])

# Create the body of the message (a plain-text and an HTML version).
text = "Hello,\nFollowing is the message\n%(somelist)s\n\nThank you." % dict(
    somelist='\n'.join(["- " + item for item in mail_body]))

html = """<!DOCTYPE html><title></title><p>Hello,<p>Following is the message 
<ul>%(somelist)s</ul><p>Thank you. """ % dict(
    somelist='\n'.join(["<li> " + escape(item) for item in mail_body]))

# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(MIMEText(text, 'plain', 'utf-8'))
msg.attach(MIMEText(html, 'html', 'utf-8'))    

# send it
s = SMTP_SSL('smtp.mail.example.com', timeout=10) # no cert check on Python 2

s.set_debuglevel(0)
try:
    s.login(login, password)
    s.sendmail(msg['From'], msg['To'], msg.as_string())
finally:
    s.quit()

2
在HTML中,换行不是\n,而是表示"换行"的<br>标签。但是在这封电子邮件中,由于你没有使用HTML标签,你还需要知道在MIME消息中换行符是\r\n而不仅仅是\n
因此,你应该这样写:
'\r\n'.join(mail_body)

对于处理MIME消息的换行符,但如果您要使用HTML进行格式化,则需要知道 <br> 是换行符,它应该是:

'<br>'.join(mail_body)

为了全面起见,您可以尝试以下内容:
'\r\n<br>'.join(mail_body) 

但我不知道那会是什么样子...

我在思考OP是否真的需要<p>一些段落标签</p> - Jon Clements
1
太棒了,你太棒了,愿上帝赐福你拥有可爱的孩子和大量的财富。"<b>" 对我很有用,我不需要其他东西。我不知道为什么我没有想到这个简单的事情。非常感谢。 - Niyojan
你不需要使用 "\r\n",因为 smtplib 会自动将 \n(或\r)转换为你。否则,你需要担心的是 \r\n.\r\nFrom 、7位清洁等问题。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接