5

Amazon SESのドキュメントは私にとってはっきりしていません。あなたがPDF添付ファイルを含む生のテキストの電子メールを送信する例で私を助けることができれば、これは私を大いに助けます。私はPython 2.5とGoogle Appエンジンを使用します。 "raw"を使用する必要があります。なぜなら、これは添付ファイルを含める場合、SESの唯一のオプションだからです。現時点ではアマゾンSESの例を参照してください。アタッチメントを含む生のメールを送信しています

私の問題:

  • POSTリクエストの内容は何ですか。
  • ヘッダーに入れるメッセージフィールドはどれですか。
  • "returnPath"の処理方法。
  • テキスト本文の処理方法。それは次のようにする必要があります:Content-Type:text/plain; charset = UTF-8; format = flowed; delsp = yes。 コンテンツ転送エンコーディング:base64
  • この投稿のHMAC署名はどのように構成しますか?私は署名を作成する方法を知っていますが、生の文字列は署名関数をどのように探しますか?
+0

興味深いものを見つけましたか、python/botoで添付ファイルを送信しようとしています。 –

答えて

4

例のコードは、マルチボディ(無地/ HTML /添付ファイル)を使用して、SES生の電子メールを送信します:

from email.mime.text import MIMEText 
from email.mime.application import MIMEApplication 
from email.mime.multipart import MIMEMultipart 
from google.appengine.api import urlfetch 
from google.appengine.runtime import DeadlineExceededError 
import urllib 
import hmac 
import base64 
import hashlib 
from datetime import datetime 
import logging 


def ses_multi_part(msg_subject, msg_to, msg_body='', msg_cc=None, msg_bcc=None, file_name=None, file_reader=None, 
         msg_type='plain', msg_from='[email protected]', msg_reply_to='[email protected]'): 
    """ send an html or plain e-mail. Use file_name and file_reader to pass an attachment 
     inspiration: https://codeadict.wordpress.com/2010/02/11/send-e-mails-with-attachment-in-python/ 
    """ 

    msg = MIMEMultipart() 
    msg.set_charset("utf-8") 

    msg['Subject'] = msg_subject 
    msg['From'] = msg_from 
    msg['Reply-to'] = msg_reply_to 
    msg['To'] = msg_to 
    if msg_cc: 
     msg['Cc'] = msg_cc 
    if msg_bcc: 
     msg['Bcc'] = msg_bcc 
    logging.debug(msg) 

    msg.preamble = 'Multipart massage.\n' 

    part = MIMEText(msg_body, msg_type, "utf-8") 
    msg.attach(part) 

    if file_name: 
     part = MIMEApplication(file_reader.read()) 
     part.add_header('Content-Disposition', 'attachment', filename=file_name) 
     msg.attach(part) 

    return msg.as_string() 


class SES(object): 
    """ SES send RAW e-mail 
     inspiration: https://github.com/richieforeman/python-amazon-ses-api/blob/master/amazon_ses.py 
    """ 

    def __init__(self, accessKeyID, secretAccessKey, return_path='[email protected]'): 

     self._accessKeyID = accessKeyID 
     self._secretAccessKey = secretAccessKey 
     self.ses_return_path = return_path 

    def _getSignature(self, dateValue): 

     h = hmac.new(key=self._secretAccessKey, msg=dateValue, digestmod=hashlib.sha256) 
     return base64.b64encode(h.digest()).decode() 

    def _getHeaders(self): 

     headers = {'Content-type': 'application/x-www-form-urlencoded', 'Return-Path': self.ses_return_path} 
     d = datetime.utcnow() 
     dateValue = d.strftime('%a, %d %b %Y %H:%M:%S GMT') 
     headers['Date'] = dateValue 
     signature = self._getSignature(dateValue) 
     headers['X-Amzn-Authorization'] = 'AWS3-HTTPS AWSAccessKeyId=%s, Algorithm=HMACSHA256, Signature=%s' % (self._accessKeyID, signature) 
     return headers 

    def _performAction(self, actionName, params=None): 

     if not params: 
      params = {} 
     params['Action'] = actionName 

     response = None 
     #https://email.us-east-1.amazonaws.com/ 

     retry = 0 # download error retry 
     while retry <= 1: # dan een eenmalige retry 
      try: 
       url = 'https://email.us-east-1.amazonaws.com' 
       response = urlfetch.fetch(url=url, payload=urllib.urlencode(params), method=urlfetch.POST, headers=self._getHeaders()) 
       break 
      except (urlfetch.DownloadError, DeadlineExceededError), e: 
       logging.debug('Amazon SES download or deadline error : %d' % (retry + 1)) 
       if retry == 0: 
        retry += 1 
        continue # retry 
       else: 
        logging.warning('fetcherror' + str(e)) 
        raise # bij een dubbele fout stoppen 

     if response.status_code != 200: 
      logging.warning(response.headers) 
      logging.warning(response.content) 
      raise ValueError('status_code : %s' % (str(response.status_code))) 

     logging.debug(response.content) 
     return response.content 

    def sendRawEmail(self, raw_msg_data): 

     return self._performAction("SendRawEmail", params={"RawMessage.Data": base64.b64encode(raw_msg_data)}) 

使用例:

ses = SES(settings.AMAZON_ACCESS_KEY_ID, settings.AMAZON_SECRET_ACCESS_KEY, settings.SES_RETURN_PATH[country]) 
raw_msg_data = ses_multi_part(msg_subject=subject.encode('utf-8'), msg_to=mail_to, msg_body=body_text.encode('utf-8'), 
           msg_bcc=settings.MAIL_BCC, msg_reply_to=reply_to, msg_from=sender, msg_type=msg_type) 
ses.sendRawEmail(raw_msg_data) 
1

私が使用している手順は、this gistに概説されています。ほとんどの場合、hereの例に従っています。

+0

コードを共有していただきありがとうございます。 – voscausa

0

標準のSMTPインターフェイスを使用して添付ファイルやすべてを送信できるときに、APIでrawを使用する理由は何ですか?さらに、私が最後にrawをチェックしても、BCCはサポートされません。

SMTPインターフェース:承認されたMIMEタイプのhttp://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.html

一覧(そうでない場合はSESが怒る):ここhttp://docs.amazonwebservices.com/ses/latest/DeveloperGuide/MIMETypes.html

関連する問題