-
-
Save seedifferently/806474 to your computer and use it in GitHub Desktop.
""" | |
Example code for sending emails using boto's SES module. Its main purpose is to | |
show how easy it is to build multipart text/html emails. | |
Unfortunately, at this time Amazon's SES doesn't seem to allow you to add | |
attachments to messages, but if it does in the future it would probably look | |
like the code that I've commented out below the exception. | |
The SES module of the Boto package isn't quite finalized yet, but I currently | |
have this code running using Harry Marr's implementation which is available at: | |
https://github.com/hmarr/boto/tree/ses | |
""" | |
import mimetypes | |
from email import encoders | |
from email.utils import COMMASPACE | |
from email.mime.multipart import MIMEMultipart | |
from email.mime.audio import MIMEAudio | |
from email.mime.base import MIMEBase | |
from email.mime.image import MIMEImage | |
from email.mime.text import MIMEText | |
from boto.ses import SESConnection | |
AWS_ACCESS_KEY = 'PUT ACCESS KEY HERE' | |
AWS_SECRET_KEY = 'PUT SECRET KEY HERE' | |
connection = SESConnection(AWS_ACCESS_KEY, AWS_SECRET_KEY) | |
class SESMessage(object): | |
""" | |
Usage: | |
msg = SESMessage('[email protected]', '[email protected]', 'The subject') | |
msg.text = 'Text body' | |
msg.html = 'HTML body' | |
msg.send() | |
""" | |
def __init__(self, source, to_addresses, subject, **kw): | |
self.ses = connection | |
self._source = source | |
self._to_addresses = to_addresses | |
self._cc_addresses = None | |
self._bcc_addresses = None | |
self.subject = subject | |
self.text = None | |
self.html = None | |
self.attachments = [] | |
def send(self): | |
if not self.ses: | |
raise Exception, 'No connection found' | |
if (self.text and not self.html and not self.attachments) or \ | |
(self.html and not self.text and not self.attachments): | |
return self.ses.send_email(self._source, self.subject, | |
self.text or self.html, | |
self._to_addresses, self._cc_addresses, | |
self._bcc_addresses, | |
format='text' if self.text else 'html') | |
else: | |
if not self.attachments: | |
message = MIMEMultipart('alternative') | |
message['Subject'] = self.subject | |
message['From'] = self._source | |
if isinstance(self._to_addresses, (list, tuple)): | |
message['To'] = COMMASPACE.join(self._to_addresses) | |
else: | |
message['To'] = self._to_addresses | |
message.attach(MIMEText(self.text, 'plain')) | |
message.attach(MIMEText(self.html, 'html')) | |
else: | |
raise NotImplementedError, 'SES does not currently allow ' + \ | |
'messages with attachments.' | |
# message = MIMEMultipart() | |
# | |
# message_alt = MIMEMultipart('alternative') | |
# | |
# if self.text: | |
# message_alt.attach(MIMEText(self.text, 'plain')) | |
# if self.html: | |
# message_alt.attach(MIMEText(self.html, 'html')) | |
# | |
# message.attach(message_alt) | |
# | |
# message['Subject'] = self.subject | |
# message['From'] = self._source | |
# if isinstance(self._to_addresses, (list, tuple)): | |
# message['To'] = COMMASPACE.join(self._to_addresses) | |
# else: | |
# message['To'] = self._to_addresses | |
# message.preamble = 'You will not see this in a MIME-aware mail reader.\n' | |
# print 'message: ', message.as_string() | |
# for attachment in self.attachments: | |
# # Guess the content type based on the file's extension. Encoding | |
# # will be ignored, although we should check for simple things like | |
# # gzip'd or compressed files. | |
# ctype, encoding = mimetypes.guess_type(attachment) | |
# if ctype is None or encoding is not None: | |
# # No guess could be made, or the file is encoded (compressed), so | |
# # use a generic bag-of-bits type. | |
# ctype = 'application/octet-stream' | |
# maintype, subtype = ctype.split('/', 1) | |
# if maintype == 'text': | |
# fp = open(attachment) | |
# # Note: we should handle calculating the charset | |
# part = MIMEText(fp.read(), _subtype=subtype) | |
# fp.close() | |
# elif maintype == 'image': | |
# fp = open(attachment, 'rb') | |
# part = MIMEImage(fp.read(), _subtype=subtype) | |
# fp.close() | |
# elif maintype == 'audio': | |
# fp = open(attachment, 'rb') | |
# part = MIMEAudio(fp.read(), _subtype=subtype) | |
# fp.close() | |
# else: | |
# fp = open(attachment, 'rb') | |
# part = MIMEBase(maintype, subtype) | |
# part.set_payload(fp.read()) | |
# fp.close() | |
# # Encode the payload using Base64 | |
# encoders.encode_base64(part) | |
# # Set the filename parameter | |
# part.add_header('Content-Disposition', 'attachment', filename=attachment) | |
# message.attach(part) | |
return self.ses.send_raw_email(self._source, message.as_string(), | |
destinations=self._to_addresses) |
Seems to be allowed now...
http://docs.aws.amazon.com/ses/latest/DeveloperGuide/mime-types.html
HI, I am getting an error Can you please help me to resolve it?
AttributeError Traceback (most recent call last)
in
----> 1 sendMails.send()
in send(self)
55 message['To'] = self._to_addresses
56
---> 57 message.attach(MIMEText(self.text, 'plain'))
58 message.attach(MIMEText(self.html, 'html'))
59 else:
~\anaconda3\lib\email\mime\text.py in init(self, _text, _subtype, _charset, policy)
32 if _charset is None:
33 try:
---> 34 _text.encode('us-ascii')
35 _charset = 'us-ascii'
36 except UnicodeEncodeError:
hey, the new pattern is for send_raw_email is send_raw_email(raw_message, source=None, destinations=None), i would like to send only raw email but it gives me an error, i just replaced send_email function with send_raw_email