如何用Python合规免费群发邮件避免进入垃圾邮箱?
解决Python群发邮件进垃圾邮箱的合规方案及邮件服务使用指南
一、免费合规群发邮件避免进垃圾邮箱的优化方案
1. 核心问题分析
你当前使用Gmail SMTP群发但进入垃圾箱的主要原因包括:
- 邮件内容无个性化,固定模板易被反垃圾系统识别
- 未配置SPF/DKIM/DMARC等邮件认证(Gmail虽自带,但第三方SMTP发送仍需注意规范)
- 发送行为过于规律,固定间隔易被判定为机器人操作
2. 具体优化措施
(1)邮件内容与合规性优化
- 强制个性化:给每个博主的邮件加入频道名称、博主昵称等专属信息,避免完全一致的模板
- 规避垃圾关键词:将生硬的“推广”改为“内容联动”“合作探讨”这类更真诚的表述
- 添加退订选项:即使是免费群发,合规的退订链接能大幅降低被标记为垃圾邮件的概率
- 优化邮件格式:同时提供纯文本和HTML版本,提升可读性的同时符合邮件规范
(2)代码层面优化
修改你的代码,加入个性化逻辑、合规配置和随机发送间隔:
from email.message import EmailMessage import ssl import smtplib import time import random email_sender = 'myemail@gmail.com' # 注意:Gmail开启两步验证后需使用「应用密码」,而非普通登录密码 with open('google_password.txt') as f: email_password = f.read().strip() # 带个性化参数的邮件模板 def get_subject(channel_name): return f"合作邀请:我的Django网站与{channel_name}的内容联动" def get_body(channel_name, youtuber_name): return f""" 您好{youtuber_name}, 我关注您的频道{channel_name}很久了,非常喜欢您关于[领域关键词]的内容,觉得和我开发的Django网站「[网站名称]」高度契合。 网站主要提供[核心功能/服务],希望能和您探讨合作可能性,比如内容植入、专属粉丝优惠等,期待您的回复。 如果您对此不感兴趣,可点击[退订链接]取消接收此类邮件。 祝好, [你的名字] """ def send_email(email_receiver, channel_name, youtuber_name): em = EmailMessage() em['From'] = email_sender em['To'] = email_receiver em['Subject'] = get_subject(channel_name) em['Reply-To'] = 'your-reply-email@example.com' # 可选:指定回复邮箱 em.set_content(get_body(channel_name, youtuber_name)) # 添加HTML版本(可选,提升邮件质感) em.add_alternative(f""" <html> <body> <p>您好{youtuber_name},</p> <p>我关注您的频道{channel_name}很久了,非常喜欢您关于[领域关键词]的内容,觉得和我开发的Django网站「<a href="[你的网站链接]">[网站名称]</a>」高度契合。</p> <p>网站主要提供[核心功能/服务],希望能和您探讨合作可能性,比如内容植入、专属粉丝优惠等,期待您的回复。</p> <p>如果您对此不感兴趣,可点击<a href="[退订链接]">退订</a>取消接收此类邮件。</p> <p>祝好,<br>[你的名字]</p> </body> </html> """, subtype='html') context = ssl.create_default_context() # 使用STARTTLS模式(部分邮箱更推荐) with smtplib.SMTP('smtp.gmail.com', 587) as smtp: smtp.starttls(context=context) smtp.login(email_sender, email_password) smtp.send_message(em) # 存储博主的邮箱、频道名、昵称信息 email_receivers = [ ('youtuber1@example.com', 'Tech实验室', '王老师'), ('youtuber2@example.com', '游戏攻略站', '李同学'), # ... 其他博主信息 ] for receiver_info in email_receivers: email_receiver, channel_name, youtuber_name = receiver_info try: send_email(email_receiver, channel_name, youtuber_name) print(f"邮件已发送至: {email_receiver}") # 随机间隔3-7分钟,避免固定频率触发反垃圾机制 sleep_time = random.randint(180, 420) time.sleep(sleep_time) except Exception as e: print(f"发送失败至{email_receiver}: {str(e)}") continue print("所有邮件发送完成。")
(3)Gmail使用注意事项
- 免费版Gmail每日发送上限为500封,大量发送陌生邮箱易触发限制
- 必须开启两步验证并使用「应用密码」登录SMTP,普通密码会被拒绝
二、Amazon SES与Mailgun的使用方法
1. Amazon SES(免费额度内)
基础流程
- 注册AWS账号,进入SES控制台,先在沙箱模式下验证发件人邮箱和收件人邮箱(沙箱仅允许发送至已验证邮箱,需申请移出沙箱才能发送至任意邮箱)
- 绑定自有域名,配置SPF、DKIM记录,完成邮件认证
- 获取AWS Access Key和Secret Key,用于Python调用API
Python代码示例
先安装依赖:pip install boto3
import boto3 from botocore.exceptions import ClientError def send_email_ses(sender, recipient, subject, body_text, body_html): # 初始化SES客户端(选择你的AWS区域,如us-east-1) client = boto3.client('ses', region_name='us-east-1', aws_access_key_id='你的Access Key', aws_secret_access_key='你的Secret Key') try: response = client.send_email( Destination={'ToAddresses': [recipient]}, Message={ 'Body': { 'Html': {'Charset': 'UTF-8', 'Data': body_html}, 'Text': {'Charset': 'UTF-8', 'Data': body_text} }, 'Subject': {'Charset': 'UTF-8', 'Data': subject} }, Source=sender ) except ClientError as e: print(f"发送失败: {e.response['Error']['Message']}") else: print(f"邮件发送成功!消息ID: {response['MessageId']}") # 使用示例 sender = 'your-verified-email@example.com' recipient = 'youtuber@example.com' subject = '合作邀请' body_text = '纯文本内容' body_html = '<html><body>HTML格式的邮件内容</body></html>' send_email_ses(sender, recipient, subject, body_text, body_html)
免费额度
每月前62000封邮件免费,超出后按每千封0.1美元收费。
2. Mailgun(免费额度内)
基础流程
- 注册Mailgun账号,免费版需绑定自有域名,验证域名所有权并配置SPF、DKIM记录
- 在控制台获取API密钥和已验证域名(沙箱域名仅允许发送至已验证邮箱,需绑定自有域名并通过审核才能发送至任意邮箱)
Python代码示例
先安装依赖:pip install requests
import requests def send_email_mailgun(api_key, domain, sender, recipient, subject, body_text, body_html): response = requests.post( f"https://api.mailgun.net/v3/{domain}/messages", auth=("api", api_key), data={ "from": sender, "to": [recipient], "subject": subject, "text": body_text, "html": body_html } ) return response # 使用示例 api_key = '你的Mailgun API密钥' domain = 'your-verified-domain.com' # 或沙箱域名 sender = '你的名字 <your-email@example.com>' recipient = 'youtuber@example.com' subject = '合作邀请' body_text = '纯文本内容' body_html = '<html><body>HTML格式的邮件内容</body></html>' response = send_email_mailgun(api_key, domain, sender, recipient, subject, body_text, body_html) print(response.text)
免费额度
每月前5000封邮件免费,超出后按每千封0.05美元收费。
内容的提问来源于stack exchange,提问作者user21744561
相关产品推荐
相关产品推荐

