首页 > 编程语言 >python 实现发送邮件功能

python 实现发送邮件功能

时间:2022-09-27 10:14:35浏览次数:53  
标签:收件人 show python 发送 不起 addrs msg 邮件

一、前言

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

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

 

二、SMTP发送邮件

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

 

1、发送普通邮件

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

  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 = '123456'
    # 邮件内容
    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.qq.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 = '[email protected]'
    sendMail(message,Subject,sender_show,recipient_show,to_addrs)

 邮件效果:

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.qq.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 = '''
    <p>Python 邮件发送测试...</p>
    <p><a href="https://www.baidu.com">纵里寻她千百度</a></p>
    '''
    Subject = '主题测试'
    # 显示发送人
    sender_show = 'xxx'
    # 显示收件人
    recipient_show = 'xxx'
    # 实际发给的收件人
    to_addrs = '[email protected]'
    sendMail(message,Subject,sender_show,recipient_show,to_addrs)

邮件效果:

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.qq.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 = '''
    <p>Python 邮件发送测试...</p>
    <p><a href="https://www.baidu.com">纵里寻她千百度</a></p>
    '''
    Subject = '主题测试'
    # 显示发送人
    sender_show = 'xxx'
    # 显示收件人
    recipient_show = 'xxx'
    # 实际发给的收件人
    to_addrs = '[email protected]'
    sendMail(message,Subject,sender_show,recipient_show,to_addrs)

邮件效果:

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', '<image>')
    msg.attach(msgImage)
    with SMTP_SSL(host="smtp.exmail.qq.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 = '''
    <p>Python 邮件发送测试...</p>
    <p><a href="https://www.baidu.com">纵里寻她千百度</a></p>
    <p><img src="cid:image"></p>
    '''
    Subject = '主题测试'
    # 显示发送人
    sender_show = 'xxx'
    # 显示收件人
    recipient_show = 'xxx'
    # 实际发给的收件人
    to_addrs = '[email protected]'
    sendMail(message,Subject,sender_show,recipient_show,to_addrs)

邮件效果:

 

标签:收件人,show,python,发送,不起,addrs,msg,邮件
From: https://www.cnblogs.com/wpcnblog/p/16733521.html

相关文章

  • Python多行字符串
    Sometimeswehaveaverylongstringandwewanttowriteitintomultiplelinesforbettercodereadability.Pythonprovidesvariouswaystocreatemultiline......
  • python中利用smtplib发送邮件的3中方式 普通/ssl/tls
    #!/usr/bin/python#coding:utf-8importsmtplibfromemail.MIMETextimportMIMETextfromemail.Utilsimportformatdatefromemail.HeaderimportHe......
  • Linux升级python至3.x
    前言云服务器一般都用Linux系统,现在云服务器的Linux一般自带python,只是版本是2.x,比较老的那种。大部分人用的python应该都是3.x版本的,这时候你在本地编写的python文件拿到......
  • Python第四章实验报告
    一、实验题目Python第四章实例和实战作业二、实验目的和要求1.熟悉Pycharm的运行环境2.学习并掌握Python的流程控制语句三、主要仪器设备联想小新air15硬件:AMDR75......
  • 羊了个羊,但是Python简(li)单(pu)版
    大家好,欢迎来到Crossin的编程教室!要说最近最热门的游戏,那肯定是《羊了个羊》没跑了。连续上了好几天热搜,火到连央视都来提醒谨防有人利用游戏之名诈骗。但游戏爆火的另......
  • The Python Standard Library by Example pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1XrEGFnmV_jwtkXILXLjUQg点击这里获取提取码 ......
  • Python源码剖析 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/12DltvfQr4Tc7ZwhiG1UmAg点击这里获取提取码 ......
  • python
    基本数据类型之布尔值bool用来判断事物的对错是否可行只要用于流程控制中只有两种状态true对的真的可行的false错的假的不可行的python中所有......
  • python Thread
    #foriinrange(10):#t1=Thread(target=函数,args=(,))#t.append(t1)##t1.start()#forhint:#h.join()#共耗时:26.087260484695435500#fo......
  • Python-标识符命名规则
    合法标识符在Python中,标识符由字母,数字,下划线组成,但不能以数字开头.命名规则lower_underscore:小写字母中间隔下划线.一般使用小写加下划线UPPER_UNDERS......