使用Pandas DataFrame列中邮箱地址无法发送邮件的技术问询
问题排查与解决方案
1. 清理邮箱地址中的冗余字符
从数据库读取的EMAIL列可能包含隐藏的空格、换行符或制表符,导致邮件服务器无法识别有效地址。在循环中添加地址清理步骤:
for index, row in df.iterrows(): raw_email = row['EMAIL'] print(repr(raw_email)) # 打印原始字符串,排查是否有隐藏字符 to = raw_email.strip() # 去除首尾空格、换行符 # 后续发送逻辑不变
2. 修正SMTP发送逻辑
原代码存在两个关键问题:
- 未将CC地址加入实际发送列表,导致CC收件人无法收到邮件
- 部分邮件服务器要求明确设置发件人字段,且收件人参数需为字符串/字符串列表
修改send_email函数:
def send_email(subject,to,cc,body): sender_email = 'test@test.com' # 清理并整理所有收件人 to_clean = to.strip() cc_clean = cc.strip() all_recipients = [to_clean] if cc_clean: all_recipients.extend([addr.strip() for addr in cc_clean.split(',')]) host = "bulkmail.test.com" try: server = smtplib.SMTP(host) msg = MIMEText(body) msg['Subject'] = subject msg['From'] = sender_email # 必须设置发件人 msg['To'] = to_clean msg['Cc'] = cc_clean server.sendmail(sender_email, all_recipients, msg.as_string()) except smtplib.SMTPException as e: print(f"发送失败至{to_clean}: {str(e)}") finally: server.quit()
3. 开启SMTP调试模式
添加调试日志,查看邮件服务器交互细节,快速定位问题:
server = smtplib.SMTP(host) server.set_debuglevel(1) # 开启调试,打印SMTP命令与响应
4. 验证数据库查询结果
确认读取的邮箱列无空值或无效格式:
print(df['EMAIL'].dtype) # 检查数据类型是否为字符串 print(df['EMAIL'].isnull().sum()) # 统计空值数量 print(df['EMAIL'].str.contains(r'[^a-zA-Z0-9@.\-_]').sum()) # 排查特殊字符
内容的提问来源于stack exchange,提问作者MohammadReza moeini
相关产品推荐
相关产品推荐

