首页 > 编程语言 >Python 发送邮件的几种情况

Python 发送邮件的几种情况

时间:2022-10-21 17:45:20浏览次数:43  
标签:Python import 发送 html receiver msg mail 邮件

本次记录一下Python发送邮件的几种情况:

1、正常发送

2、正文带图片

3、正文带表格

4、正文带附件

 

首先来看一下Python发送邮件使用到的模块

## 导入模块
from email.mime.text import MIMEText
import smtplib

先说一下email模块的mime

from email.mime.text import MIMEText    
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart    

MIMEText对象:表示一个文本邮件对象;

MIMEImage对象:表示一个邮件正文图片对象;

MIMEMultipart对象:代表将个多对象组合在一起

MIMEText对象中有三个需要我们设置的参数,一个是正文内容,一个是正文内容的类型,例如:”text/plain”和”text/html”,一个是正文内容的编码

MIMEMultipart对象:三种类型型:mixed、alternative、related

(1)mixed:默认值,基本都使用这种,邮件中有附件,则必须使用该种

(2)alternative:邮件中同时存在纯文本和超文本内容

(3)related:发送html格式的邮件内容时,可能使用图像作为 html的背景,html文本会被存储在alternative段中,而作为背景的图像则会存储在multipart/related类型定义的段中

一、正常发送

## 导入模块
from email.mime.text import MIMEText
import smtplib mail_host = "xxx.163.com" #SMTP服务器地址 mail_sender = "xxx.com" #账号 mail_passwd = "xxx" #密码 ## 构造邮件内容 msg = MIMEText("这里是邮件正文内容",'plain','utf-8') msg["Subject"] = "这里是邮件主题" msg["From"] = mail_sender #发送人 to_receiver=['xxx'] #收件人邮箱,多个人就是要list cc_reciver=['xxx'] #抄送邮箱 receiver = cc_reciver + to_receiver msg["To"] = ";".join(receiver) #接收人 但是这个不区分收件人和抄送,不过也无关痛痒 ## 发送邮件 s = smtplib.SMTP() #实例化对象 s.connect(mail_host) #连接163邮箱服务器,端口号为465,注意,这里不需要写端口号,有些需要写端口,需要写的话就直接写数字 s.login(mail_sender, mail_passwd) #登录邮箱 s.sendmail(mail_sender, receiver, msg.as_string()) s.quit()

看效果

 

 

 二、正文带图片

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
import smtplib

mail_host = "xxx.163.com" #SMTP服务器地址
mail_sender = "xxx.com" #账号
mail_passwd = "xxx" #密码

msg = MIMEMultipart('related')
msg["Subject"] = "测试Python-发送邮件在正文带图片"
msg["From"] = mail_sender #发送人
to_receiver=['xxx'] #收件人邮箱,多个人就是要list
cc_reciver=['xxx']  #抄送邮箱
receiver = cc_reciver  + to_receiver
msg["To"] = ";".join(receiver) #接收人

#html格式的邮件正文
content = '''
<body>
<p>元宝</p>
<p>图片如下:</p>
<p><img src="cid:testimage" alt="testimage"></p>
</body>
'''
msg.attach(MIMEText(content,'html','utf-8'))

#读取图片
fp = open('元宝.jpg', 'rb')  #打开文件
msgImage = MIMEImage(fp.read(), _subtype=False) #读入 msgImage 中
fp.close() #关闭文件

# 定义图片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', 'testimage') #
msg.attach(msgImage)

## 发送邮件
s = smtplib.SMTP() #实例化对象
s.connect(mail_host) #连接163邮箱服务器,端口号为465,注意,这里不需要写端口号
s.login(mail_sender, mail_passwd) #登录邮箱
s.sendmail(mail_sender, receiver, msg.as_string())
s.quit()

看效果

 

 

 如果想插入2张(或者2张以上)图片,则可以这样

#html格式的邮件正文
content = '''
<body>
<p>元宝</p>
<p>图片如下:</p>
<p><img src="cid:testimage1" alt="testimage1"></p>
<p><img src="cid:testimage2" alt="testimage2"></p>
</body>
'''
msg.attach(MIMEText(content,'html','utf-8'))

#读取图片
fp = open('元宝.jpg', 'rb')  #打开文件
msgImage1 = MIMEImage(fp.read(), _subtype=False) #读入 msgImage 中
fp.close() #关闭文件

fp = open('粽子.jpg', 'rb')  #打开文件
msgImage2 = MIMEImage(fp.read(), _subtype=False) #读入 msgImage 中
fp.close() #关闭文件

# 定义图片 ID,在 HTML 文本中引用
msgImage1.add_header('Content-ID', 'testimage1') 
msg.attach(msgImage1)
msgImage2.add_header('Content-ID', 'testimage2') 
msg.attach(msgImage2)

最后效果

 

 

 

 

 

 三、正文带表格

正文带表格有2中方式,一种直接在邮件正文里面增加html,然后再html里面一行一列写入数据,但是这种方法太笨重

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.mime.image import MIMEImage

