python 实现发送邮件功能

python 实现发送邮件功能一 前言在开始正题之前 我们先理一下常见的电子邮件协议 SMTP POP IMAP 都遵循 TCP IP 协议规范 至于 Exchange 是邮件服务器 不是收邮件和发邮件的协议 不要混淆概念 一般情况下不用 因为它是微软的产品 SMTP 即简单邮件传输协议 它是一组用于由源地址到目的地址传送邮件的规则 由它来控制信件的中转方式 简单来说是发送协议 POP 协议允许电子邮件客户端下载服务器上的邮件 但是在客户端的操作 如移动邮件 标记已读等 不会反馈到服务器上 属于收件协议

  一、前言

     在开始正题之前,我们先理一下常见的电子邮件协议: SMTP、POP、IMAP 都遵循TCP/IP协议规范。至于Exchange是邮件服务器,不是收邮件和发邮件的协议,不要混淆概念,一般情况下不用,因为它是微软的产品。

  • SMTP:即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。简单来说是 发送协议
  • POP:协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上。属于 收件协议。
  • IMAP:提供 邮件服务器 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作(这是和POP协议主要不同点)。属于 收件协议。

 

二、SMTP发送邮件

     Python发送邮件比较简单,掌握两个自带库 smtplib、email 即可,使用的时候直接 import。smtplib 负责发送邮件,email 负责构造邮件(邮件内容,主题,收件人,抄送人等)。

 

1、发送普通邮件

1)先找到你的发送邮箱,比如我这里是企业邮箱,点击邮箱“设置”—>“客户端设置”,开启 SMTP 服务器。发送服务器配置使用:smtp.exmail..com(使用SSL,端口号465)

python 实现发送邮件功能

  2)smtplib、email 使用如下。其中 MIMEText 构造对象时,第一个参数是邮件正文;第二个参数是subType,可以设置两种格式 ‘plain’ 和 ‘html’;然后一定要指定字符编码‘utf-8’。‘plain’ 表示发送纯文本消息。

