保姆级教你如何利用qq邮箱进行群发邮件。

保姆级教你如何利用qq邮箱进行群发邮件。

在工作中遇到了群发邮件的问题,联系第三方需要花钱来发邮件,因此自己写了一个脚本来群发邮件。

废话不多说,直接上代码。

没有python环境可以直接使用已经封装好的脚本。

百度网盘资源链接:通过网盘分享的文件:dist.zip

链接: https://pan.baidu.com/s/15R_Ort-qB50R8iuN6Zpz3w 提取码: q9sz

以下为代码

import smtplib

import pandas as pd

from email.mime.text import MIMEText

from email.mime.multipart import MIMEMultipart

from email.mime.base import MIMEBase

from email import encoders

import tkinter as tk

from tkinter import filedialog, messagebox, scrolledtext

# QQ 邮箱配置

SMTP_SERVER = 'smtp.qq.com' # QQ 邮箱 SMTP 服务器地址

SMTP_PORT = 587 # QQ 邮箱 SMTP 端口(TLS)

# 读取收件人信息

def load_recipients(file_path):

if file_path.endswith('.csv'):

return pd.read_csv(file_path)

elif file_path.endswith('.xlsx'):

return pd.read_excel(file_path)

else:

raise ValueError("不支持的文件格式,请使用 CSV 或 Excel 文件。")

# 发送邮件

def send_email(sender_email, sender_password, recipient_email, subject, body, attachment_path=None):

try:

msg = MIMEMultipart()

msg['From'] = sender_email

msg['To'] = recipient_email

msg['Subject'] = subject

msg.attach(MIMEText(body, 'plain'))

if attachment_path:

with open(attachment_path, 'rb') as attachment:

part = MIMEBase('application', 'octet-stream')

part.set_payload(attachment.read())

encoders.encode_base64(part)

part.add_header(

'Content-Disposition',

f'attachment; filename={attachment_path.split("/")[-1]}'

)

msg.attach(part)

server = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)

server.starttls()

server.login(sender_email, sender_password)

server.send_message(msg)

server.quit() # 显式关闭连接

return True, f"邮件已发送至: {recipient_email}"

except Exception as e:

return False, f"发送邮件至 {recipient_email} 失败: {e}"

# 主界面

class EmailSenderApp:

def __init__(self, root):

self.root = root

self.root.title("邮件批量发送")

# 发件人邮箱配置

self.sender_email_label = tk.Label(root, text="发件人邮箱:")

self.sender_email_label.grid(row=0, column=0, sticky="w")

self.sender_email_entry = tk.Entry(root, width=50)

self.sender_email_entry.grid(row=0, column=1, padx=10, pady=5, sticky="w")

# 发件人授权码配置

self.sender_password_label = tk.Label(root, text="发件人授权码:")

self.sender_password_label.grid(row=1, column=0, sticky="w")

self.sender_password_entry = tk.Entry(root, width=50, show="*") # 隐藏授权码

self.sender_password_entry.grid(row=1, column=1, padx=10, pady=5, sticky="w")

# 邮件模板编辑框

self.template_label = tk.Label(root, text="邮件模板:")

self.template_label.grid(row=2, column=0, sticky="w")

self.template_text = scrolledtext.ScrolledText(root, width=120, height=30)

self.template_text.grid(row=3, column=0, columnspan=2, padx=10, pady=5)

self.template_text.insert(tk.END, """尊敬的 {姓名},

您好!

感谢您对 {公司} 的支持。您在 {公司} 担任 {职位},我们非常重视您的贡献。

祝您工作愉快!

此致,

敬礼

""")

# 导入表格按钮

self.import_button = tk.Button(root, text="导入表格", command=self.import_table)

self.import_button.grid(row=4, column=0, padx=10, pady=5, sticky="w")

# 发送邮件按钮

self.send_button = tk.Button(root, text="发送邮件", command=self.send_emails)

self.send_button.grid(row=4, column=1, padx=10, pady=5, sticky="e")

