发邮件
smtplib模块主要负责发送邮件
email模块主要负责构造邮件。这两个都是python内置模块
smtplib.smtp.方法
#按住ctrl键并点击smtp ,会看到对smtp的解释(vscode编辑器)
import smtplib
server = smtplib.smtp()
#server = smtplib.smtp_ssl()
#如果端口是用ssl加密,请这样写代码。其中server是变量名
server.connect(host, port)
#如果出现编码错误unicodedecodeerror,你可以这样写:server.connect('smtp.qq.com', 465,'utf-8')
server.login(username, password)
server.sendmail(from_addr, to_addr, msg.as_string())
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型
server.quit()
email模块
导入形式
from email.mime.text import mimetext
from email.mime.image import mimeimage
from email.mime.multipart import mimemultipart
“模块”和“包”的区别,
模块(module)一般是一个文件,
包(package)是一个目录,一个包中可以包含很多个模块
python中的包都必须默认包含一个init.py的文件。
init.py控制着包的导入行为。
假如这个文件为空,那么我们仅仅导入包的话,就什么都做不了。
所以直接import email是行不通的。
使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】
from email.mime.text import mimetext
email包下的text文件中引入mimetext方法
mimetext(msg,type,chartset)
三个参数
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
++++++++++++++++++++++++++++++++++++++++
邮件头 包括主题、发件人、收件人等信息
email包引入header()方法。header()是用来构建邮件头
from email.header import header
#邮件头可自定义
1 msg['from'] = header('xxx') #from收件人邮箱地址 msg['from'] = header('cool')
2 msg['to'] = header('xxx') #to发件人邮箱地址 msg['to'] = header('小可爱')
3 msg['subject'] = header('xxx') #主题 msg['subject'] = header('来自cool的问候')
邮件内容
先设置一个变量text用来放正文内容
1 text = 'send by python'
2 msg = mimetext(text,'plain','utf-8')
群发邮件
a 设置一个列表形式的变量
将收件人信箱的变量设置成一个可以装多个内容的列表
1 to_addrs = ['wu@qq.com','kaxi@qq.com']
2 msg['to'] = header(to_addrs)
3 #直接运行程序的话,这里就会发生错误:attributeerror: 'list' object has no attribute 'decode'。
4 #因为header接受的第一个参数的数据类型必须要是字符串或者字节,列表不能解码
5
6 #使用join()函数,它的功能是把字符串合并
7 print(type(['wu@qq.com','kaxi@qq.com']))
8 print(type(",".join(to_addrs)))
9
10
msg['to'] = header(",".join(to_addrs))
b while 群发邮件
1 to_addrs = []
2 while true:
3 a=input('请输入收件人邮箱:')
4 #输入收件人邮箱
5 to_addrs.append(a)
6 #写入列表
7 b=input('是否继续输入,n退出,任意键继续:')
8 #询问是否继续输入
9 if b == 'n':
10 break
11 #print(to_addrs)
c 调用csv模块
将收件人邮箱写入csv文件,在发邮件时读取csv文件
1.引入csv模块;2.提供需要写入csv文件的数据,3.建文件并写入
1 import csv
2 #引用csv模块。
3
4 data = [['wu ', 'wu@qq.com'],['kaxi', 'kaxi@qq.com']]
5 #待写入csv文件的内容
6
7 with open('to_addrs.csv', 'w', newline='') as f:
8 writer = csv.writer(f)
9 for row in data:
10 writer.writerow(row)
读取
1.引入csv模块;2.打开csv文件;3.读取需要的数据
1 import csv
2 #引用csv模块。
3
4 with open('to_addrs.csv', 'r') as f:
5 reader = csv.reader(f)
6 for row in reader:
7 to_addrs=row[1]
列子:
1 import smtplib
2 # smtplib 用于邮件的发信动作
3 from email.mime.text import mimetext
4 # email 用于构建邮件内容
5 from email.header import header
6 # 用于构建邮件头
7 import csv
8 # 引用csv模块,用于读取邮箱信息
9
10 # 发信方的信息:发信邮箱,qq邮箱授权码
11 # 方便起见,你也可以直接赋值
12 from_addr = input('请输入登录邮箱:')
13 password = input('请输入邮箱授权码或者密码:')
14
15 # 发信服务器
16 smtp_server = 'smtp.exmail.qq.com'
17
18 # 邮件内容
19 text='''亲爱的学员,你好!
20 我是吴老师,能遇见你很开心。
21 希望学习python对你不是一件困难的事情!
22
23 人生苦短,我用python
24 '''
25
26 # 待写入csv文件的收件人数据:人名+邮箱
27 # 记得替换成你要发送的名字和邮箱
28 data = [['qy ', '123456@qq.com'],['lxz_jy', '654321@qq.com']]
29
30 # 写入收件人数据
31 with open('to_addrs.csv', 'w', newline='') as f:
32 writer = csv.writer(f)
33 for row in data:
34 writer.writerow(row)
35
36 # 读取收件人数据,并启动写信和发信流程
37 with open('to_addrs.csv', 'r') as f:
38 reader = csv.reader(f)
39 for row in reader:
40 to_addrs=row[1]
41 msg = mimetext(text,'plain','utf-8')
42 msg['from'] = header(from_addr)
43 msg['to'] = header(to_addrs)
44 msg['subject'] = header('python test')
45 server = smtplib.smtp_ssl(smtp_server)
46 server.connect(smtp_server,465)
47 server.login(from_addr, password)
48 try:
49 server.sendmail(from_addr, to_addrs, msg.as_string())
50 print('success')
51 except:
52 print('failed')
53
54 # 关闭服务器
55 server.quit()
报错信息
valueerror: server_hostname cannot be an empty string or start with a leading dot.
因为python 3.7修改了ssl.py,导致smtplib.smtp_ssl也连带产生了问题
# 改动这句代码
server = smtplib.smtp_ssl()
# 在括号内加入host参数
server = smtplib.smtp_ssl(smtp_server)
#############################################################
扩展:abs() 函数返回数字的绝对值
1 import math
2 num =float(input('pls input a number:'))
3 # 方法1,关键词:条件判断
4 def abs_value1():
5 if num >= 0:
6 print('该数字的绝对值为:{}'.format(num))
7 else:
8 print('该数字的绝对值为:{}'.format(-num))
9
10
11 # 方法2,关键词:内置函数
12 def abs_value2():
13 num1 = abs(num)
14 print('该数字的绝对值为:{}'.format(num1))
15
16
17
18 # 方法3,关键词:内置模块
19 def abs_value3():
20 num1 = math.fabs(num)
21 print('绝对值为{}'.format(num1))
22
23
24 # 写完3种方法后,验证一下吧。
25 abs_value1()
26 abs_value2()
27 abs_value3()