mail_host = "xxx.com" #SMTP服务器地址
mail_sender = "xxx.com" #账号
mail_passwd = "xxx" #密码

msg = MIMEMultipart('related')
msg["Subject"] = "测试Python-发送邮件在正文带表格"
msg["From"] = mail_sender #发送人
to_receiver=['xxx.com'] #收件人邮箱,多个人就是要list
#cc_reciver=['xxx.com']  #抄送邮箱
receiver = cc_reciver  + to_receiver
msg["To"] = ";".join(receiver) #接收人

#html格式的邮件正文
content = '''
<html>
<body>
<p><strong>这是加粗字体,可以是一个标题</strong></p>
<p>下面是一个表格,表格格式可以随意设置</p>
<table width="500" bordercolor="black" border="1" cellspacing="0">
 <tr>
  <td><strong>列名1</strong></td>
  <td><strong>列名2</strong></td>
  <td><strong>列名3</strong></td>
 </tr>
 <tr>
  <td>str1</td>
  <td>10</td>
  <td>2019-01-01</td>
 </tr>
 <tr>
  <td>str2</td>
  <td>20</td>
  <td>2019-01-02</td>
 </tr>
 <tr>
  <td>str3</td>
  <td>30</td>
  <td>2019-01-03</td>
 </tr>
</table>
</body>
</html>
'''
msg.attach(MIMEText(content,'html','utf-8'))

## 发送邮件
s = smtplib.SMTP() #实例化对象
s.connect(mail_host) #连接163邮箱服务器,端口号为465,注意,这里不需要写端口号
s.login(mail_sender, mail_passwd) #登录邮箱
s.sendmail(mail_sender, receiver, msg.as_string())
s.quit()

结果如下:

 

 

 我们想要的是直接将pandas 的df 放到里面,或者Excel表放到里面,而不是手动一行一列写。

#上面虽然介绍了正文带表格,但是这个不能符合我们的要求
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.mime.image import MIMEImage

mail_host = "xxx.163.com" #SMTP服务器地址
mail_sender = "xxx.com" #账号
mail_passwd = "xxx" #密码

msg = MIMEMultipart('related')
msg["Subject"] = "测试Python-发送邮件正文带表格"
msg["From"] = mail_sender #发送人
to_receiver=['xxx.com'] #收件人邮箱,多个人就是要list
cc_reciver=['xxx.com']  #抄送邮箱
receiver = cc_reciver  + to_receiver
msg["To"] = ";".join(receiver) #接收人

#你只需要将你的表df放在这里
#表格1
filter_merge_data1 = pd.DataFrame()
filter_merge_data1['节点id'] = [0]*2
filter_merge_data1['节点名称'] = [0]*2

#表格2
filter_merge_data2 = pd.DataFrame()
filter_merge_data2['最后重跑时间'] = [0]*2
filter_merge_data2['失败次数'] = [0]*2

#filter_merge_data = pd.read_excel('工作簿3.xlsx')

df_html = filter_merge_data1.to_html(escape=False)  # DataFrame数据转化为HTML表格形式
df_htm2 = filter_merge_data2.to_html(escape=False)  # DataFrame数据转化为HTML表格形式
head = \
        """
        <head>
            <meta charset="utf-8">
            <STYLE TYPE="text/css" MEDIA=screen>
                table.dataframe {
                    border-collapse: collapse;
                    border: 2px solid #a19da2;
                    /*居中显示整个表格*/
                    margin: auto;
                }
                table.dataframe thead {
                    border: 2px solid #91c6e1;
                    background: #f1f1f1;
                    padding: 10px 10px 10px 10px;
                    color: #333333;
                }
                table.dataframe tbody {
                    border: 2px solid #91c6e1;
                    padding: 10px 10px 10px 10px;
                }
                table.dataframe tr {
                }
                table.dataframe th {
                    vertical-align: top;
                    font-size: 14px;
                    padding: 10px 10px 10px 10px;
                    color: #105de3;
                    font-family: arial;
                    text-align: center;
                }
                table.dataframe td {
                    text-align: center;
                    padding: 10px 10px 10px 10px;
                }
                body {
                    font-family: 宋体;
                }
                h1 {
                    color: #5db446
                }
                div.header h2 {
                    color: #0002e3;
                    font-family: 黑体;
                }
                div.content h2 {
                    text-align: center;
                    font-size: 28px;
                    text-shadow: 2px 2px 1px #de4040;
                    color: #fff;
                    font-weight: bold;
                    background-color: #008eb7;
                    line-height: 1.5;
                    margin: 20px 0;
                    box-shadow: 10px 10px 5px #888888;
                    border-radius: 5px;
                }
                h3 {
                    font-size: 22px;
                    background-color: rgba(0, 2, 227, 0.71);
                    text-shadow: 2px 2px 1px #de4040;
                    color: rgba(239, 241, 234, 0.99);
                    line-height: 1.5;
                }
                h4 {
                    color: #e10092;
                    font-family: 楷体;
                    font-size: 20px;
                    text-align: center;
                }
                td img {
                    /*width: 60px;*/
                    max-width: 300px;
                    max-height: 300px;
                }
            </STYLE>
        </head>
        """
