1、登录smtp服务器
首先使用网上的方法(这里使用163邮箱,smtp.163.com是smtp服务器地址,25为端口号):
import smtplibserver = 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 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 smtplibserver = smtplib.smtp('smtp.163.com', 25)server.login('j_hao104@163.com', 'clientpassword')
此时便返回登录成功提示:
(235, 'authentication successful')
2、发送邮件
首先使用网上给出的代码:
import smtplibfrom email.mime.text import mimetextserver = 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 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 smtplibfrom email.header import headerfrom email.mime.text import mimetextserver = 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 'msg['subject'] = header(u'text', 'utf8').encode()msg['to'] = u'飞轮海 'server.sendmail('j_hao104@163.com', ['946150454@qq.com'], msg.as_string())
这样就能成功发出邮件啦
msg里的具体信息可以用一般发邮件方式发封邮件测试下
3、参考示例
import smtplibfrom email.mime.text import mimetextto_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 + # _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, 这个是一个邮件, hello, it's test email.)