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
相关产品推荐
相关产品推荐

