def sendmail(fromaddr, destinations, text, reply_to, subject, message_id, in_reply_to=None, sender=None, references=None): from allura import model as M addrs_plain = [] addrs_html = [] addrs_multi = [] if fromaddr is None: fromaddr = g.noreply elif '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = g.noreply else: fromaddr = user.email_address_header() # Divide addresses based on preferred email formats for addr in destinations: if mail_util.isvalid(addr): addrs_plain.append(addr) else: try: user = M.User.query.get(_id=ObjectId(addr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', addr) continue except: log.exception('Error looking up user with ID: %r' % addr) continue addr = user.email_address_header() if not addr and user.email_addresses: addr = user.email_addresses[0] log.warning( 'User %s has not set primary email address, using %s', user._id, addr) if not addr: log.error( "User %s (%s) has not set any email address, can't deliver", user._id, user.username) continue if user.get_pref('email_format') == 'plain': addrs_plain.append(addr) elif user.get_pref('email_format') == 'html': addrs_html.append(addr) else: addrs_multi.append(addr) htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( addrs_multi, fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender, references=references) smtp_client.sendmail( addrs_plain, fromaddr, reply_to, subject, message_id, in_reply_to, plain_msg, sender=sender, references=references) smtp_client.sendmail( addrs_html, fromaddr, reply_to, subject, message_id, in_reply_to, html_msg, sender=sender, references=references)
def sendsimplemail( fromaddr, toaddr, text, reply_to, subject, message_id, in_reply_to=None): from allura import model as M if fromaddr is None: fromaddr = u'*****@*****.**' elif '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr)) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = u'*****@*****.**' else: fromaddr = user.email_address_header() plain_msg = mail_util.encode_email_part(text, 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( [toaddr], fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg)
def create_multipart_msg(text, metalink=None): """ Convert Markdown text to plaintext & HTML, combine into a multipart email Message :param text: :param metalink: :return: """ def replace_html(matchobj): text_within_div = matchobj.group(1) text_within_div = text_within_div.replace('</p>', '\n') text_within_div = markupsafe._striptags_re.sub('', text_within_div) return text_within_div plain_text = text plain_text = re.sub(r'<div class="markdown_content">(.*)</div>', # strip HTML from markdown generated blocks replace_html, plain_text, flags=re.DOTALL, # match newlines too ) plain_text = HTMLParser.HTMLParser().unescape(plain_text) # put literal HTML tags back into plaintext plain_msg = mail_util.encode_email_part(plain_text, 'plain') html_text = g.forge_markdown(email=True).convert(text) if metalink: html_text = html_text + mail_meta_content(metalink) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) return multi_msg, plain_msg
def sendsimplemail( fromaddr, toaddr, text, reply_to, subject, message_id, in_reply_to=None, sender=None, references=None, cc=None): from allura import model as M if fromaddr is None: fromaddr = g.noreply elif '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = g.noreply else: fromaddr = user.email_address_header() htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( [toaddr], fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender, references=references, cc=cc, to=toaddr)
def sendsimplemail( fromaddr, toaddr, text, reply_to, subject, message_id, in_reply_to=None, sender=None): from allura import model as M if fromaddr is None: fromaddr = u'*****@*****.**' elif '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = u'*****@*****.**' else: fromaddr = user.email_address_header() htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( [toaddr], fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender)
def sendsimplemail(fromaddr, toaddr, text, reply_to, subject, message_id, in_reply_to=None, sender=None, references=None, cc=None): ''' Send a single mail to the specified address. It is best for single user notifications. :param fromaddr: ObjectId or str(ObjectId) of user, or email address str :param toaddr: ObjectId or str(ObjectId) of user, or email address str ''' from allura import model as M if fromaddr is None: fromaddr = g.noreply elif not isinstance(fromaddr, basestring) or '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = g.noreply else: fromaddr = user.email_address_header() if not isinstance(toaddr, basestring) or '@' not in toaddr: log.warning('Looking up user with toaddr: %s', toaddr) user = M.User.query.get(_id=ObjectId(toaddr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', toaddr) toaddr = g.noreply else: toaddr = user.email_address_header() htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail([toaddr], fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender, references=references, cc=cc, to=toaddr)
def sendmail(fromaddr, destinations, text, reply_to, subject, message_id, in_reply_to=None, sender=None): from allura import model as M addrs_plain = [] addrs_html = [] addrs_multi = [] if fromaddr is None: fromaddr = u'*****@*****.**' elif '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = u'*****@*****.**' else: fromaddr = user.email_address_header() # Divide addresses based on preferred email formats for addr in destinations: if mail_util.isvalid(addr): addrs_plain.append(addr) else: try: user = M.User.query.get(_id=ObjectId(addr), disabled=False) if not user: log.warning('Cannot find user with ID: %s', addr) continue except: log.exception('Error looking up user with ID: %r' % addr) continue addr = user.email_address_header() if not addr and user.email_addresses: addr = user.email_addresses[0] log.warning('User %s has not set primary email address, using %s', user._id, addr) if not addr: log.error("User %s (%s) has not set any email address, can't deliver", user._id, user.username) continue if user.get_pref('email_format') == 'plain': addrs_plain.append(addr) elif user.get_pref('email_format') == 'html': addrs_html.append(addr) else: addrs_multi.append(addr) htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( addrs_multi, fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender) smtp_client.sendmail( addrs_plain, fromaddr, reply_to, subject, message_id, in_reply_to, plain_msg, sender=sender) smtp_client.sendmail( addrs_html, fromaddr, reply_to, subject, message_id, in_reply_to, html_msg, sender=sender)
def sendsimplemail( fromaddr, toaddr, text, reply_to, subject, message_id, in_reply_to=None, sender=None, references=None, cc=None): ''' Send a single mail to the specified address. It is best for single user notifications. :param fromaddr: ObjectId or str(ObjectId) of user, or email address str :param toaddr: ObjectId or str(ObjectId) of user, or email address str ''' from allura import model as M if fromaddr is None: fromaddr = g.noreply elif not isinstance(fromaddr, basestring) or '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = g.noreply else: fromaddr = user.email_address_header() if not isinstance(toaddr, basestring) or '@' not in toaddr: log.warning('Looking up user with toaddr: %s', toaddr) user = M.User.query.get(_id=ObjectId(toaddr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', toaddr) toaddr = g.noreply else: toaddr = user.email_address_header() htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail( [toaddr], fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender, references=references, cc=cc, to=toaddr)
def sendmail(fromaddr, destinations, text, reply_to, subject, message_id, in_reply_to=None, sender=None, references=None, metalink=None): ''' Send an email to the specified list of destinations with respect to the preferred email format specified by user. It is best for broadcast messages. :param fromaddr: ObjectId or str(ObjectId) of user, or email address str ''' from allura import model as M addrs_plain = [] addrs_html = [] addrs_multi = [] if fromaddr is None: fromaddr = g.noreply elif not isinstance(fromaddr, basestring) or '@' not in fromaddr: log.warning('Looking up user with fromaddr: %s', fromaddr) user = M.User.query.get(_id=ObjectId(fromaddr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', fromaddr) fromaddr = g.noreply else: fromaddr = user.email_address_header() # Divide addresses based on preferred email formats for addr in destinations: if mail_util.isvalid(addr): addrs_plain.append(addr) else: try: user = M.User.query.get(_id=ObjectId(addr), disabled=False, pending=False) if not user: log.warning('Cannot find user with ID: %s', addr) continue except: log.exception('Error looking up user with ID: %r' % addr) continue addr = user.email_address_header() if not addr and user.email_addresses: addr = user.email_addresses[0] log.warning( 'User %s has not set primary email address, using %s', user._id, addr) if not addr: log.error( "User %s (%s) has not set any email address, can't deliver", user._id, user.username) continue if user.get_pref('email_format') == 'plain': addrs_plain.append(addr) elif user.get_pref('email_format') == 'html': addrs_html.append(addr) else: addrs_multi.append(addr) htmlparser = HTMLParser.HTMLParser() plain_msg = mail_util.encode_email_part(htmlparser.unescape(text), 'plain') html_text = g.forge_markdown(email=True).convert(text) if metalink != None: html_text = html_text + mail_meta_content(metalink) html_msg = mail_util.encode_email_part(html_text, 'html') multi_msg = mail_util.make_multipart_message(plain_msg, html_msg) smtp_client.sendmail(addrs_multi, fromaddr, reply_to, subject, message_id, in_reply_to, multi_msg, sender=sender, references=references) smtp_client.sendmail(addrs_plain, fromaddr, reply_to, subject, message_id, in_reply_to, plain_msg, sender=sender, references=references) smtp_client.sendmail(addrs_html, fromaddr, reply_to, subject, message_id, in_reply_to, html_msg, sender=sender, references=references)