2015-06-21 1 views
0

Я использую Python 3, и я пытаюсь прикрепить файл к сообщению электронной почты. Я довольно новичок в MIME и SMTP. Так что это моя функция:ТипError: объект типа 'method' не имеет len() | Попытка прикреплять файл к электронной почте. Msg

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() 
+1

Я думаю, что вы имеете в виду 'msg.as_string()'. – BrenBarn

+0

@BrenBarn, вот и все, я скопировал эту строку откуда-то. Думаю, это было неправильно. большое спасибо – FoxSGR

ответ

1

Фикс на шаге 3, изменить

smtpSettings.sendmail(sender, senderto, msg.as_string) 

в

smtpSettings.sendmail(sender, senderto, msg.as_string()) 

потому as_string это метод

0

Я сопровождающим yagmail, это пакет, который упрощает отправку писем (w с или без вложений).

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)