发邮件
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
#邮件头可自定义
 msg['From'] = Header('xxx')    #from收件人邮箱地址 msg['From'] = Header('cool')
msg['To'] = Header('xxx') #to发件人邮箱地址 msg['To'] = Header('小可爱')
msg['Subject'] = Header('xxx') #主题 msg['Subject'] = Header('来自cool的问候')
 
邮件内容
先设置一个变量text用来放正文内容
 text = 'send by python'
msg = MIMEText(text,'plain','utf-8')

群发邮件
 

A 设置一个列表形式的变量
将收件人信箱的变量设置成一个可以装多个内容的列表
 to_addrs = ['wu@qq.com','kaxi@qq.com']
msg['To'] = Header(to_addrs)
#直接运行程序的话,这里就会发生错误:AttributeError: 'list' object has no attribute 'decode'。
#因为Header接受的第一个参数的数据类型必须要是字符串或者字节,列表不能解码 #使用join()函数,它的功能是把字符串合并
print(type(['wu@qq.com','kaxi@qq.com']))
print(type(",".join(to_addrs)))
<class 'list'>
<class 'str'>

msg['to'] = Header(",".join(to_addrs))

B while 群发邮件
 to_addrs = []
while True:
a=input('请输入收件人邮箱:')
#输入收件人邮箱
to_addrs.append(a)
#写入列表
b=input('是否继续输入,n退出,任意键继续:')
#询问是否继续输入
if b == 'n':
break
#print(to_addrs)
C 调用csv模块
将收件人邮箱写入csv文件,在发邮件时读取csv文件
1.引入csv模块;2.提供需要写入csv文件的数据,3.建文件并写入
 import csv
#引用csv模块。 data = [['wu ', 'wu@qq.com'],['kaxi', 'kaxi@qq.com']]
#待写入csv文件的内容 with open('to_addrs.csv', 'w', newline='') as f:
writer = csv.writer(f)
for row in data:
writer.writerow(row)
读取
1.引入csv模块;2.打开csv文件;3.读取需要的数据
 import csv
