Python 第17关——邮件还能这样发(QQ邮箱)!

完成一个项目的流程

1.明确项目目标
2.分解过程、拆解项目
3.逐步执行、代码实现

  1. 目标:Python群发邮件
  2. 目标:学会学习新模块
    掌握【学习模块的方式】→掌握学习新知识的方式
版本1.0:学习模块,发一封简单邮件
  • 学习方法引导:
    搜索关键词“发送邮件 python”,找到解决方案→先纵观搜索出来的内容,找共同点(比如可以知道1.Python可以解决这个问题;2.方法是smtplib,email这两个模块。smtplib是用来发送邮件用的,email是用来构建邮件内容的。这两个都是Python内置模块)→学习这两个模块

  • 学习模块——smtplib模块
    1.搜 ‘smtplib python’(高手使用,因为会进官方网站)
    2.搜 ‘smtplib 教程 ’(新手使用,比较友好)
    多比较几个文档,对于重复部分多的代码,就是你要找的内容。

    • 注意在搜索时,关键词越多越准确,可以使用+或空格连接或and连接关键词
import smtplib    #引入smtplib模块

server = smtplib.SMTP()    #server是一个变量,smtplib.SMTP()是变量server的值,若不知道SMTP,
#可以在本地编辑器中按住Ctrl键并点击SMTP ,会看到对SMTP的解释
server.connect(host, port)    #连接(connect)指定的服务器,host是指定连接的邮箱服务器;port 是“端口”的意思,一般情况下SMTP默认端口号为25。
#如果25行不通,你可以通过搜索或者去邮箱设置里面查看端口。比如,如果我打算用自己的企业邮箱来发邮件,登录邮箱后,在【设置-选项-POP和IMAP】查看端口数字
#QQ 邮箱一般默认关闭SMTP服务,我们得先去开启它:登录你的邮箱。然后点击位于顶部的【设置】按钮,选择【账户设置】开启
server.login(username, password)  #username:登录邮箱的用户 password:授权码(在【账户】处获得,用此码登录,而不是你的qq邮箱登录密码)
server.sendmail(sender, to_addr, msg.as_string()) #sendmail是“发送邮件”的意思
#是发送邮件用的,sendmail()方法需要三个参数:发件人,收件人和邮件内容
#from_addr:邮件发送地址,就是上面的username
#to_addr:邮件收件人地址
#msg.as_string():为一个字符串类型 
server.quit()   #quit是“退出”的意思,就是退出服务器
  • 学习模块——email模块
from email.mime.text import MIMEText  #内容形式为纯文本、HTML页面
from email.mime.image import MIMEImage   #内容形式为图片
from email.mime.multipart import MIMEMultipart     #多形式组合,可包含文本和附件
MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”
#文本类型和文本编码,我们默认用'plain'和'utf-8'
  • 建议的代码结构
    1.导入模块:smtplib模块 和 email 模块
    2.定义变量:包括发件人、密码、收件人、正文内容、服务器
    3.使用方法:连接、登录、发送、退出
#  1.导入模块

# smtplib 用于邮件的发信动作
import smtplib
from email.mime.text import MIMEText  # email 用于构建邮件内容

# 2.定义变量:

# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxx@qq.com'
password = '你的授权码数字'

# 收信方邮箱
to_addr = 'xxx@qq.com'

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

# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
msg = MIMEText('send by python','plain','utf-8')


# 3.使用方法:

# 开启发信服务,这里使用的是加密传输
server = smtplib.SMTP_SSL()
server.connect(smtp_server,465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()

常见报错信息:ValueError: server_hostname cannot be an empty string or start with a leading dot.
解决办法:server = smtplib.SMTP_SSL()改成server = smtplib.SMTP_SSL(smtp_server)

版本2.0:给自己发一封完整邮件

1.丰富文件头

  • 包括主题、发件人、收件人等信息
    方法:搜索“发邮件 Python”,看别人的代码是怎么样写的
from email.header import Header

msg['From'] = Header('xxx')    #发件人邮箱地址/也可自定义其他内容
msg['To'] = Header('xxx')         #收件人邮箱地址/也可自定义其他内容
msg['Subject'] = Header('xxx')    #邮件主题

2.丰富正文内容

  • 如果你想要写很长的内容,建议先设置一个变量text用来放正文内容,
  • 正文需要换行,这时用到了三引号的用法啦
    例如:
text = '''亲爱的学员,你好!
​    我是吴枫老师,能遇见你很开心。
​    希望学习Python对你不是一件困难的事情!

人生苦短,我用Python
'''
msg = MIMEText(text,'plain','utf-8')
版本3.0:群发完整邮件
  • 设置一个列表形式的变量
    1.将收件人信箱的变量设置成一个可以装多个内容的列表
    例如:
to_addrs = ['wufeng@qq.com','kaxi@qq.com']

2.然而列表不能解码,只能变成字符串形式(使用join()函数

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

join()的用法是str.join(sequence),str代表在这些字符串之中你要用什么字符串来连接,你可以用逗号,空格,下划线等等,sequence可以是列表等

  • 使用while循环
    1.定义一个空列表to_addrs,用来存放收件人邮箱地址
    2.输入邮箱地址的时候,地址会被追加写进列表
to_addrs = []
while True:
    a=input('请输入收件人邮箱:')
    #输入收件人邮箱
    to_addrs.append(a)
    #写入列表
    b=input('是否继续输入,n退出,任意键继续:')
    #询问是否继续输入
    if b == 'n':
        break

print(to_addrs)
  • while True: 只要不遇到break,就会一直循环下去。
  • 写入csv模块
    步骤:1.引入csv模块;2.提供需要写入csv文件的数据,3.建文件并写入。
import csv     # 引用csv模块,用于读取邮箱信息
data = [['wufeng ', 'wufeng@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)

# 读取收件人数据,并启动写信和发信流程
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')      #这些要都写到for循环下
        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()



©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容