使用Python发送带附件的电子邮件

时间:2014-04-22 15:31:01

标签: python email

我有用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 :(得分:0)

此问题与发送电子邮件或附件无关。

sendMail函数的签名具有第一个位置参数dir - 尽管您不在函数中的任何位置使用它。但是,当您调用该函数时,您似乎错过了该参数:您发送的第一个参数是电子邮件,因此可能是fromAddr

您可能只想从定义中删除该参数。

答案 1 :(得分:0)

sendMail的定义和调用放在一起:

def sendMail(dir,     fromAddr, toAddr,      subject,                    text,  files):
          #  |        |         |            |                           |      !
    sendMail(myemail, myemail,  "Zalacznik", "Tekst maila bla bla bla.", files)

由于Python在位置上解释了这些论点,它会告诉你,你错过了最后一个files,但我会说你真的错过了第一个,dir。< / p>