python实现群发邮件

本文介绍了如何使用Python通过SMTP协议发送邮件,包括开启QQ邮箱SMTP服务,使用smtplib和email模块构建邮件,以及利用MIMEText处理邮件内容。此外,还展示了如何设计列表存储收件人邮箱,利用while循环处理多收件人情况,并通过csv模块读取和写入收件人数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前期准备工作

打开qq邮箱的 SMTP 服务,并保存授权码

  • 进入qq邮箱个人主页,设置-账户-开启IMAP/SMTP服务-保存授权码
  • 服务器地址:qq邮箱的是 smtp.qq.com
  • 端口号:普通传输为25,SSL加密传输为465或587

在这里插入图片描述

代码结构

1.导入模块:smtplib模块,email模块

2.定义变量:包括发件人,密码,收件人,正文内容,服务器

3.使用方法:链接,登录,发送,退出

smtplib 模块

用于邮件的发信动作

1.链接服务器 —— connect(服务器地址,端口号)

2.登录邮箱 —— login(用户名,授权码)

3.发送邮件 —— sendmail(发件地址,收件地址,发送内容)

4.退出服务器 —— quit()

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

# 发信方的信息:发信邮箱,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')

# 开启发信服务,这里使用的是加密传输
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()

email 模块

也就是用来写邮件内容的模块。这个内容可以是纯文本、HTML内容、图片、附件等多种形式。

MIMEText

  • MIMEText:内容形式为纯文本、HTML页面。

  • MMEImage:内容形式为图片。

  • MIMEMultipart:多形式组合,可包含文本和附件。

对应的导入方式:

from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

MIMEText 参数解释

MIMEText(msg,type,chartset)
# msg:文本内容,可自定义
# type:文本类型,默认为plain(纯文本)
# chartset:文本编码,中文为“utf-8”

Header

邮件头信息

from email.header import Header

msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header('python test')

完成以上步骤后来看看如何发送单个邮件(这里加上了try…except…语句):

# 普通传输
 
import smtplib
from email.mime.text import MIMEText
from email.header import Header
 
# 第三方 SMTP 服务
mail_host="smtp.XXX.com"  #设置服务器
mail_user="XXXX"    #用户名
mail_pass="XXXXXX"   #授权码
 
 
sender = 'XXXXXXXXXX@XX.com'		 # 发件人的邮箱地址
receivers = ['XXXXXXXXXX@qq.com']  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱	列表,即可以存放多个邮箱地址
 
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("我是发件人")	# 发件人标头
message['To'] =  Header("我是收件人")		 # 收件人标头
 
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject)
    
# SSL加密传输的代码写法:    
try:
    smtpObj = smtplib.SMTP_SSL(mail_host) # SMTP_SSL() 内的 host_name 不能为空,否则会报错
    smtpObj.connect(mail_host,465)	    # 链接服务器 需要 服务器地址 和 端口号
    smtpObj.login(mail_user,mail_pass)	# 登录 需要 用户名 和 授权码
    smtpObj.sendmail(sender,receivers,message.as_string())	# 发送邮件 需要 发件收件地址、发送内容
    smtpObj.quit()
    print("邮件发送成功")
except smtplib.SMTPException:
    print("Error:无法发送邮件")

如果想用普通传输就将:

    smtpObj.connect(mail_host,465)	    # 链接服务器 需要 服务器地址 和 端口号
    smtpObj.login(mail_user,mail_pass)	# 登录 需要 用户名 和 授权码

改为:

    smtpObj.connect(mail_host, 25)    # SMTP 端口号 一般为 25
    smtpObj.login(mail_user,mail_pass)

设计一个列表形式的变量

# 收信方邮箱
to_addrs = ['wufeng@qq.com','kaxi@qq.com']

# 邮箱正文内容
msg = MIMEText("text:",'plain','utf-8')
# 邮件头信息
msg["To"] = Header(",".join(to_addrs))

采用while循环

采用询问“是否继续输入邮箱地址”的方式,并用while循环来实现多个收件人的功能。

定义一个空列表to_addrs,用来存放收件人邮箱地址。

to_addrs = []
while True:
    a=input('请输入收件人邮箱:')
    #输入收件人邮箱
    to_addrs.append(a)
    #写入列表
    b=input('是否继续输入,n退出,任意键继续:')
    #询问是否继续输入
    if b == 'n':
        break

print(to_addrs)

调用csv模块

第一步,将数据写入csv文件:(若有现成的csv文件,则可以跳过此步)

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) 

第二步,读取csv文件

# 读取收件人数据,并启动写信和发信流程
try:
    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()
            server.connect(smtp_server,465)
            server.login(from_addr, password)
            server.sendmail(from_addr, to_addrs, msg.as_string())
    print("邮件发送成功")
    # 关闭服务器
    server.quit()
except:
    print("发送失败")
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值