使用Python自动发送邮件

全屏阅读
  • 基本信息
  • 作者:
  • 作者已发布:928篇文章
  • 发布时间:2023年12月10日 21:44:50
  • 所属分类:python3
  • 阅读次数:115次阅读
  • 标签:

image.png

 SMTP(Simple Mail Transfer Protocol)是简单传输协议。


python中对SMTP进行了简单的封装,可以发送纯文本邮件、HTML 邮件以及带附件的邮件。两个核心模块如下:


email模块:负责构建邮件


smtplib模块:负责发送邮件


常用方法与属性: 

image.png

如果要使用qq邮箱发送的话,需要在qq邮箱设置-账户里面开启POP3/SMTP服务

image.png

首次开启需要你用手机号发送短信,照着做就好了,做完之后会给你一个授权码,记着这个授权码,写代码需要用到,忘记了也可以找回

接着编写代码,发送普通邮件

import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
def send_email():
    # 设置要登录的邮箱
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱  这里需要填写你的qq邮箱地址和生成的授权码
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 编辑内容
    mail_text = 'This is Email~ 您要的邮件来啦~~'
    # plain 原生文本模式
    msg_body = MIMEText(mail_text,'plain','utf-8')
    # 设置从哪发送的
    msg_body['From'] = Header('xxx','utf-8')  # 设置发送人
    msg_body['Subject'] = Header('测试Python自动邮件','utf-8')  # 设置内容主题
    # 发送邮件  这里第一个邮箱填自己的,第二个填收件人的邮箱地址
    smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg_body.as_string())
 
if __name__ =='__main__':
    send_email()

image.png

发送HTML邮件只需要把发送的内容换成html代码即可

import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
def send_email():
    # 设置要登录的邮箱
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱  这里需要填写你的qq邮箱地址和生成的授权码
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 编辑内容
    mail_text = '''
    <h1 style='color:red'>这是一个HTML邮件通知</h1>
    <p>这个是邮件的内容</p>
    <p><a href='http://www.itbaizhan.cn'>这个是链接</a></p>
    '''
    # plain 原生文本模式
    msg_body = MIMEText(mail_text,'plain','utf-8')
    # 设置从哪发送的
    msg_body['From'] = Header('xxx','utf-8')  # 设置发送人
    msg_body['Subject'] = Header('测试Python自动邮件','utf-8')  # 设置内容主题
    # 发送邮件  这里第一个邮箱填自己的,第二个填收件人的邮箱地址
    smtp_obj.sendmail('398707160@qq.com','hotelmail@126.com',msg_body.as_string())
 
if __name__ =='__main__':
    send_email()

发送附件邮件-smtplib

有时邮件的内容只靠文本是无法完全描述内容。这时就可以考虑发 送附件来携带内容。具体方法如下:

设置登录服务器 、登录邮箱、增加附件 、设置请求头、 发送邮件

image.png

import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.header import Header
 
def send_file_email():
    # 设置邮箱服务器
    stmp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱
    stmp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 设置邮件内容
    # 文本
    msg_txt = MIMEText('这个带有附件的邮件','plain','utf-8')
    # 附件  打开你要发送的文件
    msg_file = MIMEApplication(open('./base_data/backg.jpg','rb').read())
    msg_file.add_header('Content-Disposition','attachment',filename='bg.jpg')
    # 封装要发送的数据
    part = MIMEMultipart()
    part.attach(msg_txt)
    part.attach(msg_file)
    # 设置邮件其它信息
    part['From'] = Header('xx','utf-8')
    part['Subject'] = Header('附件邮件','utf-8')
    # 发送邮件
    stmp_obj.sendmail('xxx@qq.com','hotelmail@126.com',part.as_string())
 
if __name__ =='__main__':
    send_file_email()

批量发送邮件-smtplib

这里以发送工资条为例

工资数据如下: 

image.png

from email.header import Header
from email.mime.text import MIMEText
import smtplib
 
from openpyxl import load_workbook
 
