2014-04-22 3 views
0

Я код отправки почты в 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' 

Что случилось с моим кодом?

[EDIT]: Хорошо я удалил реж от подписи, но у меня есть другая ошибка:

TypeError: expected bytes, not builtin function or method 

Ошибка находится в строке encoders.encode_base64(part).

+0

Похоже, вам не хватает одного аргумента. –

+3

Укажите код, в котором вызывается функция 'sendMail'. – Kevin

+0

Или, по крайней мере, полная трасса. Ошибка * вне * кода, который вы в настоящее время предоставляете. – jonrsharpe

ответ

0

Чтобы поместить определение и вызов sendMail рядом друг с другом:

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

Как Python интерпретирует аргументы позиционно он говорит вам, что вы недостающий последний, files, но я бы сказал, что вы на самом деле отсутствует первый, dir.

0

Этот вопрос не имеет ничего общего с отправкой электронных писем или вложений.

Подпись функции sendMail имеет первый позиционный аргумент dir - хотя вы не используете его нигде в функции. Однако, когда вы вызываете функцию, вы, похоже, пропустили этот аргумент: первый отправленный вами адрес - это электронное письмо, поэтому предполагается, что оно должно быть fromAddr.

Возможно, вы просто хотите удалить этот аргумент из определения.

Смежные вопросы