5

Tài liệu Amazon SES không rõ ràng cho tôi. Vì vậy, nếu bạn có thể giúp tôi với một ví dụ tot gửi e-mail nguyên văn bản bao gồm một tập tin đính kèm PDF, điều này sẽ giúp tôi rất nhiều. Tôi sử dụng Python 2.5 và công cụ Google App. Tôi phải sử dụng "thô", vì đó là tùy chọn SES duy nhất nếu tôi bao gồm các tệp đính kèm.Tìm kiếm một ví dụ Amazon SES gửi thư thô bao gồm tệp đính kèm

vấn đề của tôi vào lúc này:

  • nội dung của bài yêu cầu là gì.
  • Tôi nên đặt trường thư nào vào tiêu đề.
  • Cách xử lý "returnPath".
  • Cách xử lý nội dung văn bản. Nó phải là: Content-Type: text/plain; charset = UTF-8; format = flowed; delsp = yes. Content-Transfer-Encoding: base64
  • Tôi làm cách nào để tạo chữ ký HMAC cho bài đăng này. Tôi biết làm thế nào để làm cho chữ ký, nhưng làm thế nào để chuỗi thô trông cho chức năng chữ ký.
+0

Bạn có thấy điều gì thú vị không, tôi cũng đang cố gắng gửi file đính kèm bằng python/boto. –

Trả lời

4

Ví dụ mã vào đây để gửi SES liệu e-mail bằng cách sử dụng cơ thể nhiều phần dữ liệu (đồng bằng/html/tập tin đính kèm) :

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)}) 

Ví dụ sử dụng:

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

Quy trình tôi đang sử dụng được nêu trong this gist. Nó chủ yếu đến từ sau ví dụ được đưa ra here.

+0

Cảm ơn bạn đã chia sẻ mã của mình. – voscausa

0

Tại sao lại sử dụng dữ liệu thô với API của họ khi bạn có thể gửi tệp đính kèm và mọi thứ qua giao diện SMTP chuẩn của họ? Bên cạnh đó, lần cuối tôi kiểm tra nguyên liệu không hỗ trợ BCC.

SMTP Interface: http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/SMTP.html

Danh sách các loại MIME đã được phê duyệt (nếu không SES nổi giận): http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/MIMETypes.html

Các vấn đề liên quan