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

使用smtplib发送邮件至ServiceDesk无法解析的问题排查求助

问题描述

使用smtplib库发送邮件至ServiceDesk时,邮件主题为~Bot~ subject,正文包含~~OPERATION=AddRequest~~、~~REQUESTER=FULL NAME~~等参数。按照ServiceDesk配置,这类被~包裹的内容应该被解析,但通过Outlook发送时解析正常,用smtplib发送则完全无法解析——主题仍显示为~Bot~ subject,且REQUESTER参数未替换为发送人信息。已尝试修改编码、更换邮件发送库,均未解决问题。相关代码如下:

import smtplib
from email.mime.text import MIMEText

to = 'servicedesk@my-domain.com'
gmail_user = 'servicedesk@my-domain.com'
gmail_pwd = 'password'
smtpserver = smtplib.SMTP("smtp.office365.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo
smtpserver.login(gmail_user, gmail_pwd)

subject = "~Bot~ 123"

msg = MIMEText("~~OPERATION=AddRequest~~\r\n~~REQUESTER=FIO~~")
msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject

smtpserver.sendmail(gmail_user, to, msg.as_bytes())
smtpserver.close()
问题分析
  • EHLO调用错误:代码中smtpserver.ehlo未加括号,导致第二次EHLO命令未执行,SMTP会话初始化不完整,可能引发邮件格式被服务器修改。
  • 邮件头编码不规范:直接设置msg['Subject']时,smtplib默认的处理方式未符合ServiceDesk的解析预期,而Outlook会自动对主题做标准编码处理。
  • 正文格式与编码未明确:默认创建的MIMEText未指定编码,换行符格式可能不符合ServiceDesk的解析要求。
  • REQUESTER参数为占位符:代码中使用FIO作为占位符,而非ServiceDesk可识别的有效用户标识(如邮箱、系统用户名)。
解决办法

1. 修复EHLO调用

确保两次EHLO命令都正确执行:

smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()  # 添加括号执行方法

2. 规范邮件主题编码

使用email.header模块对主题做标准编码,保留~符号的原始格式:

from email.header import Header

subject = Header("~Bot~ 123", 'utf-8').encode()
msg['Subject'] = subject

3. 明确正文的MIME类型与编码

创建MIMEText时指定编码为utf-8,并统一换行符格式:

msg = MIMEText("~~OPERATION=AddRequest~~\n~~REQUESTER=John Doe <john.doe@my-domain.com>~~", 'plain', 'utf-8')

4. 替换REQUESTER为有效标识

将REQUESTER的值替换为ServiceDesk系统内可识别的用户信息,比如用户邮箱或全名。

完整修正代码

import smtplib
from email.mime.text import MIMEText
from email.header import Header

to = 'servicedesk@my-domain.com'
gmail_user = 'servicedesk@my-domain.com'
gmail_pwd = 'password'
smtpserver = smtplib.SMTP("smtp.office365.com", 587)
smtpserver.ehlo()
smtpserver.starttls()
smtpserver.ehlo()
smtpserver.login(gmail_user, gmail_pwd)

subject = Header("~Bot~ 123", 'utf-8').encode()
msg = MIMEText("~~OPERATION=AddRequest~~\n~~REQUESTER=John Doe <john.doe@my-domain.com>~~", 'plain', 'utf-8')
msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject

smtpserver.sendmail(gmail_user, to, msg.as_string())
smtpserver.close()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:53:12