Python 【收发邮件】,,发邮件smtplib


发邮件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 MIMETextfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipart
“模块”和“包”的区别,模块(module)一般是一个文件,包(package)是一个目录,一个包中可以包含很多个模块

Python中的包都必须默认包含一个init.py的文件。init.py控制着包的导入行为。假如这个文件为空,那么我们仅仅导入包的话,就什么都做不了。所以直接import email是行不通的。使用from … import …语句,从email包目录下的【某个文件】引入【需要的对象】
from email.mime.text import MIMETextemail包下的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 = [‘[email protected]‘,‘[email protected]‘] 2 msg[‘To‘] = Header(to_addrs) 3 #直接运行程序的话,这里就会发生错误:AttributeError: ‘list‘ object has no attribute ‘decode‘。 4 #因为Header接受的第一个参数的数据类型必须要是字符串或者字节,列表不能解码 5  6 #使用join()函数,它的功能是把字符串合并 7 print(type([‘[email protected]‘,‘[email protected]‘])) 8 print(type(",".join(to_addrs))) 9 <class ‘list‘>10 <class ‘str‘>

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         break11 #print(to_addrs) 
C 调用csv模块将收件人邮箱写入csv文件,在发邮件时读取csv文件1.引入csv模块;2.提供需要写入csv文件的数据,3.建文件并写入
 1 import csv 2 #引用csv模块。 3  4 data = [[‘wu ‘, ‘[email protected]‘],[‘kaxi‘, ‘[email protected]‘]] 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 csv2 #引用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 人生苦短,我用Python24 ‘‘‘25 26 # 待写入csv文件的收件人数据:人名+邮箱27 # 记得替换成你要发送的名字和邮箱28 data = [[‘qy ‘, ‘[email protected]‘],[‘lxz_jy‘, ‘[email protected]‘]]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()

Python 【收发邮件】

评论关闭