我有一个从PHP脚本执行的python脚本。
这个脚本发送和发送电子邮件,它比swiftmailer快几个数量级,但我有一个问题。我对python或charachter编码并不是很了解,有时会从python的MIMEText库中生成有关编码的错误。我用Google搜索并找到了解决方案,但我仍然希望将php脚本作为pyback脚本失败时的后备。
问题是,在except循环中,似乎我无法在脚本终止之前将数据传递回php?关于我在这里做错什么的任何想法?你可以在except块中看到我说result = {type:' failed'}然后尝试对它进行json编码,但数据没有回到php脚本。
import sys, json, os, smtplib, socket, logging
LOG_FILE='/tmp/mandrill.out'
logging.basicConfig(filename=LOG_FILE,level=logging.DEBUG)
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.utils import formataddr
try:
data = json.loads(sys.argv[1])
msg = MIMEMultipart('alternative')
msg['Subject'] = data['subject']
msg['From'] = formataddr((str(Header(u'Business Name', 'utf-8')), data['from']))
msg['To'] = data['to']
html = data['body']
email = MIMEText(html, 'html','utf-8')
username = 'username'
password = 'password'
msg.attach(email)
s = smtplib.SMTP('smtp.example.com', 587, socket.getfqdn(), 3)
s.login(username, password)
s.sendmail(msg['From'], msg['To'], msg.as_string())
s.quit()
result = {'type': 'success'}
print json.dumps(result)
except:
result = {'type': 'error'}
logging.exception('Got exception on main handler')
raise
return json.dumps(result)
编辑包含跟踪
ERROR:root:Got exception on main handler
Traceback (most recent call last):
File "/usr/share/nginx/mandrill/mandrill.py", line 16, in <module>
email = MIMEText(html, 'html')
File "/usr/lib/python2.7/email/mime/text.py", line 30, in __init__
self.set_payload(_text, _charset)
File "/usr/lib/python2.7/email/message.py", line 226, in set_payload
self.set_charset(charset)
File "/usr/lib/python2.7/email/message.py", line 262, in set_charset
self._payload = self._payload.encode(charset.output_charset)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 9580: ordinal not in range(128)
答案 0 :(得分:3)
您不能使用return
将数据返回到PHP调用脚本,您需要print
,就像您在成功案例中所做的那样。
此外,调用raise
会将异常传播到脚本的主要部分,从而阻止执行return json.dumps(result)
(应该是print
)。您不需要再次引发异常(您的脚本无论如何都会终止)。
您也可能(或者说)想要通过sys.exit()
从python脚本设置返回代码,然后您的PHP脚本可以检查返回代码以检测错误。惯例是为成功设置返回代码0,为失败设置其他任何东西。
此外,您正在使用一个bare except子句来捕获所有异常 - 您看到的实际异常是什么?你能用完整的追溯来更新你的问题吗?
答案 1 :(得分:1)
raise
导致Python脚本终止,因此它永远不会到达return
。
下一个问题是return
只能在Python中使用,才能将值返回给调用函数。您可能希望打印JSON字符串(但这在某种程度上取决于您如何从PHP调用Python,这里没有记录)。
追溯表明
email = MIMEText(html, 'html','utf-8')
实际上并不属实;您在代码中缺少导致错误回溯的'utf-8'
参数。
答案 2 :(得分:0)
您正在使用sys.exit(1)终止该程序。 如果你想将数据返回到某个东西,我会用
交换sys.exit(1)行 return json.dumps(result)