TypeError:“方法”类型的对象没有 len() |试图将文件附加到电子邮件消息
Posted
技术标签:
【中文标题】TypeError:“方法”类型的对象没有 len() |试图将文件附加到电子邮件消息【英文标题】:TypeError: object of type 'method' has no len() | Trying to attach file to email msg 【发布时间】:2015-09-07 04:46:43 【问题描述】:我正在使用 Python 3,并且正在尝试将文件附加到电子邮件中。我对 MIME 和 SMTP 的东西还很陌生。 所以这是我的功能:
def func():
path = mypath
for file in glob.glob(path + "\\happy*"):
print(file)
sender = myemail
senderto = someonesemail
msg = MIMEMultipart('alternative')
msg['Subject'] = 'The File'
msg['From'] = sender
msg['To'] = senderto
body = "File"
msg.attach(MIMEText(body, 'plain'))
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(file, encoding='charmap').read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % file)
msg.attach(part)
global smtpSettings
smtpSettings = smtplib.SMTP(host=myhost, port=587)
print("Step 1 Complete")
smtpSettings.login(smtpusername, smtppassword)
print("Step 2 Complete")
smtpSettings.sendmail(sender, senderto, msg.as_string)
print("Step 3 Complete")
smtpSettings.quit()
print("Success")
旁注:senderto = 接收者。 我得到的输出是:
Traceback (most recent call last):
File "C:\Python34\lib\tkinter\__init__.py", line 1533, in __call__
return self.func(*args)
File "C:/Users/Luis/Desktop/PYTHON/smtptestes.py", line 73, in func
smtpSettings.sendmail(sender, senderto, msg.as_string)
File "C:\Python34\lib\smtplib.py", line 769, in sendmail
esmtp_opts.append("size=%d" % len(msg))
TypeError: object of type 'method' has no len()
【问题讨论】:
我想你的意思是msg.as_string()
。
@BrenBarn 就是这样,我从某个地方复制了那行。猜是错的。非常感谢
【参考方案1】:
在步骤 3 中修复,更改
smtpSettings.sendmail(sender, senderto, msg.as_string)
到
smtpSettings.sendmail(sender, senderto, msg.as_string())
因为as_string
是一种方法
【讨论】:
【参考方案2】:我是yagmail 的维护者,它是一个让发送电子邮件(带或不带附件)变得更加容易的包。
import yagmail
yag = yagmail.SMTP(myemail, 'mypassword')
yag.send(to = someonesemail, subject = 'The File', contents = ['File', file])
发送电子邮件只需要三行。不错!
内容会巧妙地猜测file
变量字符串指向一个文件,从而附加它。
完整的代码可能是:
import yagmail
import glob
def func(path, user, pw, ):
subject = 'The File'
body = "File"
yag = yagmail.SMTP(user, pw, host = myhost)
for fname in glob.glob(path + "\\happy*"):
yag.send(someonesemail, subject, [body, fname])
func(mypath, smtpusername, smtppassword)
【讨论】:
以上是关于TypeError:“方法”类型的对象没有 len() |试图将文件附加到电子邮件消息的主要内容,如果未能解决你的问题,请参考以下文章
TypeError:'Cursor' 类型的对象没有 len()
TypeError: 'float' 类型的对象没有 len() & TypeError: 'float' 对象不可迭代
Python - TypeError: '...' 类型的对象没有 len()
Python无法读取文件TypeError:'file'类型的对象没有len()[重复]