用python发送邮件 smtp

来源:互联网 发布:淘宝秒杀群怎么建立 编辑:程序博客网 时间:2024/04/30 16:52

看了廖雪峰老师的教程,决定试试看能不能发送,试验用的是自己去QQ邮箱,首先要去QQ邮箱开启pop和SMTP服务才可以,下面是老师的代码块:

from email.mime.text import MIMETextmsg = MIMEText('hello, send by Python...', 'plain', 'utf-8')# 输入Email地址和口令:from_addr = raw_input('From: ')password = raw_input('Password: ')# 输入SMTP服务器地址:smtp_server = raw_input('SMTP server: ')# 输入收件人地址:to_addr = raw_input('To: ')import smtplibserver = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25server.set_debuglevel(1)server.login(from_addr, password)server.sendmail(from_addr, [to_addr], msg.as_string())server.quit()

输入自己对应的QQ邮箱和密码之后,报错了:

 raise SMTPServerDisconnected("Connection unexpectedly closed")smtplib.SMTPServerDisconnected: Connection unexpectedly closed

百度了一下说是端口问题,尝试将SMTP端口换成465或者587,两个都试了一下:

 raise SMTPAuthenticationError(code, resp)smtplib.SMTPAuthenticationError: (530, b'Must issue a STARTTLS command first.')

说明不是端口的问题,继续百度说是输入密码不是自己的密码,而是授权码,这就需要在QQ邮箱设置那里点击授权码的时候发送短信,然后获得授权码了,获得授权码之后再次运行,还是不行,再检查,发现别人的成功案例,在原基础上写多一句代码:

from email.mime.text import MIMETextmsg = MIMEText('hello, send by Python...', 'plain', 'utf-8')# 输入Email地址和口令:from_addr = raw_input('From: ')password = raw_input('Password: ')# 输入SMTP服务器地址:smtp_server = raw_input('SMTP server: ')# 输入收件人地址:to_addr = raw_input('To: ')import smtplibserver = smtplib.SMTP(smtp_server, 25) # SMTP协议默认端口是25server.set_debuglevel(1)server.starttls()server.login(from_addr, password)server.sendmail(from_addr, [to_addr], msg.as_string())server.quit()

运行之后成功发送邮件
这里有个问题就是,用QQ邮箱发送邮件,一个是没有主题等信息,还有就是发送到其他邮箱会被认为是垃圾邮件,只有QQ邮箱自己才不会。
决定改动代码,参考廖雪峰老师:

#-*- coding:utf-8 -*-from email import encodersfrom email.header import Headerfrom email.mime.text import MIMETextimport  smtplibfrom_addr=input('From:')password=input('password:')to_addr=input('To:')smtp_server=input('SMTP server:')msg=MIMEText('hello,send by python...','plain','utf-8')msg['From']=Header('python爱好者','utf-8')msg['To']=Header('管理员','utf-8')msg['Subject']=Header('来自SMTP的问候','utf-8')server=smtplib.SMTP(smtp_server,25)server.set_debuglevel(1)server.starttls()server.login(from_addr,password)server.sendmail(from_addr,[to_addr],msg.as_string())server.quit()

上面有些改动,我的是python3.5的版本,3.6还有很多不稳定,所以不敢升级,发送的邮件有主题和发件人,下面做具体的分析。
SMTP,即简单邮件传输协议,由它来控制信件的中转方式,python的smtplib就提供了一种很方便的途径发送电子邮件:

import smtplibobj=smtplib.SMTP([host [, port [, local_hostname]]])
  • 其中host是指SMTP服务器自己,需要指定主机的IP地址或者域名,例如smtp.qq.com
  • port:提供指定SMTP服务器的使用端口号,一般都是25
  • local_hostname:如果SMTP在你的本机上,你只需要指定服务器的地址为localhost即可,一般不用理会
    python SMTP对象使用sendmail方式发送邮件,语法如下:
SMTP.sendmailfrom_addr,to_addrs,msg[,mail_options,rcpt_options]
  • from_addr:邮件发送者地址
  • to_addrs:字符串列表,可以用[]括起来,邮件发送地址
  • msg:发送信息

第三个参数,msg是字符串,表示邮件,我们知道的邮件一般是由标题,发信人,收件人,邮件内容,附件等构成,发送邮件的时候,要注意msg的格式,这个格式是SMTP协议中定义的格式
MIMEText构建对象时,第一个参数就是邮件正文,第二个参数就是MIMEsubtype,传入‘plain’表示纯文本,最终的MIME就是‘text/plain’,最后用‘utf-8’或者‘as-ascii’编码来保证多语言的兼容

smtplib.SMTP.set_debuglevel(1)

可以打印和SMTP服务器交互的所有信息,设置是否为调试模式。默认为False,即非调试模式,表示不输出任何调试信息
login()方法用来登录SMTP服务器

Header,根据官网的文档说明,用来连接不同编码的文本,会统一编码格式,直接在括号里面标明utf-8

smtplib.SMTP.connect([host[, port]])

连接到指定的smtp服务器。参数分别表示smpt主机和端口。注意: 也可以在host参数中指定端口号(如:smpt.yeah.net:25),这样就没必要给出port参数。

smtplib.SMTP.starttls(keyfile=None, certfile=None, context=None)

使用标准的25端口连接SMTP服务器时,使用的是明文传输,发送邮件的整个过程可能会被窃听。要更安全地发送邮件,可以加密SMTP会话,实际上就是先创建SSL安全连接,然后再使用SMTP协议发送邮件。只需要在创建SMTP对象后,立刻调用starttls()方法,就创建了安全连接。官方文档说需要再跳用ehlo()方法,但是我这里没有调用就成功了

原创粉丝点击