-import email\r
-import socket\r
-import os\r
-\r
-from email.MIMEMultipart import MIMEMultipart\r
-from email.MIMEText import MIMEText\r
-from email.MIMEImage import MIMEImage\r
-\r
-from django.core.mail import DNS_NAME\r
-from smtplib import SMTP\r
-import email.Charset\r
-from forum import settings\r
-from django.template import loader, Context, Template\r
-from forum.utils.html import sanitize_html\r
-from forum.context import application_settings\r
-from forum.utils.html2text import HTML2Text\r
-from threading import Thread\r
-\r
-def send_msg_list(msgs, sender=None):\r
- if len(msgs):\r
- connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),\r
- local_hostname=DNS_NAME.get_fqdn())\r
-\r
- try:\r
- if (bool(settings.EMAIL_USE_TLS)):\r
- connection.ehlo()\r
- connection.starttls()\r
- connection.ehlo()\r
-\r
- if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:\r
- connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))\r
-\r
- if sender is None:\r
- sender = str(settings.DEFAULT_FROM_EMAIL)\r
-\r
- for email, msg in msgs:\r
- try:\r
- connection.sendmail(sender, [email], msg)\r
- except Exception, e:\r
- pass\r
- try:\r
- connection.quit()\r
- except socket.sslerror:\r
- connection.close()\r
- except Exception, e:\r
- pass\r
-\r
-def html2text(s, ignore_tags=(), indent_width=4, page_width=80):\r
- ignore_tags = [t.lower() for t in ignore_tags]\r
- parser = HTML2Text(ignore_tags, indent_width, page_width)\r
- parser.feed(s)\r
- parser.close()\r
- parser.generate()\r
- return parser.result\r
-\r
-def named(data):\r
- if isinstance(data, (tuple, list)) and len(data) == 2:\r
- return '%s <%s>' % data\r
-\r
- return str(data)\r
-\r
-def create_msg(subject, sender, recipient, html, text, images):\r
- msgRoot = MIMEMultipart('related')\r
- msgRoot['Subject'] = subject\r
- msgRoot['From'] = named(sender)\r
- msgRoot['To'] = named(recipient)\r
- msgRoot.preamble = 'This is a multi-part message from %s.' % unicode(settings.APP_SHORT_NAME).encode('utf8')\r
-\r
- msgAlternative = MIMEMultipart('alternative')\r
- msgRoot.attach(msgAlternative)\r
-\r
- msgAlternative.attach(MIMEText(text, _charset='utf-8'))\r
- msgAlternative.attach(MIMEText(html, 'html', _charset='utf-8'))\r
-\r
- for img in images:\r
- try:\r
- fp = open(img[0], 'rb')\r
- msgImage = MIMEImage(fp.read())\r
- fp.close()\r
- msgImage.add_header('Content-ID', '<'+img[1]+'>')\r
- msgRoot.attach(msgImage)\r
- except:\r
- pass\r
-\r
- return msgRoot.as_string()\r
-\r
-def send_email(subject, recipients, template, context={}, sender=None, images=[], threaded=True):\r
- if sender is None:\r
- sender = (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))\r
-\r
- if not len(images):\r
- images = [(os.path.join(str(settings.UPFILES_FOLDER), os.path.basename(str(settings.APP_LOGO))), 'logo')]\r
-\r
- context.update(application_settings(None))\r
- html_body = loader.get_template(template).render(Context(context))\r
- txt_body = html2text(html_body)\r
-\r
- if isinstance(recipients, str):\r
- recipients = [recipients]\r
-\r
- msgs = []\r
-\r
- for recipient in recipients:\r
- if isinstance(recipient, str):\r
- recipient_data = ('recipient', recipient)\r
- recipient_context = None\r
- elif isinstance(recipient, (list, tuple)) and len(recipient) == 2:\r
- name, email = recipient\r
- recipient_data = (name, email)\r
- recipient_context = None\r
- elif isinstance(recipient, (list, tuple)) and len(recipient) == 3:\r
- name, email, recipient_context = recipient\r
- recipient_data = (name, email)\r
- else:\r
- raise Exception('bad argument for recipients')\r
-\r
- if recipient_context is not None:\r
- recipient_context = Context(recipient_context)\r
- msg_html = Template(html_body).render(recipient_context)\r
- msg_txt = Template(txt_body).render(recipient_context)\r
- else:\r
- msg_html = html_body\r
- msg_txt = txt_body\r
-\r
- msg = create_msg(subject, sender, recipient_data, msg_html, msg_txt, images)\r
- msgs.append((email, msg))\r
-\r
- if threaded:\r
- thread = Thread(target=send_msg_list, args=[msgs])\r
- thread.setDaemon(True)\r
- thread.start()\r
- else:\r
- send_msg_list(msgs)
\ No newline at end of file
+import email
+import socket
+import os
+
+from email.mime.multipart import MIMEMultipart
+from email.mime.text import MIMEText
+from email.mime.image import MIMEImage
+
+from django.core.mail import DNS_NAME
+from smtplib import SMTP
+import email.Charset
+from forum import settings
+from django.template import loader, Context, Template
+from forum.utils.html import sanitize_html
+from forum.context import application_settings
+from forum.utils.html2text import HTML2Text
+from threading import Thread
+
+def send_msg_list(msgs, sender=None):
+ if len(msgs):
+ connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
+ local_hostname=DNS_NAME.get_fqdn())
+
+ try:
+ if (bool(settings.EMAIL_USE_TLS)):
+ connection.ehlo()
+ connection.starttls()
+ connection.ehlo()
+
+ if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
+ connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
+
+ if sender is None:
+ sender = str(settings.DEFAULT_FROM_EMAIL)
+
+ for email, msg in msgs:
+ try:
+ connection.sendmail(sender, [email], msg)
+ except Exception, e:
+ pass
+ try:
+ connection.quit()
+ except socket.sslerror:
+ connection.close()
+ except Exception, e:
+ pass
+
+def html2text(s, ignore_tags=(), indent_width=4, page_width=80):
+ ignore_tags = [t.lower() for t in ignore_tags]
+ parser = HTML2Text(ignore_tags, indent_width, page_width)
+ parser.feed(s)
+ parser.close()
+ parser.generate()
+ return parser.result
+
+def named(data):
+ if isinstance(data, (tuple, list)) and len(data) == 2:
+ return '%s <%s>' % data
+
+ return str(data)
+
+def create_msg(subject, sender, recipient, html, text, images):
+ msgRoot = MIMEMultipart('related')
+ msgRoot['Subject'] = subject
+ msgRoot['From'] = named(sender)
+ msgRoot['To'] = named(recipient)
+ msgRoot.preamble = 'This is a multi-part message from %s.' % unicode(settings.APP_SHORT_NAME).encode('utf8')
+
+ msgAlternative = MIMEMultipart('alternative')
+ msgRoot.attach(msgAlternative)
+
+ msgAlternative.attach(MIMEText(text, _charset='utf-8'))
+ msgAlternative.attach(MIMEText(html, 'html', _charset='utf-8'))
+
+ for img in images:
+ try:
+ fp = open(img[0], 'rb')
+ msgImage = MIMEImage(fp.read())
+ fp.close()
+ msgImage.add_header('Content-ID', '<'+img[1]+'>')
+ msgRoot.attach(msgImage)
+ except:
+ pass
+
+ return msgRoot.as_string()
+
+def send_email(subject, recipients, template, context={}, sender=None, images=[], threaded=True):
+ if sender is None:
+ sender = (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))
+
+ if not len(images):
+ images = [(os.path.join(str(settings.UPFILES_FOLDER), os.path.basename(str(settings.APP_LOGO))), 'logo')]
+
+ context.update(application_settings(None))
+ html_body = loader.get_template(template).render(Context(context))
+ txt_body = html2text(html_body)
+
+ if isinstance(recipients, str):
+ recipients = [recipients]
+
+ msgs = []
+
+ for recipient in recipients:
+ if isinstance(recipient, str):
+ recipient_data = ('recipient', recipient)
+ recipient_context = None
+ elif isinstance(recipient, (list, tuple)) and len(recipient) == 2:
+ name, email = recipient
+ recipient_data = (name, email)
+ recipient_context = None
+ elif isinstance(recipient, (list, tuple)) and len(recipient) == 3:
+ name, email, recipient_context = recipient
+ recipient_data = (name, email)
+ else:
+ raise Exception('bad argument for recipients')
+
+ if recipient_context is not None:
+ recipient_context = Context(recipient_context)
+ msg_html = Template(html_body).render(recipient_context)
+ msg_txt = Template(txt_body).render(recipient_context)
+ else:
+ msg_html = html_body
+ msg_txt = txt_body
+
+ msg = create_msg(subject, sender, recipient_data, msg_html, msg_txt, images)
+ msgs.append((email, msg))
+
+ if threaded:
+ thread = Thread(target=send_msg_list, args=[msgs])
+ thread.setDaemon(True)
+ thread.start()
+ else:
+ send_msg_list(msgs)
+
+
+def send_template_email(recipients, template, context):
+ t = loader.get_template(template)
+ context.update(dict(recipients=recipients, settings=settings))
+ t.render(Context(context))
+
+def create_and_send_mail_messages(messages):
+ sender = '%s <%s>' % (unicode(settings.APP_SHORT_NAME), unicode(settings.DEFAULT_FROM_EMAIL))
+
+ connection = SMTP(str(settings.EMAIL_HOST), str(settings.EMAIL_PORT),
+ local_hostname=DNS_NAME.get_fqdn())
+
+ try:
+ if (bool(settings.EMAIL_USE_TLS)):
+ connection.ehlo()
+ connection.starttls()
+ connection.ehlo()
+
+ if settings.EMAIL_HOST_USER and settings.EMAIL_HOST_PASSWORD:
+ connection.login(str(settings.EMAIL_HOST_USER), str(settings.EMAIL_HOST_PASSWORD))
+
+ if sender is None:
+ sender = str(settings.DEFAULT_FROM_EMAIL)
+
+ for recipient, subject, html, text, media in messages:
+ msgRoot = MIMEMultipart('related')
+ msgRoot.set_charset('utf-8')
+ msgRoot['Subject'] = subject
+ msgRoot['From'] = sender
+ msgRoot['To'] = '%s <%s>' % (recipient.username, recipient.email)
+ msgRoot.preamble = 'This is a multi-part message from %s.' % unicode(settings.APP_SHORT_NAME).encode('utf8')
+
+ msgAlternative = MIMEMultipart('alternative')
+ msgRoot.attach(msgAlternative)
+
+ msgAlternative.attach(MIMEText(text))
+ msgAlternative.attach(MIMEText(html, 'html'))
+
+ for alias, location in media.items():
+ fp = open(location, 'rb')
+ msgImage = MIMEImage(fp.read())
+ fp.close()
+ msgImage.add_header('Content-ID', '<'+alias+'>')
+ msgRoot.attach(msgImage)
+
+ try:
+ connection.sendmail(sender, [recipient.email], msgRoot.as_string())
+ except Exception, e:
+ pass
+
+ try:
+ connection.quit()
+ except socket.sslerror:
+ connection.close()
+ except:
+ pass