smtplib 改为通过SSL 465 发送邮件

本文介绍了一种通过将smtplib的SMTP连接更改为SMTP_SSL连接并调整端口为465来实现邮件发送过程中的SSL加密的方法。

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

原来使用smtplib 自动发送邮件通知,后来邮箱系统升级,要求收发邮件都必须走SSL安全通道,原来使用的25端口就不能正常发送邮件了,好在smtplib支持SSL,改动非常简单。

原来的代码:

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

def sendmail(mailcontent, to_addr, mailheader):
    from_addr = 'yyyy@xxxxx.com'
    password = 'youkonw'
    smtp_server = 'smtp.XXXXX.com'
    msg = MIMEText(mailcontent, 'HTML', 'utf-8')
    msg['From'] = _format_addr("tet<%s>" % from_addr)
    msg['To'] = _format_addr("admin <%s>" % to_addr)
    msg['Subject'] = Header(mailheader, 'utf-8').encode()
    try:
        server = smtplib.SMTP(smtp_server, 25)        
        server.set_debuglevel(0)# 关闭debug模式
        server.login(from_addr, password)        
        server.sendmail(from_addr, to_addr.split(','), msg.as_string())
        server.quit
        return True
    except:
        return False

改动后的代码:

def _format_addr(s):
    name, addr = parseaddr(s)
    return formataddr((Header(name, 'utf-8').encode(), addr))

def sendmail(mailcontent, to_addr, mailheader):
    from_addr = 'sjzxbk@cvicse.com'
    password = 'LxRAVWSs9bj51Dc4'
    smtp_server = 'smtp.qiye.163.com'
    msg = MIMEText(mailcontent, 'HTML', 'utf-8')
    msg['From'] = _format_addr("数据中心运维管理工具<%s>" % from_addr)
    msg['To'] = _format_addr("数据中心管理员 <%s>" % to_addr)
    msg['Subject'] = Header(mailheader, 'utf-8').encode()
    try:
        server = smtplib.SMTP_SSL(smtp_server, 465)
        server.ehlo()
        #print("have already connect to server on port 25")
        server.set_debuglevel(0)# 关闭debug模式
        server.login(from_addr, password)
        #print("have already login usingpassword")
        server.sendmail(from_addr, to_addr.split(','), msg.as_string())
        server.quit
        return True
    except:
        return False

### 使用 `smtplib` 发送邮件时修复 From 标头报错的方法 当使用 Python 的 `smtplib` 和 `email.mime.text.MIMEText` 模块发送邮件时,如果遇到 From 标头报错的情况,通常是因为邮件头信息未正确设置或不符合标准。以下是解决问题的具体方法: #### 1. 正确配置邮件头中的 From 字段 在构建邮件对象时,需确保 `msg['From']` 被正确定义并赋值为合法的电子邮件地址。例如: ```python from email.header import Header from email.mime.text import MIMEText # 设置发件人邮箱地址 sender_email = 'your_email@qq.com' # 创建 MIMEText 对象作为邮件正文 msg = MIMEText('这是测试邮件的内容', 'plain', 'utf-8') # 定义邮件头信息 msg['From'] = Header(sender_email) # 确保此处填写的是实际使用的发件人邮箱地址[^2] ``` #### 2. 确认 SMTP 登录账户与 From 地址一致 某些邮件服务器(如 QQ 邮箱)会强制验证 `From` 头字段是否匹配登录账户。如果不一致,则可能引发错误。因此,在调用 `smtpObj.sendmail()` 方法前,务必确认以下两点: - **SMTP 登录账户** (`mail_user`) 应该与 `From` 字段保持一致。 - 如果需要伪装成其他发件人地址,可以尝试通过授权码而非密码完成身份认证。 示例代码如下所示: ```python import smtplib from email.mime.text import MIMEText from email.header import Header # 初始化参数 mail_host = "smtp.qq.com" # SMTP服务器 mail_user = "your_email@qq.com" # 用户名 mail_pass = "authorization_code" # 授权码 (不是QQ号密码) # 构建邮件内容 to_addrs = ['receiver@example.com'] subject = 'Python 测试邮件' content = '这是一封来自 Python 的测试邮件!' message = MIMEText(content, 'plain', 'utf-8') message['From'] = Header(mail_user) # 这里要填入真实的发件人邮箱地址[^3] message['To'] = Header(','.join(to_addrs)) message['Subject'] = Header(subject, 'utf-8') try: smtp_obj = smtplib.SMTP_SSL(mail_host, 465) # SSL通常是465 smtp_obj.login(mail_user, mail_pass) result = smtp_obj.sendmail(mail_user, to_addrs, message.as_string()) print("邮件发送成功", result) except Exception as e: print(f"Error: {e}") finally: smtp_obj.quit() ``` #### 3. 检查邮件服务商的安全策略 一些主流邮件服务商为了防止垃圾邮件泛滥,会对 From 地址实施严格校验机制。以 QQ 邮箱为例,只有经过官方审核批准后的第三方应用才能更改默认显示名称;未经许可擅自修改可能会触发安全警告甚至被拒收。所以建议先按照上述步骤操作后再联系对应平台客服咨询更高级别的权限申请流程。 --- ### 总结 综上所述,解决 `smtplib` 发送邮件过程中出现的 From 标头错误问题的关键在于合理设定邮件头部数据以及遵循目标邮箱系统的相关规定。具体措施包括但不限于精确指定发件者标识符、保障账号凭证合法性还有了解清楚各运营商对于自定义来源标签的支持程度等多方面因素共同作用下达成预期效果[^1].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值