Python 收发邮件

Posted ch-tnt

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 收发邮件相关的知识,希望对你有一定的参考价值。

发邮件
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 <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         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()

 

 

以上是关于Python 收发邮件的主要内容,如果未能解决你的问题,请参考以下文章

zmail,收发邮件的模块

python 使用zmail收发电子邮件

Java收发邮件过程中具体的功能是怎么实现的

如何使用Exchange 2010收发外部邮件

[新星计划] Python smtplib模块 | 轻松学会收发E-mail(电子邮件)

[新星计划] Python smtplib模块 | 轻松学会收发E-mail(电子邮件)