ServiceDesk 解析使用 smtplib 发送的电子邮件

ServiceDesk parsing email sent using smtplib

提问人:arnold 提问时间:9/28/2023 最后编辑:arnold 更新时间:10/8/2023 访问量:141

问:

让我解释一下情况:我使用(下面的代码)发送一封信给 . 这封信看起来像这样:smtplibServiceDesk

Subject: ~Bot~ subject
Body:
~~OPERATION=AddRequest~~
~~REQUESTER=FULL NAME~~

它写在参数中,它解析 中的信息。如果您从邮件(例如)发送一封信,则正常解析所有内容,但如果通过它根本不解析,则主题保持不变,并且不会从参数中替换发件人。ServiceDesk~OutlookServiceDesksmtplib~Bot~ subjectsubjectREQUESTER

法典:

import smtplib
from email.mime.text import MIMEText

to = '[email protected]'
gmail_user = '[email protected]'
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()

我尝试在发送消息时更改编码,但没有帮助。我还尝试了另一个用于发送信件的图书馆,结果也失败了。也许我缺乏能力,我根本没有指出一些必需的参数。

告诉我问题可能是什么以及如何解决。谢谢!

python 电子邮件 smtplib

评论

0赞 tripleee 10/8/2023
顺便说一句,看起来您的代码是为较旧的 Python 版本编写的。标准库中的模块在 Python 3.6 中进行了大修,使其更具逻辑性、通用性和简洁性;新代码应该以(不再是)新 API 为目标。可能扔掉这些代码,然后从 Python 电子邮件示例文档中的新式代码重新开始。emailemailEmailMessage
0赞 arnold 10/9/2023
@tripleee我试过了,不工作EmailMessage
0赞 tripleee 10/10/2023
主要问题是我们没有关于ServiceDesk在接收消息中查找内容的指导。我可以推测它希望 HTML 消息工作,但我没有办法测试它。同时,出于其他原因,搬到那里是个好主意。EmailMessage
0赞 tripleee 10/10/2023
你能分享一个有效的消息和一个无效的消息的(最小)来源吗?(不幸的是,Microsoft很难获得消息的确切来源。另存为 .EML 并在记事本中查看它,也许?
0赞 arnold 10/10/2023
@tripleee代码中已经指定了最小消息。问题是,如果您通过Outlook发送它,那么一切正常,但是如果您使用脚本发送它,则不会。~~OPERATION=AddRequest~~\r\n~~REQUESTER=name~~

答:

0赞 mr_mo 10/2/2023 #1

尝试使用 。这应该根据“正常”约定序列化消息。smtpserver.send_message(msg)

有关详细信息,请参阅 https://docs.python.org/3/library/email.examples.html

完整代码

import smtplib
from email.mime.text import MIMEText

to = '[email protected]'
gmail_user = '[email protected]'
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~~
~~REQUESTER=FIO~~
""")
msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject

smtpserver.send_message(msg)
smtpserver.close()

评论

0赞 arnold 10/3/2023
感谢您的回复!不幸的是,这种方法没有帮助。还有什么其他想法可能导致这个问题吗?
0赞 mr_mo 10/4/2023
我的猜测是解析器遗漏的编码不正确或空格/换行符。
0赞 Afzal K. 10/8/2023 #2

这里的问题很可能与电子邮件的格式有关。使用 smtplib 时,您发送的是没有任何格式或特殊字符的纯文本电子邮件。因此,ServiceDesk 可能无法正确解析电子邮件,因为它正在寻找特定的字符和格式。

解决方案是使用电子邮件包创建格式正确的电子邮件。

to = '[email protected]'
gmail_user = '[email protected]'
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 = MIMEMultipart()
msg['From'] = gmail_user
msg['To'] = to
msg['Subject'] = subject

body = "~~OPERATION=AddRequest~~\r\n~~REQUESTER=FIO~~"
msg.attach(MIMEText(body, 'plain'))

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

这将创建一个由多个部分组成的电子邮件,其正文包含 ServiceDesk 请求的格式。这应该可以解决问题,并允许 ServiceDesk 正确解析电子邮件。

确保在您的 Google 帐户中启用安全性较低的应用,以便能够使用 smtplib。

评论

0赞 arnold 10/9/2023
谢谢你的回答!不幸的是,你的回答没有帮助,你还有其他建议吗?