2011-07-26 2 views
0

Я использую приложение python для веб-службы с открытым исходным кодом для отправки электронной почты через GAE, но если имя или тело письма содержит арабский или ивритский символы, приложение вызывает некоторые ошибки (например, «Указанные параметры недействительны»). Поэтому мне нужно знать, как исправить эту проблему. Я должен отметить, что я начинающий Python (через неделю после того, как начал играть с Python).google app engine, python, unicode, email, mail api

# 
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 
+0

Какую версию python вы используете и какие версии имеют импортированные библиотеки? – Hyperboreus

+1

Предположим, вы имеете в виду герои персонажей. Я сомневаюсь, что я когда-нибудь сталкивался с персонажами в Храме. – agf

+0

@Hyperboreus python версия 2.7.1 и GAE 1.4.2 – Michael

ответ

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(), он может работать.