尝试发送带有文本的电子邮件时出现TypeError

时间:2019-01-15 21:18:25

标签: python smtp

我试图创建一个程序,人们可以在其中上传一些.txt文件,并且.txt文件中的文本将通过SMTP发送到我的电子邮件中。我正在使用gmail。我没有太多的编程经验,我想学习更多,所以请帮助我。 :)

我有2个工作代码,第一个代码用于查找和读取.txt文件,第二个代码用于发送电子邮件。

import smtplib
from tkinter import *
from tkinter.filedialog import *

Tk().withdraw()
token = askopenfilename()
with open(token) as f:
    msg = f.readlines()
print(msg)

##########MAIL##############################################################
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("MYEMAIL", "PASS")

server.sendmail("MYEMAIL", "MYEMAIL", msg)
server.quit()

两个代码都可以,我只需要将它们组合即可。这段代码给了我错误:

Traceback (most recent call last):
  File "C:\Users\JiriC\Desktop\name V1.1.py", line 19, in <module>
    server.sendmail("MYEMAIL", "MYEMAIL", msg)
  File "E:\PROGRAMY\PYTHON\lib\smtplib.py", line 882, in sendmail
    (code, resp) = self.data(msg)
  File "E:\PROGRAMY\PYTHON\lib\smtplib.py", line 564, in data
    q = _quote_periods(msg)
  File "E:\PROGRAMY\PYTHON\lib\smtplib.py", line 176, in _quote_periods
    return re.sub(br'(?m)^\.', b'..', bindata)
  File "E:\PROGRAMY\PYTHON\lib\re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

1 个答案:

答案 0 :(得分:1)

您需要:

msg = f.read()

代替:

msg = f.readlines()

这是因为sendmail()想要一个 string ,如消息所示,但是readlines()返回的是一个字符串列表

执行print(msg)时,您会看到['first line', 'second line', ...]。相反,您应该看到整个消息,没有任何方括号或引号。

read()将正确读取整个文件并将其内容作为单个字符串返回。