Python实现:将邮件正文作为变量传入SendEmail功能的问题
问题描述
我在用Alteryx做工作流自动化,它自带的「Send Email」工具限制附件大小10MB,但我日常的每日/每周报告很多都超了这个限制。于是我自己做了个示例工作流,接收包含邮件各部分内容的变量数组,现在除了邮件正文,其他部分都正常。我想把任意内容作为正文字符串变量传进去,但字符串里的单引号、双引号和斜杠会导致变量失效,邮件发出去后正文是空的。
想问下有没有办法对整个变量编码,让Python忽略输入字符串里的所有转义字符?或者是不是得在Python步骤前做预处理,把'替换成'''这类操作?
当前使用的Python代码
# List all non-standard packages to be imported by your # script here (only missing packages will be installed) from ayx import Package #Package.installPackages(['pandas','numpy']) from ayx import Alteryx import smtplib from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders pyArray = Alteryx.read("#1") body = pyArray["pymailBody"][0] msg = MIMEMultipart() msg['From'] = pyArray["pymailFrom"][0] msg['To'] = pyArray["pymailTo"][0] msg['CC'] = pyArray["pymailCC"][0] msg['BCC'] = pyArray["pymailBCC"][0] msg['Subject'] = pyArray["pymailSubject"][0] msg['Body'] = body.encode('unicode_escape') attachmentName = pyArray["pymailAttachmentName"][0] attachmentPath = pyArray["pymailAttachmentPath"][0] part = MIMEBase('application', "octet-stream") part.set_payload(open(attachmentPath, "rb").read()) encoders.encode_base64(part) part.add_header('Content-Disposition', 'attachment', filename=attachmentName) msg.attach(part) with smtplib.SMTP("mail.company.com", 25) as server: server.ehlo() server.starttls() server.ehlo() server.send_message(msg)
解决方法
修正正文设置逻辑
你当前设置邮件正文的方式错误,MIMEMultipart不能直接通过msg['Body']赋值,需要用MIMEText创建正文部件并附加到邮件对象中,同时不需要用unicode_escape编码,直接使用原始字符串即可。修改后的代码片段:# 导入MIMEText模块 from email.mime.text import MIMEText # 替换原msg['Body']那一行 body_part = MIMEText(body, 'plain', 'utf-8') msg.attach(body_part)特殊字符处理(可选)
如果Alteryx传入的字符串存在转义异常(比如单引号被转义成\'),可以在Python中做还原处理:# 还原被转义的单引号、双引号和斜杠 body = body.replace("\\'", "'").replace('\\"', '"').replace('\\\\', '\\')Alteryx端注意事项
在Alteryx中传递正文变量时,确保输入的是原始内容,不要手动添加转义字符,比如在「Text Input」工具中直接输入带特殊字符的文本即可。
内容的提问来源于stack exchange,提问作者funkyman50
相关产品推荐
相关产品推荐

