常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

元胞珊瑚
• 阅读 1890
原文由wangle发表于TesterHome社区,点击原文链接可与作者直接交流。

一.开启邮箱SMTP服务

发送邮件需要使用SMTP服务器,常用的免费服务器有:163、126、qq等邮箱。

QQ邮箱配置方式如下:

1) 登录qq邮箱,选择【设置】-【账户】

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

2) 在POP3/IMAP/SMAP/Exchage/CardDAV/CalDAV服务中,找到POP3/SMTP服务和IMAP/SMTP服务,点击开启。

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明
常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明
常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

163邮箱配置方式如下:

1)注册163邮箱,登录后设置。

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

2) 在新页面点击“客户端授权密码”,勾选“开启”,弹出新窗口填写手机验证码。

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

3) 填写授权码

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

4) 提示开启成功。

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

二、使用python发送邮件

使用python自带的模块:smptlib、email

import smtplib
from email.mime.text import MIMEText
from email.header import Header

1、发送普通的邮件

# 发送邮件的步骤
import smtplib
from email.mime.text import MIMEText     # 用来构造文本类型的邮件
from email.header import Header          # 用来构造邮件的头部
# 第一步:创建一个SMTP的对象
s = smtplib.SMTP()
# 第二步:连接到SMTP的服务器
host = 'smtp.163.com'    # 设置163邮箱服务器,端口为:25
port = 25
#  host = 'smtp.qq.com'  port = 465  # 设置qq邮箱服务器,端口为:465
s.connect(host,port)       # 连接服务器
# s.connect(host = 'smtp.163.com',port = 25)
# 第三步:登录SMTP服务器
mail_user = '18814726725@163.com'           # 163邮箱的用户名
mail_pass = 'password'                      # 注意:此处填写的是邮箱的SMTP服务器授权码
s.login(user=mail_user,password=mail_pass)
# 第四步:构建邮件内容
content = '使用python测试发送邮件'             # 构建邮件内容
msg = MIMEText(content,_charset='utf8')     # _charset 指定编码格式
msg['Subject'] = Header('测试报告','utf8')   # 邮件主题
msg['From'] = 'wl18814726725@163.com'       # 发件人邮箱,可传入列表,用于给多个人发送文件
msg['To'] = '1572533878@qq.com'             # 收件人

# 第五步:发送邮件
s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string())     #将邮件内容转换为字符串

2、发送HTML格式邮件及附件

import smtplib
from email.mime.text import MIMEText     # 文本类型的邮件,用来构造邮件
from email.header import Header          # 用来构造邮件的头部
from email.mime.application import MIMEApplication   
from email.mime.multipart import MIMEMultipart  # 用来构造附件

# 发送邮件的步骤
# 第一步:创建一个SMTP的对象
s = smtplib.SMTP()
# 第二步:连接到SMTP的服务器
host = 'smtp.163.com'    # 设置163邮箱服务器,端口为:25
port = 25
#  host = 'smtp.qq.com'    # 设置qq邮箱服务器,端口为:465
s.connect(host,port)   # 连接服务器
# 第三步:登录SMTP服务器
mail_user = 'wl18814726725@163.com'     # 163邮箱的用户名
mail_pass = 'wl987654321'               # 注意:此处填写的是邮箱的SMTP服务器授权码
s.login(user=mail_user,password=mail_pass)

# 构造文本邮件内容
content = '使用python测试发送邮件'             # 构建邮件内容
textcontent = MIMEText(content,_charset='utf8')        # _charset 指定编码格式
# 构造附件(二进制字节流形式)
part = MIMEApplication(open("report.html",'rb').read(),_subtype=None) 
# part = MIMEApplication(open("report.html",'rb').read()) 需要查看_subtype=None 是否会引发异常
part.add_header('content-disposition', 'attachment', filename='report18.html')  # 对方收到邮件之后,附件在邮件中显示的名称
# 封装一封邮件
msg = MIMEMultipart()
# 加入文本内容
msg.attach(textcontent)
msg.attach(part)
# 发送邮件
msg['From'] = 'wl18814726725@163.com'       #发件人邮箱
msg['To'] = '1572533878@qq.com'             #收件人

#第五步:发送邮件
s.sendmail(from_addr='wl18814726725@163.com',to_addrs='1572533878@qq.com',msg=msg.as_string())      # 将邮件内容转换为字符串

3、定义send_email函数

import smtplib
from email.mime.text import MIMEText     #文本类型的邮件,用来构造邮件
from email.header import Header          #用来构造邮件的头部
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart  #用来构造附件

