如何在Python中使用smtplib正确编码邮件

如何在Python中使用smtplib正确编码邮件,python,email,character-encoding,Python,Email,Character Encoding,我正在尝试制作一个python脚本来验证某个文件,并在有更改时发送一封电子邮件 剧本写得很好,但是如果我写了一些特殊的角色,他就不会发邮件了 我已经在网站上寻找编码,但我无法解决我的问题 这是我的剧本: #!/usr/bin/env python3 # -*- coding:Latin-1 -*- import os import shutil import smtplib # Fonctions def compare (old,new): x = 0 if

我正在尝试制作一个python脚本来验证某个文件,并在有更改时发送一封电子邮件

剧本写得很好,但是如果我写了一些特殊的角色,他就不会发邮件了

我已经在网站上寻找编码,但我无法解决我的问题

这是我的剧本:

#!/usr/bin/env python3
# -*- coding:Latin-1 -*-

import os
import shutil
import smtplib

# Fonctions
def compare (old,new):
        x = 0
        if old == new:
                print('Les fichiers sont à jour')
                x = 0
        if old != new:
                print('Nouveaux Fichiers de tests')
                x = 1
                mail = open('mail.txt', 'w', encoding='utf8')
                mail.write("test d'écriture\n")
                mail.write("si ca marche c'est top\n")
                mail.close()
        return x

# Récupération des fichiers
os.chdir("/var/www/corealpi/integration/integration_core")
rep = os.getcwd()
print(rep)

# copie du fichier tests.txt
shutil.copyfile('tests.txt','/home/git/integration/tests.new')

os.chdir("/home/git/integration")
rep_int = os.getcwd()
print(rep_int)

# Ouverture des fichiers
oldFile = open('tests.old','r')
newFile = open('tests.new','r')
tOld = oldFile.read()
tNew = newFile.read()

verif = compare (tOld,tNew)
print(verif)
# Envoie de mails
if verif == 1:

        from email.mime.text import MIMEText
        mailfile = 'mail.txt'
        with open(mailfile) as fp:
                # Create a text/plain message
                msg = MIMEText(fp.read())
                msg.set_charset('utf-8')
        msg['Subject'] = 'Nouveaux Fichiers de %s' % mailfile
        msg['From'] = 'sender@mail.fr'
        msg['To'] = 'receiver@mail.fr'

        # Envoi du message
        s = smtplib.SMTP('192.168.3.2')
        s.send_message(msg)
        s.quit
else:
        print('Rien à signaler')
我用utf8编码。。。但它似乎不适用于
发送消息
?但也许我把我弄糊涂了,或者我的生活太复杂了

如果有人能帮我吗

编辑:我尝试了多种编码方式,但无法解决此问题。。。请帮忙:)


谢谢您的帮助。

您忘了说出平台上的默认编码是什么,以及您是否使用Python2或3

我假设您使用的是Python2,但对于Python3来说应该没有什么不同

事实上,您应该在
email.mime.text.MIMEText
对象中设置字符集,因为doc说字符集默认为us ascii,这在这里是错误的。你应使用:

msg = MIMEText(fp.read(), 'plain', charset)
其中,charset是使用Python2对数据进行编码的字符集,或者是使用pytho3对邮件进行编码的字符集

如果希望以UTF8独立于Python 2中的本地编码发送邮件,请首先将其解码为unicode字符串,然后应用输出字符集:

msg = MIMEText(fp.read().decode(charset), 'plain', 'utf-8')

请尝试
msg.set\u charset('utf-8')
。谢谢@MarkRansom的帮助。我已经编辑了我的脚本,但似乎没有效果。我也尝试过类似的东西,
msg=MIMEText(fp.read(),'utf-8')
,但都是一样的……您使用的是Python 2还是Python 3?或者你是字符串字节还是unicode?我用的是Python 3对不起,我用的是Python 3。因此
msg=MIMEText(fp.read(),'plain',charset)
解决了我的问题。但是现在当我收到邮件时,我有了这种类型的字符:
écho
。所以我想我必须在之后或者类似的事情上重新编码?@mestra不,这只是意味着你的邮件阅读器不喜欢utf-8,并将其显示为拉丁文1。只需将字符集设置为
latin1
,您就可以正确接收带有所有重音字符的邮件。我承认我的口音有问题:-)好的。。。是的,我使用Outlook。。。我明天会看到的。谢谢