#引用csv模块。 with open('to_addrs.csv', 'r') as f:
reader = csv.reader(f)
for row in reader:
to_addrs=row[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.exmail.qq.com' # 邮件内容
text='''亲爱的学员,你好!
我是吴老师,能遇见你很开心。
希望学习python对你不是一件困难的事情! 人生苦短,我用Python
''' # 待写入csv文件的收件人数据:人名+邮箱
# 记得替换成你要发送的名字和邮箱
data = [['qy ', '123456@qq.com'],['lxz_jy', '654321@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(smtp_server)
server.connect(smtp_server,465)
server.login(from_addr, password)
try:
server.sendmail(from_addr, to_addrs, msg.as_string())
print('success')
except:
print('failed') # 关闭服务器
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() 函数返回数字的绝对值
 import math
num =float(input('pls input a number:'))
# 方法1,关键词:条件判断
def abs_value1():
if num >= 0:
print('该数字的绝对值为:{}'.format(num))
else:
print('该数字的绝对值为:{}'.format(-num)) # 方法2,关键词:内置函数
def abs_value2():
num1 = abs(num)
print('该数字的绝对值为:{}'.format(num1)) # 方法3,关键词:内置模块
def abs_value3():
num1 = math.fabs(num)
print('绝对值为{}'.format(num1)) # 写完3种方法后,验证一下吧。
abs_value1()
abs_value2()
abs_value3()

Python 【收发邮件】的更多相关文章

  1. Python收发邮件

    发送邮件使用SMTP协议,接受POP3或IMAP: 创建邮件内容email模块,发送邮件smtplib模块.发送邮件比较简单,只需先创建SMTP对象,登录服务器后根据发收邮箱地址发送即可: POP3接 ...

  2. 转--python -- 收发邮件

    官方 import smtplib from email.mime.text import MIMEText from email.header import Header # 发送邮箱服务器 smt ...

  3. python收发邮件的方法

    def acptmail(): email = 'xxx@163.com' #input('Email:') password = 'xxx' #input('Password: ') pop3_se ...

  4. 使用python的email、smtplib、poplib模块收发邮件

    使用python的email.smtplib.poplib模块收发邮件 一封电子邮件的旅程是: MUA:Mail User Agent——邮件用户代理.(即类似Outlook的电子邮件软件) MTA: ...

  5. python的email、smtplib、poplib模块收发邮件

    一封电子邮件的旅程是: MUA:Mail User Agent--邮件用户代理.(即类似Outlook的电子邮件软件) MTA:Mail Transfer Agent--邮件传输代理,就是那些Emai ...

  6. python SMTP邮件发送(转载)

    Python SMTP发送邮件 SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. py ...

  7. python发邮件遇到的端口号问题

    在学习使用python发邮件的过程中, 遇到了一个问题:由于测试的时候使用的是QQ邮箱,要求必须使用SSL/TLS加密,所以有了下面的代码, from email.mime.text import M ...

  8. DouNet学习_收发邮件

    一.收发邮件 --->第一步:发邮件首先要有发送者的邮箱地址和登录的密码才能发送 这些都写在APP里  不要写死 --->第二步:发邮件就要有网络,要添加net.Mail命名空间 要发送的 ...

  9. 使用python发邮件

    使用python发邮件 网上有很多发邮件的例子,本人在网上找了一份,稍加修改后使用 上源码 # encoding=utf-8 from email.mime.image import MIMEImag ...

  10. Outlook Express 收发邮件出现&quot;0x800CCC0F&quot;错误代码解决方法

    非常多网友在使用Outlook Express收发邮件的过程中,有时能够发送邮件,但出现不能接收信件的问题.每次在收邮件都会在某个地方停止不动,然后报超时,出现错误代码0x800CCC19或0x800 ...

随机推荐

  1. yy

    sudo rm -rf /var/cache/apt/archives/python-catkin-pkg-modules_0.4.12-1_all.deb sudo rm -rf /var/cach ...

  2. Linux下基于Xampp的TestLink的安装部署

    由于项目需要,故需要搭建Testlink,且出于稳定,考虑在linux环境部署,当然windows系统也是可以的. 系统:64位操作系统 linux:centos6.8 testlink:1.9.14 ...

  3. Redis批量删除缓存数据

    背景: 在使用redis中,经常会遇到批量删除缓存的情况,但是对于在客户端中,如果一个一个的删除key,则需要较长时间及相对麻烦,可以使用以下命令,批量删除缓存. 本地批量删除KEY: ./redis ...

  4. Effective Java 3

    <Effective Java>作者是美国的Joshua Bloch,连Gosling都说需要看的书,讨论的是更深层次的Java开发技术,适合于有一定Java基础的人看. 这是一本分享经验 ...

  5. Java生成不重复的随机数组的方法

    一.JAVA中生成随机数的方式 1.在j2se中使用Math.random()令系统随机选取一个01之间的double类型小数,将其乘以一个数,比如25,就能得到一个025范围内的随机数,这个在j2m ...

  6. Go by Example-流控制语句之if/else

    Go by Example-流控制语句之if/else Go中的if/else的用法和其他语言没什么区别,在格式要求上保留了类似Python中的一些特性. 基本概念 在条件判断语法 if/else 中 ...

  7. 手写实现RPC框架(不带注册中心和带注册中心两种)

    实现自己的RPC框架如果不需要自定义协议的话那就要基于Socket+序列化. ProcessorHandler:主要是用来处理客户端的请求. package dgb.nospring.myrpc; i ...

  8. STM32 + RT Thread OS 串口通讯

    1.   创建项目 a)   禁用Finsh和console b)   默认情况下,项目文件包含了finsh,它使用COM1来通讯,另外,console输出(rt_kprintf)也使用了COM1.因 ...

  9. layui跨域问题的解决

      跨域问题的解决 由于浏览器存在同源策略,所以如果 layui(里面含图标字体文件)所在的地址与你当前的页面地址不在同一个域下,即会出现图标跨域问题.所以要么你就把 layui 与网站放在同一服务器 ...

  10. React vs. Angular vs. Vue

    原文连接 历史 React是一个用于构建Web应用程序UI组件的JavaScript库. React由Facebook维护,许多领先的科技品牌在其开发环境中使用React. React被Faceboo ...