Python启用SMTP服务发送QQ邮件
开启QQ邮箱的SMTP功能,打开邮箱首页——设置——帐户——帐户安全,然后点击启用,再短信验证即可。 Python自带smtplib和email两个发送邮箱相关的库。前者负责连接第三方SMTP服务器,后者主要用来构造邮箱内容。网站看了一大堆有关email的文章,但总感觉用的不爽。 自己撸了一个Mail类实现邮件的发送。其中,__init__
方法初始化SMTP服务配置信息;send
方法实现邮件内容的构造及发送,参数sender
发送人,是一个元组(addr, nickname)
,参数tolist
主送人和cclist
抄送人是一个元组型列表[(addr, nickname),]
,参数bclist
密送人是一个列表[addr, ]
,参数subject
邮件主题,参数content
邮件内容。其中,收发方的昵称<可空缺>、主题、内容<默认网页形式>需要base64
编码。
import re, base64, smtplib
class Mail ( object ) :
def __init__ ( self, useraddr, password, host= 'smtp.qq.com' , port= 465 ) :
super ( Mail, self) . __init__( )
self. host, self. port = host, port
self. useraddr, self. password = useraddr, password
def send ( self, sender, tolist, subject, content, cclist= None , bclist= None ) :
temp = [ ]
temp. append( ( 'Content-Type' , 'text/html; charset="utf-8"' ) )
temp. append( ( 'MIME-Version' , '1.0' ) )
temp. append( ( 'Content-Transfer-Encoding' , 'base64' ) )
temp. append( ( 'Subject' , '=?utf-8?b?%s?=' % self. to_b64( subject) ) )
temp. append( ( 'From' , self. to_str( sender) ) )
temp. append( ( 'To' , ',' . join( [ self. to_str( i) for i in tolist] ) ) )
if cclist:
temp. append( ( 'Cc' , ',' . join( [ self. to_str( i) for i in cclist] ) ) )
text = '\n' . join( [ '%s: %s' % ( k, v) for k, v in temp] ) + '\n\n'
text += '\n' . join( re. sub( r'(.{76})' , r'\1\n' , self. to_b64( content) ) )
sendaddr = sender[ 0 ]
recvaddr = list ( list ( zip ( * tolist) ) [ 0 ] )
if cclist:
recvaddr += list ( list ( zip ( * cclist) ) [ 0 ] )
if bclist:
recvaddr += bclist
try :
smtp = smtplib. SMTP_SSL( self. host, self. port)
print ( '链接成功' )
smtp. login( self. useraddr, self. password)
print ( '登录成功' )
smtp. sendmail( sendaddr, recvaddr, text)
print ( '发送成功' )
smtp. quit( )
except Exception as e:
print ( e)
def to_str ( self, addr) :
if len ( addr) == 2 :
return '=?utf-8?b?%s?= <%s>' % ( self. to_b64( addr[ 1 ] ) , addr[ 0 ] )
else :
return '<%s>' % addr[ 0 ]
def to_b64 ( self, text) :
return base64. b64encode( text. encode( 'utf-8' ) ) . decode( 'utf-8' )