python学习记录15--给自己:发邮件
阅读原文时间:2021年04月20日阅读:1

1.使用python给自己发送一个邮件

smtplib-SMTP协议客户端:https://docs.python.org/3/library/smtplib.html

  • 重要了解smtplib这个模块的作用是什么?以及其用法是什么?

那么今天我们要使用python来发送邮件的话需要用到哪些知识呢?

import smtplib

message=smtplib.SMTP()
message.connect(host,port) 
#链接服务器   host:服务器  port:端口号
message.login(username,password)  
#登录邮箱    username:登录邮箱的用户名   password:授权码
message.sendmail(from_addr,to_addr,msg.as_string())
#发送邮件
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 
message.quit()
#退出服务器,结束SMTP会话

①smtplib模块

②SMTP (Simple Mail Transfer Protocol):“简单邮件传输协议”(我们需要通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器)一般情况下SMTP默认端口号为25

发邮件时自行搜索邮箱的服务器名称 (host)和端口号(port)

  • 使用默认端口号25

  • QQ邮箱比较特殊,可自行搜索端口号和服务器(smtp.qq.com),QQ 邮箱采用的加密方式是SSL,如下:

    import smtplib

    server = smtplib.SMTP_SSL()
    #如果端口是用SSL加密,请这样写代码。其中server是变量名
    server.connect('smtp.qq.com', 465)
    #如果出现编码错误UnicodeDecodeError,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')

  • email 模块:也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。

  1. MIMEText:内容形式为纯文本、HTML页面
  2. MIMEimage:内容形式为图片
  3. MIMEMultipart:多形式组合,可包含文件和附本

每种形式对应的导入方式为:

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

“模块”和“包”的区别:模块(module)一般是一个文件,而包(package)是一个目录,一个包中可以包含很多个模块,可以说包是“模块打包”组成的。

#从email包下的text文件中引入MIMEText方法
from email.mime.text import MIMEText

编辑所发送邮件的内容使用的函数MIMEText():

MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”

发送一条邮件:

#1.导入模块
import smtplib#smtplib用于邮件的发信动作
from email.mime.text import MIMEText

#2.定义变量 MIMEText(msg,type,chartst)
from_addr='xxxxxx@qq.com'#发信方的地址信息
password='xxxxxxxxxx'#发信方的授权码
to_addr='xxxxxxxxxx@qq.com'#收件方邮箱
smtp_sever='smtp.qq.com'#发信服务器
msg=MIMEText('u收到我的晚安了吗?','plain','utf-8')#发送的文本信息

#3.使用方法
sever=smtplib.SMTP_SSL(smtp_sever)#开启发信服务,这里是使用加密传输
sever.connect(smtp_sever,25)#链接服务器(服务器,端口)
sever.login(from_addr,password)#登录发信邮箱
sever.sendmail(from_addr,to_addr,msg.as_string())#发送邮件
sever.quit()#退出

2.发送一个包含发件人和标题的完整文件

from email.header import Header

msg['From'] = Header('xxx')
msg['To'] = Header('xxx')
msg['Subject'] = Header('xxx')

3.群发邮件

①是将收件人信箱的变量设置成一个可以装多个内容的列表:

to_addrs = ['123@qq.com','456@qq.com']
msg['To'] = Header(','.join(t0_addr))

这里涉及到一个join函数:join()的用法是str.join(sequence),str代表在这些字符串之中你要用什么字符串来连接

a=['d','o','g']
b=','
print(b.join(a))   #输出d,o,g
c='-'
print(c.join(a))   #输出d-o-g

②定义一个空数组,编写一个while循环,使用input()函数获取输入的好友邮箱地址,用append()函数将邮件地址元素放入数组中,循环中询问是否继续添加群发邮箱地址。

③调用csv模板

import csv
#引用csv模块。

data = [['123 ', '123@qq.com'],['456', '456@qq.com']]
#待写入csv文件的内容

with open('to_addrs.csv', 'w', newline='') as f:#使用的是with语句新建to_addr.csv文件
    writer = csv.writer(f)   
    for row in data:
        writer.writerow(row)#通过遍历列表data将数据一行行写到了to_addrs.csv文件中

读取文件read():

#import csv
#引入模块、打开文件、读取文件
with open('to_addrs.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader: 
        to_addrs=row[1]   #row[1]表示csv文件中第1列的数据

整个过程:

import smtplib
# smtplib 用于邮件的发信动作
from email.mime.text import MIMEText
# email 用于构建邮件内容
from email.header import Header
# 用于构建邮件头
import csv
# 引用csv模块,用于读取邮箱信息

# 发信方的信息:发信邮箱,QQ邮箱授权码
# 方便起见,你也可以直接赋值
from_addr = input('请输入登录邮箱:')
password = input('请输入邮箱授权码:')

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

# 邮件内容
text='''
    演员需要保持神秘感
    才会给观众带来惊喜的作品
    对演员来说观众才是最重要的
    就继续创作出好的作品来回馈观众
    我们一起加油,一起并肩前行
    希望未来可以在中国影视行业留名
    加油(づ ̄ 3 ̄)づ

'''

# 待写入csv文件的收件人数据:人名+邮箱
# 记得替换成你要发送的名字和邮箱
data = [['二宝', 'erbao@qq.com'],['大虎子', 'dahuzi@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:
    server.sendmail(from_addr, to_addrs, msg.as_string())
    print('恭喜,发送成功')
except:
    print('发送失败,请重试')

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器