Python 3中的克罗地亚字符

时间:2016-12-09 16:20:42

标签: python python-3.x encoding

我写了一个小程序,在其中我向.csv文件中的接收者发送电子邮件。

import csv
import smtplib

f = open('output.csv')
csv_f = csv.reader(f)
email=[]
for row in csv_f:
    if row:
        email.append(row[2])

fromaddr = MY MAIL
toaddrs  = email
subject = 'Čestitamo!'
text = 'ččšpšžćčđšđ'
msg = 'Subject: %s\n\n%s' % (subject, text)


username = MY_USER
password = MY_PASS


try:
    server = smtplib.SMTP('smtp.gmail.com:587')

    server.starttls()
    server.login(username,password)
    server.sendmail(fromaddr, email, msg)
    server.quit()
    print('Mail sent!')
except Exception as e:
    print("ERROR!")
    print(e)

这样的程序会产生错误:'ascii'编解码器无法编码位置9中的字符'\ u010c':序数不在范围内

尝试编码为utf-8,邮件已发送,但我明白了:

Äestitamo! ÄÄÅ¡pšžćÄÄ'Å¡Ä“

然后我试图在很多方面解码,但我无法得到适当的克罗地亚字母č,ć,ž,š,đ。

我应该怎么做才能在发送邮件时收到正确的克罗地亚信件?

修改

将一行更改为:

server.sendmail(fromaddr, email, msg.encode("windows-1250"))

现在我有š和ž正确!

因为我有è,因为ć我有æ,因为đ我有ð

1 个答案:

答案 0 :(得分:2)

您必须使用mime模块发送包含非普通ascii字符的消息。如果你对消息的base64编码没问题,你可以简单地使用email.mime.text.MIMEText

msg = email.mime.text.MIMEText('nččšpšžćčđšđ',_charset='utf8')
msg.add_header('Subject', 'Čestitamo!')
server.send_message(msg, fromaddr, email)

如果您不喜欢邮件正文的base64编码,则必须使用email.mime.MIMENonMultipart并明确设置标题并对正文进行编码:

msg = email.mime.nonmultipart.MIMENonMultipart('text', 'plain')
msg.add_header('Content-Transfer-Encoding', '8bits')
msg.add_header('Charset', 'utf8')
msg.add_header('Subject', 'Čestitamo!')
msg.set_payload('ččšpšžćčđšđ'.encode('utf8'))
server.send_message(msg, fromaddr, email)

注意:我在这里使用过utf8编码,但是这个方法可以使用任何其他能够代表克罗地亚字符的编码......