Python登录QQ邮箱发送邮件

最近使用QuickBI订阅功能,发现对订阅内容有1w行限制,便想到自己写代码绕过这个限制。

代码如下:

# This is a sample Python script.

from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
import os
import pymysql
import openpyxl
import pandas as pd
import email.utils

sql = '''select id,name from t'''

//将本地文件以附件的方式发送
def send_mail(message, subject, sender_show, recipient_show, to_addrs, cc_show=''):
    '''
    :param message: str 邮件内容
    :param subject: str 邮件主题描述
    :param sender_show: str 发件人显示,不起实际作用如:"xxx"
    :param recipient_show: str 收件人显示,不起实际作用 多个收件人用','隔开如:"xxx,xxxx"
    :param to_addrs: str 实际收件人
    :param cc_show: str 抄送人显示,不起实际作用,多个抄送人用','隔开如:"xxx,xxxx"
    '''
    # 填写真实的发邮件服务器用户名、密码
    user = '[email protected]'
    password = 'jxsnhxlaerizbihi'  //授权码
    host = 'smtp.qq.com'
    # 邮件内容
    # msg = MIMEText(message, 'plain', _charset="utf-8")
    content = MIMEText(message)
    msg = MIMEMultipart()  # 多个MIME对象
    msg.attach(content)  # 添加内容
    # 邮件主题描述
    msg["Subject"] = subject
    # 发件人显示,不起实际作用
    msg["From"] = sender_show
    # 收件人显示,不起实际作用
    msg["To"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show

    cur_dir = os.path.dirname(os.path.realpath(__file__))
    file_name = 'filename.xlsx'  # 文件名
    file_path = os.path.join(cur_dir, file_name)  # 文件路径
    xlsx = MIMEApplication(open(file_path, 'rb').read())  # 打开Excel,读取Excel文件
    xlsx["Content-Type"] = 'application/octet-stream'  # 设置内容类型
    xlsx.add_header('Content-Disposition', 'attachment', filename=file_name)  # 添加到header信息
    msg.attach(xlsx)
    
    with SMTP_SSL(host=host, port=465) as smtp:
        # 登录发邮件服务器
        smtp.login(user=user, password=password)
        # 实际发送、接收邮件配置
        # smtp.sendmail(from_addr=user, to_addrs=to_addrs.split(','), msg=msg.as_string())
        smtp.sendmail(from_addr=user, to_addrs=to_addrs.split(','), msg=msg.as_string())

//从mysql中查询数据写入本地xlsx文件
def get_data():
    con_engine = pymysql.connect(host='host_address',
                                 user='app_read', password='pwd', database='db_name', 								port=3306, charset='utf8')  # 通过参数形式传递,参数是字符串形式
    global sql
    df = pd.read_sql(sql, con_engine)
    file = 'file_name.xlsx'
    if os.path.exists(file):
        os.remove(file)
    df.to_excel(file, 'sheet1', index=False)

# Press the green button in the gutter to run the script.
if __name__ == '__main__':
    get_data()
    send_mail('见附件', '标题', 'sender', 'recipient','[email protected]')

代码中主要有两个步骤:

  1. 从MySql中查询数据通过pandas形成本地Excel文件
  2. 将本地Excel文件以附件的方式发送到目标邮箱

就想人为发邮件先登录QQ邮箱一样,借助代码自动发送也需要用户名密码登录QQ SMTP服务器,只是这里的密码是在QQ邮箱开启SMTP服务获取的授权码:

Python登录QQ邮箱发送邮件_第1张图片

这样借助Python就能实现发送邮件的功能,若需定时发送借助Crontab即可实现。

你可能感兴趣的:(python,网络,邮件)