Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from email import encoders
- import smtplib
- from email.mime.multipart import MIMEMultipart
- from email.mime.text import MIMEText
- from email.mime.image import MIMEImage
- from email.mime.base import MIMEBase
- from django.conf import settings
- from html2text import HTML2Text
- from celery.utils.log import get_task_logger
- from celery.exceptions import SoftTimeLimitExceeded, MaxRetriesExceededError
- from recomed.celery import app
- __author__ = 'adam.jorgensen.za@gmail.com'
- logger = get_task_logger(__name__)
- html_to_text = HTML2Text()
- html_to_text.ignore_images = True
- #TODO: Find a new SMTP server that doesn't limit us to 20 emails per hour
- def send_email(to_address, subject, body_html, images=None, attachments=None, APP_ROOT=None):
- """
- Send an email. This is a Celery task and hence can be called asynchronously. SMTP settings are drawn from settings.py
- """
- try:
- logger.info("SENDING EMAIL TO: %s SUBJECT: %s" % (to_address, subject))
- message_root = MIMEMultipart('related')
- message_root.preamble = 'This is a multi-part message in MIME format.'
- message_root['Subject'] = subject
- message_root['From'] = settings.EMAIL_HOST_USER
- message_root['To'] = ', '.join(to_address) if not isinstance(to_address, basestring) else to_address
- message_content = MIMEMultipart('alternative')
- message_root.attach(message_content)
- if images:
- for filename, image_id in images:
- with open('%simages/%s' % (APP_ROOT, filename), 'rb') as image_file:
- image_content = MIMEImage(image_file.read())
- image_content.add_header('Content-ID', '<%s>' % image_id)
- message_root.attach(image_content)
- if attachments:
- for mime_main_type, mime_sub_type, filename, data in attachments:
- attachment = MIMEBase(mime_main_type, mime_sub_type)
- attachment.set_payload(data)
- encoders.encode_base64(attachment)
- attachment.add_header('Content-Disposition', 'attachment', filename=filename)
- message_root.attach(attachment)
- message_content.attach(MIMEText(html_to_text.handle(body_html), 'plain'))
- message_content.attach(MIMEText(body_html, 'html'))
- smtpserver = smtplib.SMTP_SSL(settings.EMAIL_HOST, settings.EMAIL_PORT)
- smtpserver.ehlo()
- smtpserver.login(settings.EMAIL_HOST_USER, settings.EMAIL_HOST_PASSWORD)
- # send email
- smtpserver.sendmail(settings.EMAIL_HOST_USER, to_address, message_root.as_string())
- smtpserver.quit()
- except Exception as exc:
- logger.error('Error(%s:%s) sending email with subject "%s" to "%s"' % (exc.__class__.__name__, str(exc), subject, to_address))
- raise exc
- return True
- @app.task(bind=True, time_limit=600, soft_time_limit=520, max_retries=10, compression='bzip2', rate_limit='20/h')
- def send_email_task(self, to_address, subject, body_html, images=None, attachments=None, APP_ROOT=None ):
- try:
- return send_email(to_address, subject, body_html, images, attachments, APP_ROOT=APP_ROOT)
- except (MemoryError, SoftTimeLimitExceeded) as exc:
- if isinstance(exc, MemoryError):
- logger.error('MemoryError while attempting to send email with subject "%s" to "%s". Scheduling retry.' % (subject, to_address))
- else:
- logger.error('Exceeded Soft Time Limit attempting to send email with subject "%s" to "%s". Scheduling retry.' % (subject, to_address))
- raise self.retry(exc=exc)
- except MaxRetriesExceededError as exc:
- logger.error('Retry limit reached attempting to send email with subject "%s" to "%s". Will not retry.' % (subject, to_address))
- return False
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement