You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用smtplib通过邮箱转短信网关发送短信如何显示自定义发件人名称

解决方案

问题根源

该问题的核心诱因来自两个层面的限制:

  • Gmail SMTP服务的反垃圾机制:未提前验证的自定义发件人显示名/别名会被Gmail自动覆盖,替换为账户主邮箱地址
  • 运营商邮箱转短信网关的解析规则:绝大多数公共网关会忽略邮件头的发件人显示名字段,仅提取信封发件人邮箱地址作为短信的发件人展示

修正步骤

1. 正确格式化发件人字段

不要直接拼接字符串写msg['From'],使用email.utils.formataddr标准方法格式化发件人信息,避免解析错误。

2. 提前在Gmail中配置发件人别名

如果要使用自定义显示名,需要先在Gmail后台完成别名验证:

登录Gmail→右上角设置→「账户和导入」标签→找到「发送邮件为」选项→点击「添加其他电子邮件地址」,按照提示完成验证后,自定义发件人才会生效,不会被Gmail覆盖。

3. 调整代码逻辑

修改后的完整代码如下:

import smtplib 
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.utils import formataddr

email = "mymail@gmail.com"
pas = "Your Pass"
# 自定义发件人显示名
sender_name = "John Doe"

sms_gateway = 'number@tmomail.net'

smtp = "smtp.gmail.com" 
port = 587

server = smtplib.SMTP(smtp,port)
server.starttls()
server.login(email,pas)

msg = MIMEMultipart()
# 用formataddr格式化发件人
msg['From'] = formataddr((sender_name, email))
msg['To'] = sms_gateway

# 大多数短信网关会忽略主题,可考虑把主题内容合并到正文
# msg['Subject'] = "Something...\n"
body = "Something More...\n"
msg.attach(MIMEText(body, 'plain'))
sms = msg.as_string()

# 信封发件人和邮件头From保持一致
server.sendmail(email, sms_gateway, sms)

server.quit()

4. 针对运营商网关的特殊处理

如果修改后仍然只显示邮箱地址,说明使用的运营商网关直接丢弃了发件人显示名字段,这种情况有两种替代方案:

  • 将想要展示的发件人信息放在正文最开头,接收方打开短信第一时间就能看到
  • 联系运营商开通企业级短信网关服务,这类付费服务支持自定义短信发件人号码/名称,普通公共网关出于反垃圾短信的考虑,普遍不支持自定义发件人

注意

如果希望完全隐藏自己的邮箱地址,使用公共SMTP服务(如Gmail、Outlook)无法实现,所有公共邮件服务商都会在邮件头中标记真实发件邮箱,必然会被网关识别到。只有使用自行搭建的私有SMTP服务,且运营商网关支持读取自定义发件人字段时,才有可能实现完全隐藏真实邮箱。

内容的提问来源于stack exchange,提问作者Sai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 05:36:03