利用Python发送带图片和附件的邮件

最近在学爬虫的时候,偶然看到了这个,然后就尝试着写了个脚本。python真的用途很广。写这个脚本的目的在于,是希望利用Selenium做自动化测试时能把错误的截图以及日志及时保存下来并发到指定邮箱,这样十分有利于后期的维护。那么话不多说,Show  me the code!

# coding:utf-8
import smtplib
import os
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email import encoders
from email.mime.base import MIMEBase
from email.utils import parseaddr, formataddr
import base64
from email.mime.image import MIMEImage
import traceback


class SendMail(object):
    def __init__(self, title=None, content=None,
                 file=None, image=None, ssl_port=465):

        '''
               :param username: 用户名
               :param passwd: 密码
               :param recv: 收件人,多个要传list ['a@qq.com','b@qq.com]
               :param title: 邮件标题
               :param content: 邮件正文
               :param image: 图片路径,绝对路径,默认为无图片
               :param file: 附件路径,如果不在当前目录下,要写绝对路径,默认没有附件
               :param ssl: 是否安全链接,默认为安全链接
               :param email_host: smtp服务器地址,默认为qq服务器
               :param ssl_port: 安全链接端口,默认为465
        '''

        self.username = "12345678@qq.com"  # 用户名(发件人的邮箱账号或用户名)
        self.passwd = "tjvsdvsvfkdidvgh"  # 16位的SMTP授权码(不含空格)
        self.recv = ['a@qq.com','b@qq.com] # 收件人,多个要传list ['a@qq.com','b@qq.com]
        self.title = title  # 邮件标题
        self.content = content  # 邮件正文
        self.file = file  # 绝对路径
        self.image = image  # 图片路径(绝对路径)
        self.email_host = 'smtp.qq.com'  # smtp服务器地址,默认为qq邮箱的服务器
        self.ssl = True,  # 是否安全链接
        self.ssl_port = ssl_port  # 安全链接端口
        # 构造一个MIMEMultipart对象代表邮件本身
        self.message = MIMEMultipart()

    # 添加文件到附件
        if self.file:
            file_name = os.path.split(self.file)[-1]  # 只取文件名,不取路径
            try:
                f = open(self.file, 'rb').read()
            except Exception as e:
                traceback.print_exc()
            else:
                att = MIMEText(f, "base64", "utf-8")
                att["Content-Type"] = 'application/octet-stream'
                # base64.b64encode(file_name.encode()).decode()
                new_file_name = '=?utf-8?b?' + base64.b64encode(file_name.encode()).decode() + '?='
                # 处理文件名为中文名的文件
                att["Content-Disposition"] = 'attachment; filename="%s"' % (new_file_name)
                self.message.attach(att)


    # 添加图片到附件

        if self.image:
            image_name = os.path.split(self.image)[-1]  # 只取文件名和后缀,不取路径
            try:
                with open(self.image, 'rb') as f:
                    # 图片添加到附件
                    mime = MIMEBase('image', 'image', filename=image_name)
                    mime.add_header('Content-Disposition', 'attachment', filename=image_name)
                    mime.set_payload(f.read())
                    encoders.encode_base64(mime)
                    self.message.attach(mime)
                with open(self.image,'rb') as f:
                    # 将图片显示在邮件正文中
                    msgimage = MIMEImage(f.read())
                    msgimage.add_header('Content-ID', '<image1>')# 指定文件的Content-ID,<img>,在HTML中图片src将用到
                    self.message.attach(msgimage)
            except Exception as e:
                traceback.print_exc()


    def send_mail(self):
        self.message.attach(MIMEText(self.content, 'html', 'utf-8'))  # 正文内容   plain代表纯文本,html代表支持html文本
        self.message['From'] = self.username  # 发件人
        self.message['To'] = ','.join(self.recv)  # 收件人
        self.message['Subject'] = self.title  # 邮件标题
        self.smtp = smtplib.SMTP_SSL(self.email_host, port=self.ssl_port)
        # 发送邮件服务器的对象
        self.smtp.login(self.username, self.passwd)
        try:
            self.smtp.sendmail(self.username, self.recv, self.message.as_string())
            pass
        except Exception as e:
            resultCode = 0
            traceback.print_exc()
        else:
            result = "邮件发送成功!"
            print(result)
            resultCode = 1
        self.smtp.quit()
        return resultCode  # 定义一个邮件发送结果参数,1为发送成功,0为发送失败。


if __name__ == "__main__":
    content = '''
               <h1>邮件测试</h1>
               <p>图片展示:</p>
               <p><img src="cid:image1"></p>
             '''
    file = "D:\\Python\\Demo\\MyPyDemo\\Test\\log\\1.log"
    image = "D:\\Python\\Demo\\MyPyDemo\\project2\\depository\\pic\\3.jpg"
    m = SendMail("UNTITLE",content=content,file = file,image=image)
    m.send_mail()

 首先,要实现上述功能,得确保自己的邮箱开启了SMTP服务,下面是qq邮箱的开启方法,其他邮箱应该也类似。其次还得获得授权码,用qq安全中心扫一下二维码就行,也很简单。

 另附上在Java中调用python脚本的方法,可以在Java中调用上面这个脚本,用来传日志什么的还是挺不错的,哈哈!

https://blog.csdn.net/hzw19920329/article/details/77509497

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daimashiren

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值