def send_many_mail():
     # 设置登录邮箱服务器
    smtp_obj = smtplib.SMTP('smtp.qq.com')
    # 登录邮箱
    smtp_obj.login('xxx@qq.com','spcdwgqkltjsbiah')
    # 打开excel文件
    wb = load_workbook('./base_data/工资数据.xlsx',data_only=True)
    # 激活工作簿
    sh = wb.active
    # 读取数据-遍历
    for i,r in enumerate(sh.iter_rows()):
        if i != 0:
            # 编辑内容
            msg_txt = f'''
            <h3>您好:{r[1].value}</h3>
            <p>请查收2030年12月工资条详情:</p>
            <table border="1">
            <tr>
                <td>工号</td>
                <td>姓名</td>
                <td>部门</td>
                <td>基本工资</td>
                <td>提成</td>
                <td>加班工资</td>
                <td>社保扣除</td>
                <td>考勤扣除</td>
                <td>应发工资</td>
                <td>邮箱</td>
            </tr>
            <tr>
                <td>{r[0].value}</td>
                <td>{r[1].value}</td>
                <td>{r[2].value}</td>
                <td>{r[3].value}</td>
                <td>{r[4].value}</td>
                <td>{r[5].value}</td>
                <td>{r[6].value}</td>
                <td>{r[7].value}</td>
                <td>{r[8].value}</td>
                <td>{r[9].value}</td>
            </tr>
        </table>
            '''
            msg =  MIMEText(msg_txt,'html','utf-8')
            # 设置邮件其他信息
            msg['From'] = Header('财务部','utf-8')
            msg['Subject'] = Header('工资条','utf-8')
            #发送邮件
            smtp_obj.sendmail('xxx@qq.com',{r[9].value},msg.as_string())
            print(f'{r[1].value} 工资条发送成功!!')
if __name__ =='__main__':
    send_many_mail()

发送邮件-zmail

image.png

Zmail的优势


1 自动填充大多数导致服务端拒信的头信息(From To LocalHost之类的)


2 将一个字典映射为email,构造信件就像构造字典一样简单


3 自动寻找邮件服务商端口号地址,自动选择合适的协议(经过认证的)


安装:pip install zmail

image.png

发送的消息以字典发送,包含的key:

subject 邮件主题

from 发送人

content_text 邮件内容-文本

content_html 邮件内容-HTML

attachments 邮件内容-附件,可写多个 

import zmail
def send_text():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':'飞扬',
        'subject':'测试zmail模块',
        'content_text':'这个是zmail邮件信息'
    }
    # 发送邮件
    server.send_mail('feiyang@126.com',info)
def send_html():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':'飞扬',
        'subject':'测试zmail模块',
        'content_html':'<h1>这个是zmail邮件信息</h1>'
    }
    # 发送邮件
    server.send_mail('hotelmail@126.com',info)
def send_file():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','spcdwgqkltjsbiah')
    # 编写内容
    info = {
        'from':'飞扬',
        'subject':'测试zmail模块',
        'content_html':'<h1>这个是zmail邮件信息</h1>',
        'attachments':[r'.\base_data\backg.jpg']
    }
    # 发送邮件
    server.send_mail('feiyang@126.com',info)
def get_email():
    # 登录邮箱
    server = zmail.server('xxx@qq.com','tzteewnmyfqacbce')
    email = server.get_latest()
    print(email.get('subject'))
    print(email.get('from'))
    print(email.get('content_html'))
    print(email.get('content_text'))
    
if __name__ == '__main__':
    # send_text()
    # send_html()
    # send_file()
    get_email()

顶一下
(0)
100%
订阅 回复
踩一下
(0)
100%
» 郑重声明:本文由mpxq168发布,所有内容仅代表个人观点。版权归恒富网mpxq168共有,欢迎转载, 但未经作者同意必须保留此段声明,并给出文章连接,否则保留追究法律责任的权利! 如果本文侵犯了您的权益,请留言。

目前有 0 条留言 其中:访客:0 条, 博主:0 条

给我留言

您必须 [ 登录 ] 才能发表留言!