2020-04-11 python学习日志--收发邮件

邮件收发的两个模块(module):

  • email模块构建邮件
  • smtplib模块发送邮件
示意如下:
流程图.png
自学相关模块的本领:网络引擎搜索
  • 方式:为使检索精确,我们可以使用+号或者空格连接关键词,也可使用之前学习的and和or来连接。
  • 方法:
    学习方向.png
email模块

用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。
email其实是一个包(package)。模块一般是一个文件,而包是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。Python中的包都必须默认包含一个init.py的文件。

email模块函数.png
邮件正文对应的导入方式为:
from email.mime.text import MIMEText
# 引入email包中构建文本内容的方法
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
邮件头的写法:
from email.header import Header

msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')
smtplib模块邮件发送的函数(方法)(来自网络):
邮件发送的函数.png

邮件发送函数.png
总结smtplib发送邮件的函数:
import smtplib

server = smtplib.SMTP()   
#server = smtplib.SMTP_SSL()
#如果端口是用SSL加密,请这样写代码。其中server是变量名
server.connect(host, port)
#server.connect('smtp.qq.com', 465)   #smtp.qq.com为qq邮箱服务器
#如果出现编码错误UnicodeDecodeError,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')
server.login(username, password) 
#username:登录邮箱的用户名
#password:授权码(不是邮箱登录密码)
server.sendmail(sender, to_addr, msg.as_string()) 
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 
server.quit()
#退出服务器,结束SMTP会话
  • host是指定连接的邮箱服务器,你可以指定服务器的域名。通过搜索“xx邮箱服务器地址”,就可以找到;
  • port 是“端口”的意思。一般情况下SMTP默认端口号为25。如果25行不通,你可以通过搜索或者去邮箱设置里面查看端口。比如,如果我打算用自己的企业邮箱来发邮件,登录邮箱后,在【设置-选项-POP和IMAP】里面可以看到这些信息;

收发邮件的全流程(邮件正文)

收发邮件的全流程.png
可能的报错信息:
  1. ValueError: server_hostname cannot be an empty string or start with a leading dot.
    将相应代码改为:
# 改动这句代码
server = smtplib.SMTP_SSL()
# 在括号内加入host参数
server = smtplib.SMTP_SSL(smtp_server)
  1. smtplib.SMTPException: No suitable authentication method found.
    在登录(login)之前调用starttls()方法就可以了。即将相应代码改为:
server.starttls()

邮件全文源代码

# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件正文内容
from email.header import Header
# 用于构建邮件头

# 发信方的信息:发信邮箱,QQ邮箱授权码)
from_addr = 'xxx@qq.com'
password = '你的授权码数字'

# 收信方邮箱
to_addr = 'xxx@qq.com'

# 发信服务器
smtp_server = 'smtp.qq.com'

# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
text = '''
​    希望学习Python对你不是一件困难的事情!
'''
msg = MIMEText(text,'plain','utf-8')

# 邮件头信息:from_addr,to_addr可以自定义
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')

# 开启发信服务,这里使用的是SSL加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()

群发邮件

邮件群发的三种方式.png
列表的方式:

使用str.join()函数将邮箱由列表转为字符串

to_addrs=['mail1','mail2','mail3']
comon=","
addrs_mod=comon.join(to_addrs)
While循环:

通过输入的方式将邮箱逐个加入到事先建立的空列表中

# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头

# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')

# 收信方邮箱
to_addrs = []
while True:
    a=input('请输入收件人邮箱:')
    to_addrs.append(a)
    b=input('是否继续输入,n退出,任意键继续:')
    if b == 'n':
        break

# 发信服务器
smtp_server = 'smtp.qq.com'

text='''亲爱的学员,你好!
希望学习Python对你不是一件困难的事情!
'''
msg = MIMEText(text,'plain','utf-8')

# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(",".join(to_addrs)) 
msg['Subject'] = Header('python test')

# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addrs, msg.as_string())
# 关闭服务器
server.quit()
调用csv模块
data = [['wufeng ', 'wufeng@qq.com'],['kaxi', 'kaxi@qq.com']]

# 写入收件人数据
with open('to_addrs.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    for row in data:
        writer.writerow(row)

# 读取收件人数据,并启动写信和发信流程
with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader: 
        to_addrs=row[1]
        msg = MIMEText(text,'plain','utf-8')
        msg['From'] = Header(from_addr)
        msg['To'] = Header(to_addrs)
        msg['Subject'] = Header('python test')
        server = smtplib.SMTP_SSL()
        server.connect(smtp_server,465)
        server.login(from_addr, password)
        server.sendmail(from_addr, to_addrs, msg.as_string())

# 关闭服务器
server.quit()

try...except...语句处理你遇到的问题

try:
    server.sendmail(from_addr, to_addrs, msg.as_string())
    print('恭喜,发送成功')
except:
    print('发送失败,请重试')

什么是SMTP?

SMTP (Simple Mail Transfer Protocol)是“简单邮件传输协议”的意思,SMTP 协议是由源服务器目的地服务器传送邮件的一组规则。

注:此日志来源于风变编程课程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容