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 = '[email protected]'
password = '你的授权码数字'

# 收信方邮箱
to_addr = '[email protected]'

# 发信服务器
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 ', '[email protected]'],['kaxi', '[email protected]']]

# 写入收件人数据
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 协议是由源服务器目的地服务器传送邮件的一组规则。

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

你可能感兴趣的:(2020-04-11 python学习日志--收发邮件)