Python SMTP电子邮件显示纯文本和HTML版本

时间:2014-11-20 22:24:30

标签: python email smtp sendgrid

发送smtp电子邮件,当我收到电子邮件时,它会显示纯文本版本和html版本背靠背。这一点是从Sendgrid接收传入的电子邮件dicts,然后将它们发送给另一个用户。代码中引用的'message'对象是dict Sendgrid发布到我的端点。

以下是我所看到的:

    test

Me
Signature

    test

Me
Signature

以下是我发送给mailServer的字符串:

Content-Type: multipart/mixed; boundary="===============5453410005537724489=="
MIME-Version: 1.0
To: me+test@domain.com
From: Me <me@domain.com>
Subject: test
reply-to: Original Sender <sender@theirdomain.com>

--===============5453410005537724489==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

    test

Me
Signature




--===============5453410005537724489==
Content-Type: text/html; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit

<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><span class="Apple-tab-span" style="white-space:pre">    </span>test<br class=""><div apple-content-edited="true" class="">
<span>Me</span><br><span>Signature</span>
</div>
<br class=""></body></html>
--===============5453410005537724489==--

最后,这是我用来发送电子邮件的Python:

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

subject = message.get('subject', 'No Subject')
text = message.get('text', None)
html = message.get('html', None)
to = message.get('to')
cc = message.get('cc', None)
reply_to = message.get('from')

msg = MIMEMultipart()
msg['To'] = 'me+test@domcin.com'
msg['From'] = 'me@domain.com'
msg['Subject'] = subject
msg.add_header('reply-to', reply_to)

toaddrs = msg['To']
if cc is not None:
    msg['CC'] = ', '.join(cc)
    toaddrs += ', ' + msg['CC']

if text is not None:
    msg.attach(MIMEText(text[0].encode('ascii', 'ignore'), 'plain'))
else:
    msg.attach(MIMEText('No plain text for this email', 'plain'))

if html is not None:
    msg.attach(MIMEText(html[0].encode('ascii', 'ignore'), 'html'))

mailServer = smtplib.SMTP("smtp.gmail.com", 587)
mailServer.ehlo()
mailServer.starttls()
mailServer.ehlo()
mailServer.login(GMAIL_USERNAME, GMAIL_PASSWORD)
mailServer.sendmail(GMAIL_USERNAME, toaddrs, msg.as_string())
mailServer.quit()

我在这里缺少什么?

1 个答案:

答案 0 :(得分:5)

您已指定multipart/mixed个内容,这意味着这些部分是独立的消息,并且应该按照所包含的顺序全部显示。

您想要multipart/alternative,这意味着这些部分是同一消息的替代版本,并且只应显示接收者可以理解其内容类型的最后一个部分。

换句话说:

msg = MIMEMultipart('alternative')

Wikipedia对不同的多部分子类型有很好的解释,但对于官方定义,请转到RFC 2046

  

<强> 5.1.3。混合子类型

     &#34;混合&#34; &sub;&#34; multipart&#34;适用于身体时使用      零件是独立的,需要按特定顺序捆绑。      任何&#34; multipart&#34;实现无法识别的子类型      必须被视为具有子类型&#34;混合&#34;。

     

<强> 5.1.4。替代子类型

     

&#34; multipart / alternative&#34; type在语法上与      &#34; multipart / mixed&#34;,但语义不同。特别是,      每个身体部位都是一个替代品#34;版本相同      信息。

     

系统应该认识到各个部分的内容是      互换。系统应该选择最好的&#34;基于的类型      本地环境和参考,在某些情况下甚至通过用户      相互作用。与&#34; multipart / mixed&#34;一样,身体部位的顺序是      重大。在这种情况下,替代方案按顺序出现      增加对原始内容的忠诚度。一般来说,      最佳选择是收件人支持的类型的最后部分      系统的本地环境。

     

&#34;多部分/替代&#34;例如,可用于发送消息      以一种花哨的文本格式,以便于显示      任何地方...