在Python中发送带附件的邮件

0 投票
2 回答
859 浏览
提问于 2025-04-18 03:46

我有一段用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

撰写回答