body = \
        """
        <body>
        <div align="center" class="header">
            <!--标题部分的信息-->
            <h1 align="center">表格中的数据为当天运行失败超过6次的节点,请查看运维中心处理</h1>
        </div>
        <hr>
        <div class="content">
            <!--正文内容-->
            <h2> </h2>
            </div>
                <p>这是表格1</p> 
            <div>
                <h4></h4>
                {df_html}
            </div>
                <p>这是表格2</p> 
            </div>
                <h4></h4>
                {df_htm2}
            <hr>
            <p style="text-align: center">
            </p>
        </div>
        </body>
        """.format(yesterday='20211012', df_html=df_html,df_htm2=df_htm2)
html_msg = "<html>" + head + body + "</html>"
html_msg = html_msg.replace('\n', '').encode("utf-8")

msg.attach(MIMEText(html_msg,"html",'utf-8'))


## 发送邮件
s = smtplib.SMTP() #实例化对象
s.connect(mail_host) #连接163邮箱服务器,端口号为465,注意,这里不需要写端口号
s.login(mail_sender, mail_passwd) #登录邮箱
s.sendmail(mail_sender, receiver, msg.as_string())
s.quit()

 

 

效果如下:

 

 

 第四、邮件带附件

from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
from email.mime.image import MIMEImage

mail_host = "xxx.163.com" #SMTP服务器地址
mail_sender = "xxx.com" #账号
mail_passwd = "xxx" #密码

msg = MIMEMultipart('related')
msg["Subject"] = "测试Python-发送邮件在带附件"
msg["From"] = mail_sender #发送人
to_receiver=['xxx.com'] #收件人邮箱,多个人就是要list
cc_reciver=['xxx.com']  #抄送邮箱
receiver = cc_reciver  + to_receiver
msg["To"] = ";".join(receiver) #接收人

# 邮件正文
content = '''
这是一封带有附件的邮件...
有两个附件
'''
msg.attach(MIMEText(content,'plain','utf-8'))

# 构造附件1,txt文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
msg.attach(att1)

# 构造附件2,xlsx文件
att2 = MIMEText(open('test.xlsx', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="test.xlsx"'
msg.attach(att2)

## 发送邮件
s = smtplib.SMTP() #实例化对象
s.connect(mail_host) #连接163邮箱服务器,端口号为465,注意,这里不需要写端口号
s.login(mail_sender, mail_passwd) #登录邮箱
s.sendmail(mail_sender, receiver, msg.as_string())
s.quit()

 

标签:Python,import,发送,html,receiver,msg,mail,邮件
From: https://www.cnblogs.com/cgmcoding/p/16814342.html

相关文章

  • 使用System.Net.Mail中的SMTP发送邮件
    使用简单邮件传输协议SMTP异步发送邮件想要实现SMTP发送邮件,你需要了解这些类SmtpClient:使用配置文件设置来初始化 SmtpClient类的新实例。它包含以下属性:Host:设置用......
  • python的高级特性-迭代概念
    迭代Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身>>>fori,valueinenumerate(['A','B','C']):...prin......
  • java发送post请求传json数据
    importcom.alibaba.fastjson.JSON;importcom.alibaba.fastjson.JSONObject;importorg.apache.http.HttpResponse;importorg.apache.http.client.methods.HttpPost;......
  • Python pygame新手入门基础教程
    pygame简介 pygame可以实现python游戏的一个基础包。  pygame实现窗口 初始化pygame,init()类似于java类的初始化方法,用于pygame初始化。pygame.init()......
  • python中numpy切片问题
    方式1:逗号前表示行,冒号表示从该行的第几个到第几个(包含头不包含尾)方式2:逗号在后,表示列,冒号表示从该列的第几个到第几个(包含头不包含尾)......
  • python3学习笔记【简易】
    0.注意事项与码风修正1.注意到句尾分号没影响到编译,查资料知可加可不加,最好不加。当在一行中写多句代码时需要加。2.for循环和if/else句尾冒号前不要有空格! 1.操作种......
  • python抓取Prometheus的数据(使用prometheus-api-client库)
    python抓取Prometheus的数据(使用prometheus-api-client库)0、写在前面我们要想抓取Prometheus的数据,一般想到的就是requests请求,爬虫的方式来抓取,这是可行的,当然,还有一个......
  • Python应用框架一览表——敬请期待!
    Webflask、trondo、Django、GUIEasyGui、Tkinter框架、网络爬虫Scrapy框架Scrapy框架安装步骤:pipinstallscrapy使用Scrapy框架编写爬虫共计4步。数据分析re模......
  • 基于TensorFlow和Python的机器学习(笔记2)
    基于TensorFlow和Python的机器学习(笔记2)     油耗预测项目(实战)importioimportos.pathimportmatplotlib.pyplotaspltimportkeras.utilsimportte......
  • Python教程:Python函数和Python闭包
    原文链接:https://www.codevoila.com/post/51/python-tutorial-python-function-and-python-closure PythonfunctionsbeyondbasicsandadeeplookatclosureinPy......