def send_email(filepath):
    """
    :param filepath:   #传入报告文件的路径
    :return:
    """
    # 发送邮件的步骤
    # 第一步:创建一个SMTP的对象
    s = smtplib.SMTP()
    # 第二步:连接到SMTP的服务器
    host = 'smtp.163.com'    #设置163邮箱服务器,端口为:25
    port = 25
    #  host = 'smtp.qq.com'    #设置qq邮箱服务器,端口为:465
    s.connect(host,port)   #连接服务器
    # 第三步:登录SMTP服务器
    mail_user = 'wl18814726725@163.com'     #163邮箱的用户名
    mail_pass = 'wl987654321'               #注意:此处填写的是邮箱的SMTP服务器授权码
    s.login(user=mail_user,password=mail_pass)

    #构造文本邮件内容
    content = '使用python测试发送邮件'             #构建邮件内容
    textcontent = MIMEText(content,_charset='utf8')        #_charset 指定编码格式
    #构造附件(二进制字节流形式)
    part = MIMEApplication(open(filepath,'rb').read())
    part.add_header('content-disposition', 'attachment', filename='report988.html')  #对方收到邮件之后,附件在邮件中显示的名称
    # 封装一封邮件
    msg = MIMEMultipart()
    #加入附件和文本内容
    msg.attach(textcontent)
    msg.attach(part)
    #发送邮件
    msg['From'] = 'wl18814726725@163.com'       #发件人邮箱
    msg['To'] = '1572533878@qq.com'             #收件人

    #第五步:发送邮件
    s.sendmail(from_addr=msg['From'],to_addrs=msg['To'],msg=msg.as_string())      #将邮件内容转换为字符串

send_email('report.html')

4、使用python发送邮件时常见错误:

错误1:smtplib.SMTPAuthenticationError: (550, b'User has no permission') 。

我们使用python发送邮件时相当于自定义客户端根据用户名和密码登录,然后使用SMTP服务发送邮件,新注册的163邮箱是默认不开启客户端授权的(对指定的邮箱大师客户端默认开启),因此登录总是被拒绝,解决办法(以163邮箱为例):进入163邮箱-设置-客户端授权密码-开启(授权码是用于登录第三方邮件客户端的专用密码)。上述有专门的设置方法。

错误2:smtplib.SMTPAuthenticationError: (535, b'Error: authentication failed') 。

以163邮箱为例,在开启POP3/SMTP服务,并开启客户端授权密码时会设置授权码,将这个授权码代替smtplib.SMTP().login(user,password)方法中的password即可。

错误3:给多人发送邮件是,可能会出现“AttributeError: 'list' object has no attribute 'encode'”或者写了多个人,实际只给第一个人发了邮件等错误。

# 将所有的收件人邮箱写入到一个字符串中
msg['To'] = '1668010021@qq.com, 1572533878@qq.com, wangle@kyee.com.cn, 2685083419@qq.com'
# 发送邮件时,通过字符串函数split分割,分割后返回的每一个邮箱账号
s.sendmail(from_addr=msg['From'], to_addrs=msg['To'].split(','), msg=msg.as_string())
原文由wangle发表于TesterHome社区,点击原文链接可与作者直接交流。

常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

今日份的知识已摄入~
想了解更多前沿测试开发技术:欢迎关注「第十届MTSC大会·上海」>>>
1个主会场+12大专场,大咖云集精英齐聚
常见邮箱开启 SMTP 服务及 Python 发送 email 详细说明

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Irene181 Irene181
4年前
最全总结!聊聊 Python 发送邮件的几种方式
1\.前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道Python内置了对SMTP的支持,可以发送纯文本、富文本、HTML等格式的邮件本文将聊聊利用 Python发送邮件的3种方式2\.准备以126邮箱为例,在编码之前,我们需要开启SMTP服务然后,手动新增一个授权码其中,账号、授权码和服务器地址用于连接登录
Irene181 Irene181
4年前
最全总结!聊聊 Python 发送邮件的几种方式
1\.前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道Python内置了对SMTP的支持,可以发送纯文本、富文本、HTML等格式的邮件本文将聊聊利用 Python发送邮件的3种方式2\.准备以126邮箱为例,在编码之前,我们需要开启SMTP服务然后,手动新增一个授权码其中,账号、授权码和服务器地址用于连接登录
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
HTML5新增input标签属性
一.inputtype属性1<formaction""2邮箱<inputtype"email"name""id""<inputtype"submit"value"提交"<br/<br/3手机号码<inputtype"tel"name
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
3年前
Jenkins设置运行结果自动发送邮箱通知
Jenkins设置运行结果自动发送邮箱通知1获取邮箱授权码登录邮箱选择“设置”开启IMAP/SMTP服务开启后需要通过手机发送短信到线上获取授权码!(https://img2018.cnblogs.com/blog/1798505/201909/1798505201909280544535181522354728.png)例如我
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这