使用Python自动发送邮件

简介: 使用Python自动发送邮件

发送普通邮件


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


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


email模块:负责构建邮件


smtplib模块:负责发送邮件


常用方法与属性:



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



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


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

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()


发送HTML邮件


发送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

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


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




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

这里以发送工资条为例


工资数据如下:



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


Zmail的优势


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


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


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


安装:pip install zmail



发送的消息以字典发送,包含的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('hotelmail@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('hotelmail@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()
目录
相关文章
|
5月前
|
Python
python实现发送邮件demo
python实现发送邮件demo
38 1
|
5月前
|
Unix 数据安全/隐私保护 Python
python自动生成Excel表格数据并发送邮件案例
python自动生成Excel表格数据并发送邮件案例
|
6月前
|
数据安全/隐私保护 Python
python 发送邮件demo
python 发送邮件demo
|
3月前
|
移动开发 Python HTML5
Python办公自动化【发送普通邮件、发送HTML邮件、发送附件邮件-smtplib、批量发送邮件-smtplib、发送邮件-zmail】(八)-全面详解(学习总结---从入门到深化)
Python办公自动化【发送普通邮件、发送HTML邮件、发送附件邮件-smtplib、批量发送邮件-smtplib、发送邮件-zmail】(八)-全面详解(学习总结---从入门到深化)
47 0
|
8月前
|
Python
Python发送邮件脚本
Python发送邮件脚本
37 0
|
8月前
|
网络安全 数据安全/隐私保护 Python
|
8月前
|
Python
|
8月前
|
Python
|
8月前
|
Python
|
8月前
|
数据采集 Python
技巧 | python定时发送邮件(自动添加附件)针不戳
技巧 | python定时发送邮件(自动添加附件)针不戳
技巧 | python定时发送邮件(自动添加附件)针不戳