您的位置:首页 > 编程语言 > Python开发

Python使用smtplib模块发送电子邮件的流程详解

2016-06-27 00:00 1166 查看
1、登录SMTP服务器

首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址,25为端口号):

import smtplib
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'password')
Traceback (most recent call last):
File "C:/python/t.py", line 192, in <module>
server.login('j_hao104@163.com', 'password')
File "C:\Python27\lib\smtplib.py", line 622, in login
raise SMTPAuthenticationError(code, resp)
smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')


发现返回:

smtplib.SMTPAuthenticationError: (535, 'Error: authentication failed')


,提示验证失败。

有说python不支持SMTP服务,或是服务没开启之类的。但是我想起上次我用foxmail登录我的163邮箱的时候,邮箱密码都输对了还是提示我密码错误,最后的解决办法是:像QQ和163邮箱现在都有个客户端密码,用第三方登录时需用客户端密码登录才行,python也是如此,因此去设置好客户端密码,再用客户端密码登录。



import smtplib
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')


此时便返回登录成功提示:

(235, 'Authentication successful')


2、发送邮件

首先使用网上给出的代码:

import smtplib
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())


构造MIMEText对象时,第一个参数是邮件正文,第二个参数是MIME的subtype,最后个是编码方式。

sendmail是发邮件方法,第一个参数是发件邮箱,第二个参数是收件人邮箱,是一个列表,代表可以同时发给多个人,as_string是把MIMEText对象变成str。

但是执行结果并不能得到网上说的结果:



而是:

Traceback (most recent call last):
File "C:/python/t.py", line 195, in <module>
server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())
File "C:\Python27\lib\smtplib.py", line 746, in sendmail
raise SMTPDataError(code, resp)
smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11,D8CowEDpDkE427JW_wQIAA--.4996S2 1454562105,please see http://mail.163.com/help/help_spam_16.htm?ip=171.221.144.51&hostid=smtp11&time=1454562105')


网上一查才知道:smtplib.SMTPDataError: (554, 'DT:SPM 163 smtp11……的错误是因为信封发件人和信头发件人不匹配。可以看出看出图片中并没有发件人和主题,所以需要对代码做如下修改:

import smtplib
from email.header import Header
from email.mime.text import MIMEText
server = smtplib.SMTP('smtp.163.com', 25)
server.login('j_hao104@163.com', 'clientPassword')
msg = MIMEText('hello, send by Python...', 'plain', 'utf-8')
msg['From'] = 'j_hao104@163.com <j_hao104@163.com>'
msg['Subject'] = Header(u'text', 'utf8').encode()
msg['To'] = u'飞轮海 <jinghao5849312@qq.com>'
server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())


这样就能成功发出邮件啦

msg里的具体信息可以用一般发邮件方式发封邮件测试下



3、参考示例



import smtplib
from email.mime.text import MIMEText

to_list = ['123@123.com', '456@456.com']
server_host = 'smtp.163.com'

username = '你的邮箱账号'
password = '你的邮箱密码'

def send(to_list, sub, content):
'''
:param to_list: 收件人邮箱
:param sub: 邮件标题
:param content: 内容
'''
me = "manager" + "<" + username + ">"
# _subtype 可以设为html,默认是plain
msg = MIMEText(content, _subtype='html')
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ';'.join(to_list)
try:
server = smtplib.SMTP()
server.connect(server_host)
server.login(username, password)
server.sendmail(me, to_list, msg.as_string())
server.close()
except Exception as e:
print str(e)

if __name__ == '__main__':
send(to_list, "这个是一个邮件", "<h1>Hello, It's test email.</h1>")


您可能感兴趣的文章:

Python使用email模块对邮件进行编码和解码的实例教程
python实现SMTP邮件发送功能
Linux 发邮件磁盘空间监控(python)
python 七种邮件内容发送方法实例
python发送邮件的实例代码(支持html、图片、附件)
python中使用smtplib和email模块发送邮件实例
Python群发邮件实例代码
详细讲解用Python发送SMTP邮件的教程
Python实现给qq邮箱发送邮件的方法
二种python发送邮件实例讲解(python发邮件附件可以使用email模块实现)
Python使用poplib模块和smtplib模块收发电子邮件的教程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python 邮件