2017-09-26 144 views
0

我想用python发送一封电子邮件,附件。这里是我的代码:Python 3.6 - 从Python发送电子邮件

import smtplib 
from email.mime.multipart import MIMEMultipart 
from email.mime.text import MIMEText 
from email.mime.base import MIMEBase 
from email import encoders 

fromaddr = "[email protected]" 
toaddr = "[email protected]" 

msg = MIMEMultipart() 

msg['From'] = fromaddr 
msg['To'] = toaddr 
msg['Subject'] = "Testing Python Email - Plus Attachments" 

body = "This is an automated email" 

msg.attach(MIMEText(body, 'plain')) 

filename = "nice.png" 
attachment = open("C:\\Users\\Ben Hannah\\Documents", "rb") 

part = MIMEBase('application', 'octet-stream') 
part.set_payload((attachment).read()) 
encoders.encode_base64(part) 
part.add_header('Content-Disposition', "attachment; filename= %s" % filename) 

msg.attach(part) 

server = smtplib.SMTP('smtp.office365.com', 587) 
server.starttls() 
server.login(fromaddr, "************") 
text = msg.as_string() 
server.sendmail(fromaddr, toaddr, text) 
server.quit() 

而这正是它给回:

Traceback (most recent call last): 
    File "C:\Users\Ben Hannah\AppData\Local\Programs\Python\Python36-32\lib\base64.py", line 517, in _input_type_check 
    m = memoryview(s) 
TypeError: memoryview: a bytes-like object is required, not 'NoneType' 

The above exception was the direct cause of the following exception: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Users\Ben Hannah\AppData\Local\Programs\Python\Python36-32\lib\email\encoders.py", line 32, in encode_base64 
    encdata = str(_bencode(orig), 'ascii') 
    File "C:\Users\Ben Hannah\AppData\Local\Programs\Python\Python36-32\lib\base64.py", line 534, in encodebytes 
    _input_type_check(s) 
    File "C:\Users\Ben Hannah\AppData\Local\Programs\Python\Python36-32\lib\base64.py", line 520, in _input_type_check 
    raise TypeError(msg) from err 
TypeError: expected bytes-like object, not NoneType 

电子邮件发送,邮箱临危一下,看看是一个附件 - 但试图打开它的时候,它说,无法打开文件。

+0

是否不带附件的工作吗? –

回答

2

您忘记了在open中包含文件名。

filename = "nice.png" 
attachment = open("C:\\Users\\Ben Hannah\\Documents", "rb") 

尝试,

attachment = open("C:\\Users\\Ben Hannah\\Documents\\" + filename, "rb") 
+0

嗨!这很有道理谢谢你!你能告诉我如何让这封电子邮件每小时自动运行一次,我会使用循环还是递归? –

+0

我会使用一些调度工具。这里有一些用于Windows的选项:https://stackoverflow.com/questions/132971/what-is-the-windows-version-of-cron – balki