from smtplib import SMTP_SSL from email.mime.text import MIMEText def sendMail(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 = 'root' password = '' # 邮件内容 msg = MIMEText(message, 'plain', _charset="utf-8") # 邮件主题描述 msg["Subject"] = Subject # 发件人显示,不起实际作用 msg["from"] = sender_show # 收件人显示,不起实际作用 msg["to"] = recipient_show # 抄送人显示,不起实际作用 msg["Cc"] = cc_show with SMTP_SSL(host="smtp.exmail..com",port=465) as smtp: # 登录发邮件服务器 smtp.login(user = user, password = password) # 实际发送、接收邮件配置 smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string()) if __name__ =='__main': message = 'Python 测试邮件...' Subject = '主题测试' # 显示发送人 sender_show = 'xxx' # 显示收件人 recipient_show = 'xxx' # 实际发给的收件人 to_addrs = '' sendMail(message,Subject,sender_show,recipient_show,to_addrs)

 邮件效果:

python 实现发送邮件功能

  2、发送HTML格式邮件

 将 MIMEText 第二个参数设置成 ‘html’,如:MIMEText(message, ‘html’, _charset=”utf-8″)

from smtplib import SMTP_SSL
from email.mime.text import MIMEText

def sendMail(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 = 'root'
    password = '123456'
    # 邮件内容
    msg = MIMEText(message, 'html', _charset="utf-8")
    # 邮件主题描述
    msg["Subject"] = Subject
    # 发件人显示,不起实际作用
    msg["from"] = sender_show
    # 收件人显示,不起实际作用
    msg["to"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show
    with SMTP_SSL(host="smtp.exmail..com",port=465) as smtp:
        # 登录发送邮件服务器
        smtp.login(user = user, password = password)
        # 实际发送、接收邮件配置
        smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())

if __name__ =='__main':
    message = '''
    

Python 邮件发送测试...

纵里寻她千百度

''' Subject = '主题测试' # 显示发送人 sender_show = 'xxx' # 显示收件人 recipient_show = 'xxx' # 实际发给的收件人 to_addrs = '' sendMail(message,Subject,sender_show,recipient_show,to_addrs)

 邮件效果:

python 实现发送邮件功能

3、发送带附件邮件

 发送带附件的邮件需借助类 MIMEMultipart(),然后构造邮件内容及附件,多个附件 attach 多次。

from smtplib import SMTP_SSL
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

def sendMail(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 = 'root'
    password = '123456'
    # 邮件内容
    msg = MIMEMultipart()
    msg.attach(MIMEText(message, 'html', _charset="utf-8"))
    # 构造附件1,传送当前目录下的 test.txt 文件
    att = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
    att["Content-Type"] = 'application/octet-stream'
    # 附件名称为中文时的写法
    att.add_header("Content-Disposition", "attachment", filename=("gbk", "", filename))
    # 附件名称非中文时的写法,这里的filename可以任意写,写什么名字,邮件中显示什么名字
    # att["Content-Disposition"] = 'attachment; filename="{}"'.format(filename)
    msg.attach(att)
    # 邮件主题描述
    msg["Subject"] = Subject
    # 发件人显示,不起实际作用
    msg["from"] = sender_show
    # 收件人显示,不起实际作用
    msg["to"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show
    with SMTP_SSL(host="smtp.exmail..com",port=465) as smtp:
        # 登录发送邮件服务器
        smtp.login(user = user, password = password)
        # 实际发送、接收邮件配置
        smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())

if __name__ =='__main':
    message = '''
    

Python 邮件发送测试...

纵里寻她千百度

''' Subject = '主题测试' # 显示发送人 sender_show = 'xxx' # 显示收件人 recipient_show = 'xxx' # 实际发给的收件人 to_addrs = '' sendMail(message,Subject,sender_show,recipient_show,to_addrs)

 邮件效果:

python 实现发送邮件功能

4、发送带图片邮件

 邮件带图片需要用到另一个类 MIMEImage(),多张图片 attach 多次。

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

def sendMail(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 = 'root'
    password = '123456'
    # 邮件内容
    msg = MIMEMultipart()
    msg.attach(MIMEText(message, 'html', _charset="utf-8"))
    # 邮件主题描述
    msg["Subject"] = Subject
    # 发件人显示,不起实际作用
    msg["from"] = sender_show
    # 收件人显示,不起实际作用
    msg["to"] = recipient_show
    # 抄送人显示,不起实际作用
    msg["Cc"] = cc_show
    # 指定图片为当前目录
    fp = open('test.png', 'rb')
    msgImage = MIMEImage(fp.read())
    fp.close()
    # 定义图片 ID,在 HTML 文本中引用
    msgImage.add_header('Content-ID', '
    ') msg.attach(msgImage) with SMTP_SSL(host="smtp.exmail..com",port=465) as smtp: # 登录发送邮件服务器 smtp.login(user = user, password = password) # 实际发送、接收邮件配置 smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string()) if __name__ =='__main': message = ''' 

Python 邮件发送测试...

纵里寻她千百度

python 实现发送邮件功能

''' Subject = '主题测试' # 显示发送人 sender_show = 'xxx' # 显示收件人 recipient_show = 'xxx' # 实际发给的收件人 to_addrs = 'xxx@.com' sendMail(message,Subject,sender_show,recipient_show,to_addrs)

 邮件效果:

python 实现发送邮件功能

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/223840.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午1:19
下一篇 2026年3月17日 下午1:20


相关推荐

  • 罗技键盘锁了,按哪个键就开了_无线键盘自动休眠

    罗技键盘锁了,按哪个键就开了_无线键盘自动休眠在弹出的界面中查看一下系统是不是已经开启了休眠。如果没有休眠,则无需关闭,如果有这个选项,就继续看下面;然后打开开始菜单,在开始菜单的右边会有一个控制面板的选项,打开控制面板,在控制面板中,找到电源选项,然后点击打开统已经默认设定了一个电源计划,即推荐的选项,但是,系统休眠会占用许多系统空间,所以要把它给设置为关闭。点击平衡右边的蓝色的设置链接,即更改计划设置;在更改计划的设置中,点击下面的更改高…

    2022年10月10日
    4
  • java基本数据类型总结

    java基本数据类型总结详解一、八种基本数据类型常识1.1、基本常识表对于上图有以下几点需要注意:java八种基本数据类型分为四类八种,四类分别为整型、浮点型、布尔型、字符型;八种分别为byte、short、int、long、float、double、boolean、char;java八种基本数据类型的字节数:分别为1、2、4、8个字节;1字节(byte、boolean)、2字节(short、char)、4字节(int、float)、8字节(long、double);整数的默认类型为int,浮点数的默认类型为do

    2022年7月7日
    23
  • Openclaw 新手安裝 | Mac OS 使用者,Docker 隔離版本

    Openclaw 新手安裝 | Mac OS 使用者,Docker 隔離版本

    2026年3月15日
    2
  • Webgame 设计与开发

    Webgame 设计与开发亲爱的读者,我是一名程序员,总怀着一种奢望,奢望去写本书。为什么称之为奢望呢?原因是一是经验不够丰富,二是工作紧张,时间有限,三是游戏阅历不深,四是游戏行业发展趋势不太明确,所以想写本关于游戏的书一直没有开始。近一年多来,随着对webgame的开发和理解,加上自身水平的的提高,感觉写本webgame的书时机已经成熟,关于该书的框架简单写了些,随着写作的深入,各个章节都将丰富。希望与

    2022年6月7日
    33
  • 周立功的《深入浅出ARM7》上_看门狗

    周立功的《深入浅出ARM7》上_看门狗周立功的《深入浅出ARM7》上_看门狗1.看门狗概述看门狗(WD,Watchdog)包括一个4分频的预分频器和一个32位计数器。时钟通过预分频器输入定时器。定时器递减计数。定时器递减的最小值为0x

    2022年7月1日
    28
  • OpenClaw引爆2026技术圈!开源智能体Agent如何改写人机协作规则?

    OpenClaw引爆2026技术圈!开源智能体Agent如何改写人机协作规则?

    2026年3月16日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号