python发送带附件的邮件
今天面要用将gradle打包的apk邮件发送给某些成员,jenkins自带的邮件没有这个功能,我就想自己实现一个以备后用,于是还是用我喜欢的python实现了一个:
首先习惯性的写配置:创建一个settings.py文件
# -*-coding:utf-8 -*- import os #邮件配置 EMAIL = { 'host': 'smtp.mailgun.org', #邮件服务器地址 'user': 'xxxx@qq.com', #发件用户名 'port': 587, 'password': 'xxxxxx', #发件人密码 'nickname': '牛B的管理员', 'mail_debug': True, 'mail_ssl':True }
然后就是邮件发送的实现方法:
# -*-coding:utf-8 -*- import settings import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEBase from email.mime.multipart import MIMEMultipart import mimetypes from email import encoders import os import time # 发送带附件的邮件 def ToMail(mailto, subject, body, attachments='', format='plain'): ''' :param mailto: 发送邮件对象(发送人),可以为列表或字符串 :param subject: 邮件标题 :param body: 邮件主体内容 :param attachments: 邮件附件 :param format: 邮件页面对像 :return: True or False ''' if isinstance(body, unicode): body = str(body) me= settings.EMAIL.get('nickname') + "<"+settings.EMAIL.get('user')+">" msg = MIMEMultipart() bo = MIMEText(body, format, 'utf-8') if not isinstance(subject, unicode): subject = str(subject) if isinstance(mailto, list): msg['To'] = ";".join(mailto) else: msg['To'] = mailto msg.attach(bo) msg['Subject'] = subject msg['From'] = me msg["Accept-Language"]="zh-CN" msg["Accept-Charset"]="ISO-8859-1,utf-8" #**************************************** #载入附件 if isinstance(attachments, list): for file in attachments: data = open(file.decode('utf-8').encode('gbk'), 'rb') ctype,encoding = mimetypes.guess_type(file) if ctype is None or encoding is not None: ctype = 'application/octet-stream' maintype,subtype = ctype.split('/',1) file_msg = MIMEBase(maintype, subtype) file_msg.set_payload(data.read()) data.close() encoders.encode_base64(file_msg) #*************************************************************** # 如果附件名称含有中文, 则 filename 要转换为gb2312编码, 否则就会出现乱码.basename.decode('utf-8').encode('gb2312') filename = os.path.basename(file) file_msg.add_header('Content-Disposition', 'attachment; filename="%s"' % filename.decode('utf8').encode('gb2312')) msg.attach(file_msg) try: server = smtplib.SMTP(settings.EMAIL.get('host'), port=settings.EMAIL.get('port'), timeout=30) server.debuglevel=settings.EMAIL.get('mail_debug') if settings.EMAIL.get('mail_ssl'): server.starttls() server.login(settings.EMAIL.get('user'), settings.EMAIL.get('password')) server.sendmail(me, mailto, msg.as_string()) return True finally: server.close() return False #************************************************** #由于使用的国外的邮件服务器,有些不稳定所以给予三次重发机会 a = 0 while True: a+= 1 if a <= 3: status = ToMail(['ffffff@qq.com'], 'aaaaaaaaaaaa', 'aaaaaaaaaaaaa', attachments=['G:/xxx/xxx/xxxxxx.apk']) if status: break else: time.sleep(1) else: break
邮箱:d1988505j@163.com
qq:690455420