在使用gitlab-CICD整合robotframework时,需要将RF执行的结果发用到指定邮箱,gitlab-runner是docker模式的,第一次的时候用的

linux mailx实现的,但感觉太麻烦了,需要手动制作证书,且受环境影响,应该是centos7制作了证书,但是发邮件的时候出错了,导致

发送不成功只能用centos8。故采用python 的smtplib 进行发送邮件,没想到效果非常的好。(记录下来)

python代码发送邮件

 1、需要发送附件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
import sys
#需要使用python xxx.py 参数1 参数2执行py文件,所以通过sys.argv进行获取参数
mailtolist=str(sys.argv[1]).split(",")
libs=str(sys.argv[2]).split(",")
#构造html格式的内容
msg="""
<p>   附件是自动化测试报告,请查收</p>
"""
#构建一个带附件的事例
message=MIMEMultipart()

#邮件内容(以html的格式发送邮件)
content=MIMEText(msg,"html","utf-8")
#设置邮件内容接受者(显示的)
message['To']=Header("; ".join(mailtolist),"utf-8")
#设置邮件内容发送者(显示的)
message["From"]=Header('1191945907@qq.com','utf-8')
#设置邮件标题
message['Subject']=Header("【测试报告】Gitlab CICD自动化测试报告",'utf-8')

#将邮件内容加入到带有附件的事例中
message.attach(content)
#构造第一个附件
# lib1=MIMEText(open(r"C:\Users\Administrator\Desktop\Yovi.jpg",'rb').read(),'base64','utf-8')
# lib1["Content-Type"] = 'application/octet-stream'
# lib1["Content-Disposition"] = 'attachment; filename="Abby.jpg"'
# #将附件加入到邮件中
# message.attach(lib1)

for i in range(0,len(libs)):
     lib = MIMEText(open(libs[i], 'rb').read(), 'base64', 'utf-8')
     lib["Content-Type"] = 'application/octet-stream'
     lib["Content-Disposition"] = 'attachment; filename="{}"'.format(libs[i].split("\\")[-1])
     # 将附件加入到邮件中
     message.attach(lib)

smtp=smtplib.SMTP_SSL('smtp.qq.com',465)
#调试代码的时候可以打开
#smtp.set_debuglevel(1)
#登录第三方邮件服务(第一个参数是qq邮箱,第二个参数是qq邮箱的授权码)
smtp.login("XXX@qq.com",'XXXXX')
#发送邮件
try:
    smtp.sendmail("qq邮箱",mailtolist,message.as_string())
    print("邮件发送成功")
except smtplib.SMTPException:
    print("邮件发送失败")
#退出
smtp.quit()

2、不需要发送附件
import smtplib
from email.mime.text import MIMEText
from email.header import Header

#构造html格式的内容
msg="""
<p>点击领取你的100万元奖励!!!</p>
<p><a href="http://www.xiaomi.com">点击链接</a></p>
"""
#邮件内容(以html的格式发送邮件)/不需要html格式的,可以换为html换成plain
email=MIMEText(msg,"html","utf-8")
#设置邮件内容接受者(显示的)
email['To']=Header("赵大大","utf-8")
#设置邮件内容发送者(显示的)
email["From"]=Header('XXXqq.com','utf-8')
#设置邮件标题
email['Subject']=Header("请注意,这是一封钓鱼邮件!!!",'utf-8')
smtp=smtplib.SMTP_SSL('smtp.qq.com',465)
#调试代码的时候可以打开
#smtp.set_debuglevel(1)
#登录第三方邮件服务(第一个参数是qq邮箱,第二个参数是qq邮箱的授权码)
smtp.login("XXX@qq.com",'XXXXX')
#发送邮件
try:
    smtp.sendmail("qq邮箱","XXX@163.com",email.as_string()

    print("邮件发送成功")
except smtplib.SMTPException:
    print("邮件发送失败")
#退出
smtp.quit()
通过linux 的mailx(163邮箱) 实现发送邮件(centos8)
  25端口不可用,所以使用465端口,需要制作ssl
yum -y install mailx postfix 
    yum -y install nss-too
  
    mkdir -p /root/.certs/
echo -n | openssl s_client -connect smtp.163.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/163.crt
    certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/163.crt
    certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/163.crt
    certutil -L -d /root/.certs
    cd /root/.certs/
    certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d ./ -i 163.crt
    echo -e "set from=hexiaohec@163.com\nset smtp=smtps://smtp.163.com:465\nset smtp-auth-user=邮箱名称\nset smtp-auth-password=邮箱授权码\nset smtp-auth=login\nset ssl-verify=ignore\nset nss-config-dir=/root/.cert" >> /etc/mail.rc
    chmod -R 777 /root/.certs/
    mail -v -s "test" -a /home/result/rfreport/CICD_Report.html  hexiaohec@163.com  < /root/.certs/163.crt