使用python发送邮件(一)

                                                   使用python来进行发邮件

想做个可以发邮件的程序。。。。最好是自动发邮件。这就是我今晚的目的,所以我今晚上就来进行学习了。主要还是来参考大神的博客。

廖雪峰的网站  

我主要是参考他的网站,小白一个没有经验算是现学现卖了,废话不多说现在进入主题

 


(1)发送纯文本文件

python对smtp支持有两个模块,一个是email和smtplib两个模块,email负责构造文件,smtplib负责发送文件,首先构造一个纯文本文件

1 from email.mime.text import MIMEText
2 
3 msg=MIMEText("hello world",'plain','utf-8')

这样我们使用email构造了一个纯文本的邮件内容,其中“helloworld是编码内容,plain表示的是纯文本内容,还有一种的html格式的,"utf-8"是编码方式

然后我们将使用smtp发送出去

# -*- coding: utf-8 -*-
#练习使用发送邮件
#Time:2018-8-24
from email.mime.text import MIMEText
import smtplib
msg=MIMEText("hello world",'plain','utf-8')

from_addr=input("账号:")
password=input,("密码:")
to_addr=input("发送账号:")
smtp_server=input("服务器地址:")
#导入smtplib,这是负责发送邮件模块
server=smtplib.SMTP(smtp_server,25)  #端口号25
server.set_debuglevel(1)
server.login(from_addr,password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

这是因为邮件主题、如何显示发件人、收件人等信息并不是通过SMTP协议发给MTA,而是包含在发给MTA的文本中的,所以,我们必须把FromToSubject添加到MIMEText中,才是一封完整的邮件:

这是一个纯文本文件,但是一般情况下是发送不成功的,我试过用网易的邮箱给qq的邮箱发送邮件,就没有成功,原因是服务器当作垃圾邮件拦截了,毕竟我们这个邮件没有标题,发送人等信息,这样的话会被拦截,所以接下来将一个可以发送成功的例子:

(2)可以发送带有标题的邮件

 1 # -*- coding: utf-8 -*-
 2 #练习使用发送邮件
 3 #Time:2018-8-24
 4 from email.mime.text import MIMEText
 5 from email.header import Header
 6 from email.mime.text import MIMEText
 7 from email.utils import parseaddr,formataddr
 8 import smtplib
 9 def _format_addr(s):
10     #来解析地址
11     name,addr=parseaddr(s)
12     return formataddr((Header(name,'utf-8').encode(),addr))
13 
14 from_addr=input("from_addr:")
15 password=input("password")
16 to_addr=input("to_addr")
17 smtp_server=input("server_addr:like<smtp.163.com><smtp.qq.com>...")
18 msg=MIMEText("hello world",'plain','utf-8')
19 msg['From']=_format_addr("python初学者 <%s>" %from_addr)
20 msg['To']=_format_addr("管理员 <%s>" %to_addr)
21 msg['Subject']=Header('标题来自我的问候','utf-8').encode()  #含有中文的涉及编码问题
22 
23 
24 #导入smtplib,这是负责发送邮件模块
25 server=smtplib.SMTP(smtp_server,25)  #端口号25
26 server.set_debuglevel(1)
27 server.login(from_addr,password)
28 server.sendmail(from_addr,[to_addr],msg.as_string())
29 server.quit()

理论上可以发送成功,这里需要注意一点,这个登陆密码不是你的邮箱的登陆密码,而是你邮箱的第三方授权码,这个要开通才可以登陆成功

(3)想做一个带附件的,好吧,继续努力

发送附件,如果想发送附件怎么办呢?带附件 的邮件可以看成,邮件本身,和附件。所以,我们构造一个MIMEMulitple对象,然后添加MIMEText最为邮件正文,然后再添加MIMEBase作为附件 。且看代码:

 1 # -*- coding: utf-8 -*-
 2 #练习使用发送邮件
 3 #Time:2018-8-24
 4 from email.mime.text import MIMEText
 5 from email.header import Header
 6 from email.mime.text import MIMEText
 7 from email.mime.multipart import MIMEMultipart
 8 from email.mime.base import MIMEBase
 9 from email.utils import parseaddr,formataddr
10 from email import encoders
11 import smtplib
12 def _format_addr(s):
13     #来解析地址
14     name,addr=parseaddr(s)
15     return formataddr((Header(name,'utf-8').encode(),addr))
16 
17 from_addr="111111@163.com"
18 password="111111S"
19 to_addr="11111@qq.com"
20 smtp_server="smtp.163.com"
21 
22 msg=MIMEMultipart()
23 #邮件正文
24 text=MIMEText("hello world",'plain','utf-8')
25 msg.attach(text)
26 msg['From']=_format_addr("python初学者 <%s>" %from_addr)
27 msg['To']=_format_addr("管理员 <%s>" %to_addr)
28 msg['Subject']=Header('标题来自我的问候','utf-8').encode()  #含有中文的涉及编码问题
29 #邮件附件
30 #添加附件就是添加MIMEBase 从本地读取一个图片
31 pathName = "C:/Users/sunchongwei/Pictures/自然风景/1.jpg"
32 with open(pathName,'rb') as f:
33     #设置附件和文件名
34     mime=MIMEBase('image','jpg',filename='1.jpg')
35     #加上必要的头信息
36     mime.add_header('Content-Disposition', 'attachment', filename='1.jpg')
37     mime.add_header('Content-ID','<0>')
38     mime.add_header('X-Attachment-Id', '0')
39     #把附件的内容读进来
40     mime.set_payload(f.read())
41     encoders.encode_base64(mime)
42     msg.attach(mime)
43 
44 #导入smtplib,这是负责发送邮件模块
45 server=smtplib.SMTP(smtp_server,25)  #端口号25
46 server.set_debuglevel(1)
47 server.login(from_addr,password)
48 server.sendmail(from_addr,[to_addr],msg.as_string())
49 server.quit()

(4)通过SSL加密发送

# -*- coding: utf-8 -*-
#练习使用发送邮件
#Time:2018-8-24
from email.mime.text import MIMEText
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.utils import parseaddr,formataddr
from email import encoders
import smtplib
def _format_addr(s):
    #来解析地址
    name,addr=parseaddr(s)
    return formataddr((Header(name,'utf-8').encode(),addr))

from_addr="@163.com"
password=""
to_addr=""
smtp_server="smtp.163.com"

msg=MIMEMultipart()
#邮件正文
text=MIMEText("hello world",'plain','utf-8')
msg.attach(text)
msg['From']=_format_addr("python初学者 <%s>" %from_addr)
msg['To']=_format_addr("管理员 <%s>" %to_addr)
msg['Subject']=Header('标题来自我的问候','utf-8').encode()  #含有中文的涉及编码问题
#邮件附件
#添加附件就是添加MIMEBase 从本地读取一个图片
pathName = "C:/Users/sunchongwei/Pictures/自然风景/1.jpg"
with open(pathName,'rb') as f:
    #设置附件和文件名
    mime=MIMEBase('image','jpg',filename='1.jpg')
    #加上必要的头信息
    mime.add_header('Content-Disposition', 'attachment', filename='1.jpg')
    mime.add_header('Content-ID','<0>')
    mime.add_header('X-Attachment-Id', '0')
    #把附件的内容读进来
    mime.set_payload(f.read())
    encoders.encode_base64(mime)
    msg.attach(mime)

#导入smtplib,这是负责发送邮件模块
server=smtplib.SMTP_SSL(smtp_server,465)  #端口号465
server.set_debuglevel(1)
server.login(from_addr,password)
server.sendmail(from_addr,[to_addr],msg.as_string())
server.quit()

 

网易的端口号

大家都知道的。。。


写下心情:好不容易哦

posted @ 2018-08-24 14:40  sunchongwei  阅读(199)  评论(0编辑  收藏  举报