使用Python发送富文本HTML电子邮件

3

我正在尝试发送HTML格式的电子邮件,目前代码可以工作,但是当我检查我发送的邮件时,HTML消息内容中的颜色格式化没有显示出来。

到目前为止,这是代码:

from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import smtplib

class EMail(object):
        """ Class defines method to send email of attachment
        """
        def __init__(self, sendto, mailFrom, server, usrname, password, files, debug=False, subjt=None):
                self.debug = debug
                self.mailto = sendto
                self.mailFrom = mailFrom
                self.smtpserver = server
                self.EMAIL_PORT = 587
                self.usrname = usrname
                self.password = password
                self.subject = subjt

                # self.send(files)

        def sendMessage(self, msgContent, files):

                #collect info and prepare email
                if files:
                    if self.subject == "":
                        #Subject should contains of file attached
                        if len(files) <=3: subjAdd = ','.join(files)
                        if len(files) > 3: subjAdd = ','.join(files[:3]) + '...'
                        self.subject= self.systemLogin() +" sent mail from maya "+ os.path.basename(subjAdd)
                print "subject: ", self.subject
                msg = self.prepareMail(self.mailFrom, self.mailto, self.subject, msgContent, files)

                # connect to server and send email
                server=smtplib.SMTP(self.smtpserver, port=self.EMAIL_PORT)
                server.ehlo()
                server.starttls()#use encrypted SSL mode
                server.ehlo() # to make starttls work
                server.login(self.usrname, self.password)
                server.set_debuglevel(self.debug)
                try:
                        failed = server.sendmail(From, to, msg.as_string())
                except Exception as er:
                        print er
                finally:
                        server.quit()

        def prepareMail(self, From, to, subject, msgHTML, attachments):
                msg = MIMEMultipart()
                msg['From'] = From
                msg['To'] = to
                msg['Date'] = formatdate(localtime=True)
                msg['Subject'] = subject

                #The Body message
                msg.attach(MIMEText(msgHTML, 'html'))
                msg.attach(MIMEText("Sent from maya by Mini Me"))
                if attachments:
                    for phile in attachments:
                            #we could check for MIMETypes here
                            part = MIMEBase('application',"octet-stream")
                            part.set_payload(open(phile, "rb").read())
                            Encoders.encode_base64(part)
                            part.add_header('Content-Disposition', 'attachment; filename="%s"' % os.path.basename(phile))
                            msg.attach(part)
                return msg

以下是我发送的HTML格式文本,(由于CSS而变长,我已删除了HTML头部分)

<body class="body_foreground body_background" style="font-size: normal;" >
<pre>

---
 send.py | 4 <span class="ansi32">+</span><span class="ansi31">---</span>
 1 file changed, 1 insertion(+), 3 deletions(-)

<span class="ansi1">diff --git a/send.py b/send.py</span>
<span class="ansi1">index 87126d5..abb1fd8 100644</span>
<span class="ansi1">--- a/send.py</span>
<span class="ansi1">+++ b/send.py</span>
<span class="ansi36">@@ -49,14 +49,12 @@</span> class EMail(object):
                        server.quit()

        def prepareMail(self, From, to, subject, msgHTML, attachments):
<span class="ansi31">-              msg = MIMEMultipart('alternative')</span>
<span class="ansi32">+</span>               <span class="ansi32">msg = MIMEMultipart()</span>
                msg['From'] = From
                msg['To'] = to
                msg['Date'] = formatdate(localtime=True)
                msg['Subject'] = subject

<span class="ansi31">-              print msgHTML</span>
<span class="ansi31">-</span>
                #The Body message
                msg.attach(MIMEText(msgHTML, 'html'))
                msg.attach(MIMEText("Sent from maya by Mini Me"))
-- 
1.8.3.4 (Apple Git-47)


</pre>
</body>

</html>

似乎只有pre标签格式化有效,而不是css……那是为什么呢?


并非所有的电子邮件客户端都能够呈现CSS,有些只能呈现内联样式。 - furins
@furins:Gmail怎么样? - Ciasto piekarz
看到zord的答案(截至今天:不支持在headbody中使用style标签)。一般来说,电子邮件中的CSS很棘手,应该尽量简洁,或者可以优雅地降级而不影响消息的可读性。请注意,您的电子邮件大小不应超过600px,以适应某些在线浏览器(例如,任何图像都不应超过该尺寸)。最终,像http://putsmail.com/这样的工具可能会对您有所帮助。 - furins
好的,我找到了一种在Python中嵌入样式的方法,用于Git差异比较,我将在单独的帖子中分享并在此处链接。 - Ciasto piekarz
1个回答

10

Gmail确实支持<style>块。至少在2021年是这样的。但它对此仍然有些笨拙。 - Peter Moore

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