谷歌应用引擎,python,unicode,电子邮件,邮件api

时间:2011-07-26 21:38:45

标签: python google-app-engine unicode

我正在使用开源Web服务python应用程序通过GAE发送电子邮件,但如果名称或电子邮件正文包含阿拉伯语或希伯来语字符,则应用程序会抛出一些错误(例如“指示的参数无效”)。因此,我需要知道如何解决这个问题。我必须指出,我是一名Python初学者(自从我开始使用Python以来已有一周)。

#
import cgi
import os
import logging
import contextlib
from xml.dom import minidom
from xml.dom.minidom import Document
import exceptions
import warnings
import imghdr
from google.appengine.api import images
from google.appengine.api import users
from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext.webapp import template
from google.appengine.api import mail
import wsgiref.handlers

# START Constants
CONTENT_TYPE_HEADER = "Content-Type"
CONTENT_TYPE_TEXT = "text/plain"
XML_CONTENT_TYPE = "application/xml"
XML_ENCODING = "utf-8"
"""
Allows you to specify IP addresses and associated "api_key"s to prevent others from using your app.
Storage and Manipulation methods will check for this "api_key" in the POST/GET params.
Retrieval methods don't use it (however you could enable them to use it, but maybe rewrite so you have a "read" key and a "write" key to prevent others from manipulating your data).

Set "AUTH = False" to disable (allowing anyone use your app and CRUD your data).

To generate a hash/api_key visit https://www.grc.com/passwords.htm
To find your ip visit http://www.whatsmyip.org/
"""
AUTH = False
# END Constants

# START Exception Handling
class Error(StandardError):
    pass
class Forbidden(Error):
    pass

logging.getLogger().setLevel(logging.DEBUG)

@contextlib.contextmanager
def mailExcpHandler(ctx):
    try:
        yield {}
    except (ValueError), exc:
        xml_error_response(ctx, 400 ,'app.invalid_parameters', 'The indicated parameters are not valid: ' + exc.message)
    except (Forbidden), exc:
        xml_error_response(ctx, 403 ,'app.forbidden', 'You don\'t have permission to perform this action: ' + exc.message)
    except (Exception), exc:
        xml_error_response(ctx, 500 ,'system.other', 'An unexpected error in the web service has happened: ' + exc.message)

def xml_error_response(ctx, status, error_id, error_msg):
    ctx.error(status)
    doc = Document()
    errorcard = doc.createElement("error")
    errorcard.setAttribute("id", error_id)
    doc.appendChild(errorcard)
    ptext = doc.createTextNode(error_msg)
    errorcard.appendChild(ptext)
    ctx.response.headers[CONTENT_TYPE_HEADER] = XML_CONTENT_TYPE
    ctx.response.out.write(doc.toxml(XML_ENCODING))
# END Exception Handling

# START Helper Methods
def isAuth(ip = None, key = None):
    if AUTH == False:
        return True
    elif AUTH.has_key(ip) and key == AUTH[ip]:
        return True
    else:
        return False

# END Helper Methods


# START Request Handlers
class Send(webapp.RequestHandler):
    def post(self):
        """
        Sends an email based on POST params. It will queue if resources are unavailable at the time.

        Returns "Success"

        POST Args:
            to: the receipent address
            from: the sender address (must be a registered GAE email)
            subject: email subject
            body: email body content
        """
        with mailExcpHandler(self):
            # check authorised
            if isAuth(self.request.remote_addr,self.request.POST.get('api_key')) == False:
                raise Forbidden("Invalid Credentials")

            # read data from request
            mail_to = str(self.request.POST.get('to'))
            mail_from = str(self.request.POST.get('from'))
            mail_subject = str(self.request.POST.get('subject'))
            mail_plain = str(self.request.POST.get('plain'))
            mail_html = str(self.request.POST.get('html'))

            message = mail.EmailMessage()
            message.sender = mail_from
            message.to = mail_to
            message.subject = mail_subject
            message.body = mail_plain
            if mail_html != None and mail_html != "":
                message.html = mail_html

            message.send()

            self.response.headers[CONTENT_TYPE_HEADER] = CONTENT_TYPE_TEXT
            self.response.out.write("Success")


# END Request Handlers

# START Application
application = webapp.WSGIApplication([
                                                                             ('/send', Send)
                                                                         ],debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

# END Application

1 个答案:

答案 0 :(得分:0)

mail_to = str(self.request.POST.get('to'))
mail_from = str(self.request.POST.get('from'))
mail_subject = str(self.request.POST.get('subject'))
mail_plain = str(self.request.POST.get('plain'))
mail_html = str(self.request.POST.get('html'))

我怀疑你需要将它们转换成字符串。尝试没有str(),它可以工作。