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

