发送邮件(用代码模拟邮箱服务器发送邮件)

1.导入模块和包,分别是邮件发送服务器模块、邮件对象模块、邮件标题包、邮件内容包

import smtplib      # 邮件发送服务器
from email.mime.multipart import MIMEMultipart   # 创建一个邮件对象
from email.header import Header     # 邮件标题包
from email.mime.text import MIMEText    # 邮件内容包

2.用函数封装功能:发邮件

包含:发送人、接收人、主题、内容、附件

def send_email(from_user, to_user, subject='', content='', files=[]):
    """
    发送邮件
    :param from_user: 发送人
    :param to_user: 接收人  abc@qq.com;def@163.com
    :param subject: 主题
    :param content: 内容
    :param file: 附件
    :return:
    """
    HOST = 'smtp.qq.com'
    email = MIMEMultipart()  # 创建一个邮件对象
    email['From'] = from_user  # 设置邮件发送者
    email['To'] = to_user  # 设置邮件接收者
    email['Subject'] = Header(subject, 'utf-8').encode() # 设置邮件主题

    # 邮件内容 plain 是纯文本格式 utf-8 是编码格式
    content = MIMEText(content, 'plain', 'utf-8')

3.添加附件时注意:

a. 将附件转成base64编码格式

b.对附件的中文件名进行gbk编码

代码如下:

 # 添加邮件附件
    email.attach(content)
    if files:
        for file in files:
            with open(file, 'rb') as f:
                file_name = file.rfind('/')
                display_filename = file[file_name + 1:] if file_name != -1 else file
                # 将附件转成base64编码格式
                att = MIMEText(f.read(), 'base64', 'utf-8')
                # 设置附件类型 通知服务器这是附件
                att["Content-Type"] = 'application/octet-stream'

                # 设置附件的文件名称,告诉服务器附件的文件名称 并显示在邮件中,并对附件的中中文件名gbk编码
                att.add_header('Content-Disposition', 'attachment',
                               filename=('gbk', '', os.path.basename(display_filename)))

                # 将附件附加到 邮件对象
                email.attach(att)

4.发送邮件

# 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ和163邮箱的端口号都是465
    connect = smtplib.SMTP_SSL(HOST, 465)  # 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ邮箱的是465
    # 登录邮件发送服务器,需要准备邮箱号和授权码,在邮箱设置中找到POP3/SMTP/IMAP,开启所有服务,会生成授权码,保存授权码
    connect.login('XXXXXXX@qq.com', '邮箱授权码')
    # to_user.split(';')接受者邮箱号按照 ";" 分割后正好得到一个列表
    connect.sendmail(from_user, to_user.split(';'), email.as_string())
    # 退出
    connect.quit()

5.完整代码如下:

import smtplib      # 邮件发送服务器
from email.mime.multipart import MIMEMultipart   # 创建一个邮件对象
from email.header import Header     # 邮件标题包
from email.mime.text import MIMEText    # 邮件内容包
import os
def send_email(from_user, to_user, subject='', content='', files=[]):
    """
    发送邮件
    :param from_user: 发送人
    :param to_user: 接收人  abc@qq.com;def@163.com
    :param subject: 主题
    :param content: 内容
    :param file: 附件
    :return:
    """
    HOST = 'smtp.qq.com'
    email = MIMEMultipart()  # 创建一个邮件对象
    email['From'] = from_user  # 设置邮件发送者
    email['To'] = to_user  # 设置邮件接收者
    email['Subject'] = Header(subject, 'utf-8').encode() # 设置邮件主题

    # 邮件内容 plain 是纯文本格式 utf-8 是编码格式
    content = MIMEText(content, 'plain', 'utf-8')

    # 添加邮件附件
    email.attach(content)
    if files:
        for file in files:
            with open(file, 'rb') as f:
                file_name = file.rfind('/')
                display_filename = file[file_name + 1:] if file_name != -1 else file
                # 将附件转成base64编码格式
                att = MIMEText(f.read(), 'base64', 'utf-8')
                # 设置附件类型 通知服务器这是附件
                att["Content-Type"] = 'application/octet-stream'

                # 设置附件的文件名称,告诉服务器附件的文件名称 并显示在邮件中,并对附件的中中文件名gbk编码
                att.add_header('Content-Disposition', 'attachment',
                               filename=('gbk', '', os.path.basename(display_filename)))

                # 将附件附加到 邮件对象
                email.attach(att)
    # 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ和163邮箱的端口号都是465
    connect = smtplib.SMTP_SSL(HOST, 465)  # 链接邮件发送服务器,查询邮箱的SMTP的端口号QQ邮箱的是465
    # 登录邮件发送服务器,需要准备邮箱号和授权码,在邮箱设置中找到POP3/SMTP/IMAP,开启所有服务,会生成授权码,保存授权码
    connect.login('xxxxxxx@qq.com', '邮箱授权码')
    # to_user.split(';')接受者邮箱号按照 ";" 分割后正好得到一个列表
    connect.sendmail(from_user, to_user.split(';'), email.as_string())
    # 退出
    connect.quit()

6.将发送邮件这个函数封装起来作为一个包导入,方便今后调用

# 导入模块和包
from myutils import send_email

# 传参

send_email('XXXXXXX@qq.com',

           "XXXXXXX@163.com",    # 发送对象的邮箱,可以传入列表

           subject='这是标题',                            # 标题

           content='这是内容',                          # 内容

           files=[r"文件路径1";r"文件路径2";r"文件路径3"]) #附件路径

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值