在Python中发送带附件的邮件
我有一段用Python发送邮件的代码:
from email.mime.base import MIMEBase
from email import encoders
from email.utils import formatdate
SERVER_ADDR = 'smtp.gmail.com'
def sendMail(dir, fromAddr, toAddr, subject, text, files):
msg = MIMEMultipart()
msg['From'] = fromAddr
msg['To'] = toAddr
msg['Date'] = datetime.date.today()
msg['Subject'] = subject
msg.attach(MIMEText(text))
for file in files:
part = MIMEBase('application',"octet-stream")
part.set_payload( open(file,"rb").read )
encoders.encode_base64(part)
part.add_header('Content-Disposition','attachment; filename {}'.format(os.path.basename(file)))
msg.attach(part)
smtp = smtplib.SMTP(SERVER_ADDR,587)
smtp.sendmail(fromAddr,toAddr,msg.as_string())
smtp.close()
return 0
def main(argv):
files = [argv[1]]
sendMail(myemail,myemail,"Zalacznik","Tekst maila bla bla bla.",
files) # I replaced my email here
return 0
if __name__=="__main__":
sys.exit(main(sys.argv))
我遇到了一个错误:
TypeError: sendMail() missing 1 required positional argument: 'files'
我的代码哪里出问题了?
[编辑]:
好的,我已经把签名中的dir去掉了,但我又遇到了另一个错误:
TypeError: expected bytes, not builtin function or method
错误出现在这一行 encoders.encode_base64(part)
。
2 个回答
0
这个问题和发送邮件或者附件没有关系。
sendMail
这个函数的第一个参数是 dir
,但是在函数里你并没有用到这个参数。不过,当你调用这个函数的时候,你似乎漏掉了这个参数:你传入的第一个参数是一个邮箱地址,所以这个参数应该是 fromAddr
。
你可能只需要把这个参数从函数定义中去掉就可以了。
0
把sendMail
的定义和调用放在一起看:
def sendMail(dir, fromAddr, toAddr, subject, text, files):
# | | | | | !
sendMail(myemail, myemail, "Zalacznik", "Tekst maila bla bla bla.", files)
因为Python是根据参数的位置来理解的,所以它告诉你缺少最后一个参数files
,但我觉得其实你真正缺少的是第一个参数dir
。