# 状态栏

self.status_label = tk.Label(root, text="就绪", fg="blue")

self.status_label.grid(row=5, column=0, columnspan=2, pady=5)

# 控制台信息显示框

self.console_label = tk.Label(root, text="邮件发送日志:")

self.console_label.grid(row=6, column=0, sticky="w")

self.console_text = scrolledtext.ScrolledText(root, width=80, height=15)

self.console_text.grid(row=7, column=0, columnspan=2, padx=10, pady=5)

# 表格数据

self.recipients = None

# 导入表格

def import_table(self):

file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx"), ("CSV files", "*.csv")])

if file_path:

try:

self.recipients = load_recipients(file_path)

self.status_label.config(text=f"已导入表格: {file_path}", fg="green")

self.log_message(f"成功导入表格: {file_path}")

except Exception as e:

messagebox.showerror("错误", f"导入表格失败: {e}")

self.log_message(f"导入表格失败: {e}")

# 发送邮件

def send_emails(self):

if self.recipients is None:

messagebox.showwarning("警告", "请先导入表格!")

self.log_message("未导入表格,请先导入表格!")

return

# 获取发件人邮箱和授权码

sender_email = self.sender_email_entry.get().strip()

sender_password = self.sender_password_entry.get().strip()

if not sender_email or not sender_password:

messagebox.showwarning("警告", "发件人邮箱和授权码不能为空!")

self.log_message("发件人邮箱或授权码为空,请填写完整!")

return

template = self.template_text.get("1.0", tk.END).strip()

if not template:

messagebox.showwarning("警告", "邮件模板不能为空!")

self.log_message("邮件模板为空,请填写模板!")

return

total = len(self.recipients)

success_count = 0

for index, row in self.recipients.iterrows():

recipient_name = row.get('姓名', '')

recipient_email = row.get('邮箱', '')

company = row.get('公司', '')

position = row.get('职位', '')

if not recipient_email:

self.log_message(f"跳过第 {index + 1} 行:邮箱地址为空")

continue

# 替换模板中的变量

email_body = template.format(

姓名=recipient_name,

公司=company,

职位=position

)

# 发送邮件

success, message = send_email(

sender_email=sender_email,

sender_password=sender_password,

recipient_email=recipient_email,

subject=f"尊敬的 {recipient_name},您好!",

body=email_body

)

self.log_message(message)

if success:

success_count += 1

self.status_label.config(text=f"邮件发送完成:成功 {success_count}/{total}", fg="green")

self.log_message(f"邮件发送完成:成功 {success_count}/{total}")

# 记录日志信息

def log_message(self, message):

self.console_text.insert(tk.END, message + "\n")

self.console_text.see(tk.END) # 自动滚动到底部

self.root.update() # 更新界面

# 运行程序

if __name__ == '__main__':

root = tk.Tk()

app = EmailSenderApp(root)

root.mainloop()

以上为代码。

运行后为以下界面:

发件人邮箱需要填写你自己的qq邮箱,发件人授权码通过以下方式获得。

1.登录qq邮箱网页版,进入设置。

2.点击账户,下拉找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。

3.申请获得授权码。

4.获得授权码后输入到脚本输入框。

5.编辑群发模板,变量通过{表头}来表示,变量在表格中编辑。表头有多少就可以有多少变量可以使用。

希望这个脚本可以帮到你,如果你没有python环境可以直接使用我打包好的文件。点击后直接运行脚本。

百度网盘资源链接:通过网盘分享的文件:dist.zip

链接: https://pan.baidu.com/s/15R_Ort-qB50R8iuN6Zpz3w 提取码: q9sz

相关画作

联通流量超额多少钱一兆 – 联通流量超了1M要扣多少钱?实测教你避开话费刺客
古典舞怎么数拍子
365bet手机网址是多少

古典舞怎么数拍子

📅 07-22 👁️ 5009
陲的解释
如何下载365app软件

陲的解释

📅 07-02 👁️ 2312