本文整理汇总了Python中boto.ses.SESConnection.send_raw_email方法的典型用法代码示例。如果您正苦于以下问题:Python SESConnection.send_raw_email方法的具体用法?Python SESConnection.send_raw_email怎么用?Python SESConnection.send_raw_email使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类boto.ses.SESConnection
的用法示例。
在下文中一共展示了SESConnection.send_raw_email方法的11个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: send_mail
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
def send_mail(msg):
global access_key
global secret_key
client = SESConnection(
aws_access_key_id=access_key, aws_secret_access_key=secret_key)
senders = msg["From"].split(",")
recipients = msg["To"].split(',')
for sender in senders:
client.send_raw_email(msg.as_string(), sender, recipients)
client.close()
示例2: AmazonTransport
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class AmazonTransport(object):
__slots__ = ('ephemeral', 'id', 'key', 'host', 'connection')
def __init__(self, config):
self.id = config.get('id')
self.key = config.get('key')
self.host = config.get('host', "email.us-east-1.amazonaws.com")
self.connection = None
def startup(self):
self.connection = SESConnection(
aws_access_key_id = self.id,
aws_secret_access_key = self.key,
host = self.host
)
def deliver(self, message):
try:
response = self.connection.send_raw_email(
source = message.author.encode(),
destinations = message.recipients.encode(),
raw_message = str(message)
)
return (
response['SendRawEmailResponse']['SendRawEmailResult']['MessageId'],
response['SendRawEmailResponse']['ResponseMetadata']['RequestId']
)
except SESConnection.ResponseError, err:
raise # TODO: Raise appropriate internal exception.
示例3: emit
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
def emit(self, record):
"""
Emit a record.
Format the record and send it to the specified addressees.
"""
client = SESConnection(self.aws_key, self.aws_secret)
message = MIMEMultipart('alternative')
message.set_charset('UTF-8')
message['Subject'] = self._encode_str(self.getSubject(record))
message['From'] = self._encode_str(self.fromaddr)
message['To'] = self._convert_to_strings(self.toaddrs)
from email.utils import formatdate
body = self.format(record)
body = "From: %s\r\n" \
"To: %s\r\n" \
"Subject: %s\r\n" \
"Date: %s\r\n\r\n" \
"%s" % (
self.fromaddr,
",".join(self.toaddrs),
self.getSubject(record),
formatdate(),
body)
message.attach(MIMEText(self._encode_str(body), 'plain'))
return client.send_raw_email(message.as_string(), self.fromaddr,
destinations=self.toaddrs)
示例4: SESBackend
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
#.........这里部分代码省略.........
"""Close any open HTTP connections to the API server.
"""
try:
self.connection.close()
self.connection = None
except:
if not self.fail_silently:
raise
def send_messages(self, email_messages):
"""Sends one or more EmailMessage objects and returns the number of
email messages sent.
"""
if not email_messages:
return
new_conn_created = self.open()
if not self.connection:
# Failed silently
return
num_sent = 0
source = settings.AWS_SES_RETURN_PATH
for message in email_messages:
# Automatic throttling. Assumes that this is the only SES client
# currently operating. The AWS_SES_AUTO_THROTTLE setting is a
# factor to apply to the rate limit, with a default of 0.5 to stay
# well below the actual SES throttle.
# Set the setting to 0 or None to disable throttling.
if self._throttle:
global recent_send_times
now = datetime.now()
# Get and cache the current SES max-per-second rate limit
# returned by the SES API.
rate_limit = self.get_rate_limit()
# Prune from recent_send_times anything more than a few seconds
# ago. Even though SES reports a maximum per-second, the way
# they enforce the limit may not be on a one-second window.
# To be safe, we use a two-second window (but allow 2 times the
# rate limit) and then also have a default rate limit factor of
# 0.5 so that we really limit the one-second amount in two
# seconds.
window = 2.0 # seconds
window_start = now - timedelta(seconds=window)
new_send_times = []
for time in recent_send_times:
if time > window_start:
new_send_times.append(time)
recent_send_times = new_send_times
# If the number of recent send times in the last 1/_throttle
# seconds exceeds the rate limit, add a delay.
# Since I'm not sure how Amazon determines at exactly what
# point to throttle, better be safe than sorry and let in, say,
# half of the allowed rate.
if len(new_send_times) > rate_limit * window * self._throttle:
# Sleep the remainder of the window period.
delta = now - new_send_times[0]
total_seconds = (delta.microseconds + (delta.seconds +
delta.days * 24 * 3600) * 10**6) / 10**6
delay = window - total_seconds
if delay > 0:
sleep(delay)
recent_send_times.append(now)
# end of throttling
try:
response = self.connection.send_raw_email(
source=source or message.from_email,
destinations=message.recipients(),
raw_message=unicode(dkim_sign(message.message().as_string(),
dkim_key=self.dkim_key,
dkim_domain=self.dkim_domain,
dkim_selector=self.dkim_selector,
dkim_headers=self.dkim_headers,
), 'utf-8')
)
message.extra_headers['status'] = 200
message.extra_headers['message_id'] = response[
'SendRawEmailResponse']['SendRawEmailResult']['MessageId']
message.extra_headers['request_id'] = response[
'SendRawEmailResponse']['ResponseMetadata']['RequestId']
num_sent += 1
except SESConnection.ResponseError, err:
# Store failure information so to post process it if required
error_keys = ['status', 'reason', 'body', 'request_id',
'error_code', 'error_message']
for key in error_keys:
message.extra_headers[key] = getattr(err, key, None)
if not self.fail_silently:
raise
if new_conn_created:
self.close()
return num_sent
示例5: SESBackend
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class SESBackend(BaseEmailBackend):
"""A Django Email backend that uses Amazon's Simple Email Service.
"""
def __init__(self, fail_silently=False, *args, **kwargs):
super(SESBackend, self).__init__(fail_silently=fail_silently, *args, **kwargs)
self._access_key_id = getattr(settings, "AWS_ACCESS_KEY_ID", None)
self._access_key = getattr(settings, "AWS_SECRET_ACCESS_KEY", None)
self._api_endpoint = getattr(settings, "AWS_SES_API_HOST", SESConnection.DefaultHost)
self.connection = None
def open(self):
"""Create a connection to the AWS API server. This can be reused for
sending multiple emails.
"""
if self.connection:
return False
try:
self.connection = SESConnection(
aws_access_key_id=self._access_key_id, aws_secret_access_key=self._access_key, host=self._api_endpoint
)
except:
if not self.fail_silently:
raise
def close(self):
"""Close any open HTTP connections to the API server.
"""
try:
self.connection.close()
self.connection = None
except:
if not self.fail_silently:
raise
def send_messages(self, email_messages):
"""Sends one or more EmailMessage objects and returns the number of
email messages sent.
"""
if not email_messages:
return
new_conn_created = self.open()
if not self.connection:
# Failed silently
return
num_sent = 0
for message in email_messages:
try:
response = self.connection.send_raw_email(
source=message.from_email,
destinations=message.recipients(),
raw_message=message.message().as_string(),
)
message.extra_headers["status"] = 200
message.extra_headers["message_id"] = response["SendRawEmailResponse"]["SendRawEmailResult"][
"MessageId"
]
message.extra_headers["request_id"] = response["SendRawEmailResponse"]["ResponseMetadata"]["RequestId"]
num_sent += 1
except SESConnection.ResponseError, err:
# Store failure information so you can post process it if required
error_keys = ["status", "reason", "body", "request_id", "error_code", "error_message"]
for key in error_keys:
message.extra_headers[key] = getattr(err, key, None)
if not self.fail_silently:
raise
if new_conn_created:
self.close()
return num_sent
示例6: SESBackend
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
#.........这里部分代码省略.........
# returned by the SES API.
rate_limit = self.get_rate_limit()
logger.debug(u"send_messages.throttle rate_limit='{}'".format(rate_limit))
# Prune from recent_send_times anything more than a few seconds
# ago. Even though SES reports a maximum per-second, the way
# they enforce the limit may not be on a one-second window.
# To be safe, we use a two-second window (but allow 2 times the
# rate limit) and then also have a default rate limit factor of
# 0.5 so that we really limit the one-second amount in two
# seconds.
window = 2.0 # seconds
window_start = now - timedelta(seconds=window)
new_send_times = []
for time in recent_send_times:
if time > window_start:
new_send_times.append(time)
recent_send_times = new_send_times
# If the number of recent send times in the last 1/_throttle
# seconds exceeds the rate limit, add a delay.
# Since I'm not sure how Amazon determines at exactly what
# point to throttle, better be safe than sorry and let in, say,
# half of the allowed rate.
if len(new_send_times) > rate_limit * window * self._throttle:
# Sleep the remainder of the window period.
delta = now - new_send_times[0]
total_seconds = (delta.microseconds + (delta.seconds +
delta.days * 24 * 3600) * 10**6) / 10**6
delay = window - total_seconds
if delay > 0:
sleep(delay)
recent_send_times.append(now)
# end of throttling
try:
response = self.connection.send_raw_email(
source=source or message.from_email,
destinations=message.recipients(),
raw_message=dkim_sign(message.message().as_string(),
dkim_key=self.dkim_key,
dkim_domain=self.dkim_domain,
dkim_selector=self.dkim_selector,
dkim_headers=self.dkim_headers)
)
message.extra_headers['status'] = 200
message.extra_headers['message_id'] = response[
'SendRawEmailResponse']['SendRawEmailResult']['MessageId']
message.extra_headers['request_id'] = response[
'SendRawEmailResponse']['ResponseMetadata']['RequestId']
num_sent += 1
if 'X-SES-CONFIGURATION-SET' in message.extra_headers:
logger.debug(u"send_messages.sent from='{}' recipients='{}' message_id='{}' request_id='{}' ses-configuration-set='{}'".format(
message.from_email,
", ".join(message.recipients()),
message.extra_headers['message_id'],
message.extra_headers['request_id'],
message.extra_headers['X-SES-CONFIGURATION-SET']
))
else:
logger.debug(u"send_messages.sent from='{}' recipients='{}' message_id='{}' request_id='{}'".format(
message.from_email,
", ".join(message.recipients()),
message.extra_headers['message_id'],
message.extra_headers['request_id']
))
except SESConnection.ResponseError as err:
# Store failure information so to post process it if required
error_keys = ['status', 'reason', 'body', 'request_id',
'error_code', 'error_message']
for key in error_keys:
message.extra_headers[key] = getattr(err, key, None)
if not self.fail_silently:
raise
if new_conn_created:
self.close()
return num_sent
def get_rate_limit(self):
if self._access_key_id in cached_rate_limits:
return cached_rate_limits[self._access_key_id]
new_conn_created = self.open()
if not self.connection:
raise Exception(
"No connection is available to check current SES rate limit.")
try:
quota_dict = self.connection.get_send_quota()
max_per_second = quota_dict['GetSendQuotaResponse'][
'GetSendQuotaResult']['MaxSendRate']
ret = float(max_per_second)
cached_rate_limits[self._access_key_id] = ret
return ret
finally:
if new_conn_created:
self.close()
示例7: SesSender
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class SesSender(object):
logger = None
def run(self):
self.init_log()
self.init_signer()
try:
self.log("Args: %r" % argv)
self.log("Env: %r" % dict(environ))
self.get_parties()
self.get_credentials()
self.make_connection()
self.process_message()
self.send_message()
except Exception:
self.abort('Unspecified error',1)
def get_parties(self):
try:
self.sender = argv[1]
self.recipients = argv[2:]
except Exception:
self.abort('Missing Sender / Recipients',2)
def get_credentials(self):
try:
self.aws_id = environ['AWS_ACCESS_KEY_ID']
self.aws_key = environ['AWS_SECRET_KEY']
assert self.aws_id is not None
assert self.aws_key is not None
except Exception:
self.abort('Missing AWS Credentials',3)
def make_connection(self):
try:
self.conn = SESConnection(self.aws_id,self.aws_key)
except Exception:
self.abort('Failed to establish connection',4)
def process_message(self):
try:
msg = stdin.read()
assert msg[:4] == 'From'
msg = self.sanitize_headers(msg)
envelope,msg = msg.split('\n',1)
self.msg = self.sign_message(msg)
self.log('Sender: %r' % self.sender)
self.log('Recipients: %r' % self.recipients)
self.log('Message:\n' + msg)
except Exception:
self.abort('Failed to process message text',5)
def sanitize_headers(self, msg):
msg_obj = Parser().parsestr(msg)
for hdr in msg_obj.keys():
if hdr not in aws_allowed_headers and not hdr.startswith('X-'):
del msg_obj[hdr]
return str(msg_obj)
def sign_message(self, msg):
if self.dkim:
return DKIM(msg).sign(self.dkim_selector,
self.dkim_domain, self.dkim_private_key,
canonicalize=('relaxed', 'simple'),
include_headers=dkim_include_headers) + msg
else:
return msg
def send_message(self):
try:
self.conn.send_raw_email(
source=self.sender,
raw_message=self.msg,
destinations=self.recipients
)
except BotoServerError, bse:
if 'InvalidTokenId' in bse.body:
self.abort('Bad AWS Credentials (token)',6)
if 'SignatureDoesNotMatch' in bse.body:
self.abort('Bad AWS Credentials (signature)',6)
if bse.error_code == 'Throttling':
self.abort('Failed to actually deliver message: quota exceeded',9)
self.abort('Failed to actually deliver message:',7)
except Exception:
self.abort('Failed to actually deliver message:',7)
示例8: SESBackend
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class SESBackend(BaseEmailBackend):
"""A Django Email backend that uses Amazon's Simple Email Service.
"""
def __init__(self, fail_silently=False, *args, **kwargs):
super(SESBackend, self).__init__(fail_silently=fail_silently, *args,
**kwargs)
self._access_key_id = getattr(settings, 'AWS_ACCESS_KEY_ID', None)
self._access_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY', None)
self._api_endpoint = getattr(settings, 'AWS_SES_API_HOST',
SESConnection.DefaultHost)
self.connection = None
self._lock = threading.RLock()
def open(self):
"""Create a connection to the AWS API server. This can be reused for
sending multiple emails.
"""
if self.connection:
return False
try:
self.connection = SESConnection(
aws_access_key_id=self._access_key_id,
aws_secret_access_key=self._access_key,
host=self._api_endpoint,
)
except:
if not self.fail_silently:
raise
def close(self):
"""Close any open HTTP connections to the API server.
"""
try:
self.connection.close()
self.connection = None
except:
if not self.fail_silently:
raise
def send_messages(self, email_messages):
"""Sends one or more EmailMessage objects and returns the number of
email messages sent.
"""
if not email_messages:
return
self._lock.acquire()
try:
new_conn_created = self.open()
if not self.connection:
# Failed silently
return
num_sent = 0
for message in email_messages:
try:
self.connection.send_raw_email(
source=message.from_email,
destinations=message.recipients(),
raw_message=message.message().as_string(),
)
num_sent += 1
except SESConnection.ResponseError:
if not self.fail_silently:
raise
pass
if new_conn_created:
self.close()
finally:
self._lock.release()
return num_sent
示例9: mailsender
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
def mailsender(request):
mail = request.FILES[u"file"].read()
to = request.GET["to"]
# split headers
i = mail.find("\n\n")
headers, mail = mail[:i], mail[i:]
headers = headers.split("\n")
allowed = {
"MIME-Version",
"Message-ID",
"In-Reply-To",
"Content-Type",
"Date",
"Subject",
"From",
"To",
"Bcc",
"Cc",
"References",
}
from_ = None
h = []
i = 0
while i < len(headers):
add = False
header = headers[i][: headers[i].find(":")]
if header in allowed:
add = True
if header == "From":
from_ = headers[i][headers[i].find(":") + 1 :].strip()
while True:
if add:
h.append(headers[i])
i += 1
if i >= len(headers) or headers[i][0] not in " \t":
break
mail = "\n".join(h) + mail
# find from email
i = from_.find("<")
if i != -1:
from_ = from_[i + 1 :]
from_ = from_[: from_.find(">")]
# logger.info("headers: %s", str(headers))
# logger.info("h: %s", str(h))
logger.info("Mail from %s to %s recieved", from_, to)
# Only allow sending from altekamereren domains and registered users.
if (
not from_.endswith("@altekamereren.org")
and not from_.endswith("@altekamereren.com")
and User.objects.filter(email=from_).exists()
):
logger.info("Sender not accepted.")
return HttpResponse(status=403)
to = to.replace(u"flojt", u"flöjt")
reciever = to.split("@")[0]
if reciever in ak.sections:
user_emails = [
user.email
for user in User.objects.filter(instrument__in=ak.section_to_short_instruments[reciever], is_active=True)
]
logger.info("Sending to section %s: %s", to, str(user_emails))
elif reciever == u"infolistan":
reciever = [user.email for user in User.objects.filter(is_active=True)]
logger.info("Sending to infolistan: %s", str(reciever))
else:
logger.info("List not accepted.")
return HttpResponse(status=400)
from django.conf import settings
from boto.ses import SESConnection
from boto.exception import BotoServerError
access_key_id = getattr(settings, "AWS_ACCESS_KEY_ID", None)
access_key = getattr(settings, "AWS_SECRET_ACCESS_KEY", None)
api_endpoint = getattr(settings, "AWS_SES_API_HOST", SESConnection.DefaultHost)
connection = SESConnection(aws_access_key_id=access_key_id, aws_secret_access_key=access_key, host=api_endpoint)
if not user_emails:
return HttpResponse(status=400)
try:
connection.send_raw_email(mail, settings.ADMINS[0][1], user_emails)
except BotoServerError as e:
i = e.body.find("<Message>")
message = e.body[i + len("<Message>") :]
message = message[: message.find("</Message>")]
if message == "Email address is not verified.":
#.........这里部分代码省略.........
示例10: SesSender
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class SesSender(object):
logger = None
def run(self):
self.init_log()
try:
self.log("Args: %r" % argv)
self.log("Env: %r" % dict(environ))
self.get_parties()
self.get_credentials()
self.make_connection()
self.process_message()
self.send_message()
except Exception:
self.abort('Unspecified error',1)
def get_parties(self):
try:
self.sender = argv[1]
self.recipients = argv[2:]
except Exception:
self.abort('Missing Sender / Recipients',2)
def get_credentials(self):
try:
self.aws_id = environ['AWS_ACCESS_KEY_ID']
self.aws_key = environ['AWS_SECRET_KEY']
assert self.aws_id is not None
assert self.aws_key is not None
except Exception:
self.abort('Missing AWS Credentials',3)
def make_connection(self):
try:
self.conn = SESConnection(self.aws_id,self.aws_key)
except Exception:
self.abort('Failed to establish connection',4)
def process_message(self):
try:
msg = stdin.read()
assert msg[:4] == 'From'
envelope,msg = msg.split('\n',1)
self.msg = msg
self.log('Sender: %r' % self.sender)
self.log('Recipients: %r' % self.recipients)
self.log('Message:\n' + msg)
except Exception:
self.abort('Failed to process message text',5)
def send_message(self):
try:
self.conn.send_raw_email(
source=self.sender,
raw_message=self.msg,
destinations=self.recipients
)
except BotoServerError, bse:
if 'InvalidTokenId' in bse.body:
self.abort('Bad AWS Credentials (token)',6)
if 'SignatureDoesNotMatch' in bse.body:
self.abort('Bad AWS Credentials (signature)',6)
self.abort('Failed to actually deliver message',7)
except Exception:
self.abort('Failed to actually deliver message',7)
示例11: SESBackend
# 需要导入模块: from boto.ses import SESConnection [as 别名]
# 或者: from boto.ses.SESConnection import send_raw_email [as 别名]
class SESBackend(BaseEmailBackend):
"""A Django Email backend that uses Amazon's Simple Email Service.
"""
def __init__(self, fail_silently=False, *args, **kwargs):
super(SESBackend, self).__init__(fail_silently=fail_silently, *args,
**kwargs)
self._access_key_id = getattr(settings, 'AWS_ACCESS_KEY_ID', None)
self._access_key = getattr(settings, 'AWS_SECRET_ACCESS_KEY', None)
self._api_endpoint = getattr(settings, 'AWS_SES_API_HOST',
SESConnection.DefaultHost)
self.connection = None
self._lock = threading.RLock()
def open(self):
"""Create a connection to the AWS API server. This can be reused for
sending multiple emails.
"""
if self.connection:
return False
try:
self.connection = SESConnection(
aws_access_key_id=self._access_key_id,
aws_secret_access_key=self._access_key,
host=self._api_endpoint,
)
except:
if not self.fail_silently:
raise
def close(self):
"""Close any open HTTP connections to the API server.
"""
try:
self.connection.close()
self.connection = None
except:
if not self.fail_silently:
raise
def dkim_sign(self, message):
# Courtesy of http://djangosnippets.org/snippets/1995/
raw_message = message.message().as_string()
if settings.DKIM_PRIVATE_KEY:
included_headers = ["Content-Type", "MIME-Version", "Content-Transfer-Encoding", "Subject", "From", "To"]
dkim_header = dkim.sign(raw_message, settings.DKIM_SELECTOR, settings.DKIM_DOMAIN, settings.DKIM_PRIVATE_KEY, include_headers=included_headers)
raw_message = dkim_header + raw_message
return raw_message
def send_messages(self, email_messages):
"""Sends one or more EmailMessage objects and returns the number of
email messages sent.
"""
if not email_messages:
return
self._lock.acquire()
try:
new_conn_created = self.open()
if not self.connection:
# Failed silently
return
num_sent = 0
for message in email_messages:
raw_message = self.dkim_sign(message)
try:
self.connection.send_raw_email(
source=message.from_email,
destinations=message.recipients(),
raw_message=raw_message,
)
num_sent += 1
except SESConnection.ResponseError:
if not self.fail_silently:
raise
pass
if new_conn_created:
self.close()
finally:
self._lock.release()
return num_sent