def _mungeHeaders(messageText, mto=None, mfrom=None, subject=None): """Sets missing message headers, and deletes Bcc. returns fixed message, fixed mto and fixed mfrom""" mfile = StringIO(messageText.lstrip()) mo = rfc822.Message(mfile) # Parameters given will *always* override headers in the messageText. # This is so that you can't override or add to subscribers by adding them to # the message text. if subject: mo['Subject'] = subject elif not mo.getheader('Subject'): mo['Subject'] = '[No Subject]' if mto: if isinstance(mto, basestring): mto = [ rfc822.dump_address_pair(addr) for addr in rfc822.AddressList(mto) ] if not mo.getheader('To'): mo['To'] = ','.join(mto) else: mto = [] for header in ('To', 'Cc', 'Bcc'): v = mo.getheader(header) if v: mto += [ rfc822.dump_address_pair(addr) for addr in rfc822.AddressList(v) ] if not mto: raise MailHostError, "No message recipients designated" if mfrom: mo['From'] = mfrom else: if mo.getheader('From') is None: raise MailHostError, "Message missing SMTP Header 'From'" mfrom = mo['From'] if mo.getheader('Bcc'): mo.__delitem__('Bcc') if not mo.getheader('Date'): mo['Date'] = DateTime().rfc822() mo.rewindbody() finalmessage = mo finalmessage = mo.__str__() + '\n' + mfile.read() mfile.close() return finalmessage, mto, mfrom
def get_message(self): """ Returns a email message object """ self.email = self.person.get_email() job = self.job headers = {} if job.newsletter.reply_email != '': headers.update({'Reply-To': job.newsletter.reply_email}) if job.newsletter.newsletter_type == settings.NEWSLETTER_TYPE_MASSMAIL: headers.update({'Precedence': 'bulk'}) try: headers.update({ 'List-Unsubscribe': "<%s>" % self.person.get_unsubscribe_url( mail=self, job=job, newsletter=job.newsletter) }) except NotImplementedError: pass message = mail.EmailMessage( job.newsletter.subject, self.get_content(), dump_address_pair( (job.newsletter.sender.name, job.newsletter.sender.email)), [self.email], headers=headers, ) for attachment in job.newsletter.attachments.all(): message.attachments.append( (attachment.name, attachment.file.read(), attachment.mimetype)) for attachment in self.extra_attachments: message.attachments.append(attachment) message.content_subtype = "html" return message
def get_message(self): """ Returns a email message object """ self.email = self.person.get_email() job = self.job headers = {} if job.newsletter.reply_email != '': headers.update({'Reply-To': job.newsletter.reply_email}) if job.newsletter.newsletter_type == settings.NEWSLETTER_TYPE_MASSMAIL: headers.update({'Precedence': 'bulk'}) try: headers.update({'List-Unsubscribe': "<%s>" % self.person.get_unsubscribe_url( mail=self, job=job, newsletter=job.newsletter)}) except NotImplementedError: pass message = mail.EmailMessage( job.newsletter.subject, self.get_content(), dump_address_pair(( job.newsletter.sender.name, job.newsletter.sender.email)), [self.email], headers=headers, ) for attachment in job.newsletter.attachments.all(): message.attachments.append(( attachment.name, attachment.file.read(), attachment.mimetype)) for attachment in self.extra_attachments: message.attachments.append(attachment) message.content_subtype = "html" return message
def _mungeHeaders( messageText, mto=None, mfrom=None, subject=None): """Sets missing message headers, and deletes Bcc. returns fixed message, fixed mto and fixed mfrom""" mfile=StringIO(messageText.lstrip()) mo=rfc822.Message(mfile) # Parameters given will *always* override headers in the messageText. # This is so that you can't override or add to subscribers by adding them to # the message text. if subject: mo['Subject'] = subject elif not mo.getheader('Subject'): mo['Subject'] = '[No Subject]' if mto: if isinstance(mto, basestring): mto = [rfc822.dump_address_pair(addr) for addr in rfc822.AddressList(mto) ] if not mo.getheader('To'): mo['To'] = ','.join(mto) else: mto = [] for header in ('To', 'Cc', 'Bcc'): v = mo.getheader(header) if v: mto += [rfc822.dump_address_pair(addr) for addr in rfc822.AddressList(v)] if not mto: raise MailHostError, "No message recipients designated" if mfrom: mo['From'] = mfrom else: if mo.getheader('From') is None: raise MailHostError,"Message missing SMTP Header 'From'" mfrom = mo['From'] if mo.getheader('Bcc'): mo.__delitem__('Bcc') if not mo.getheader('Date'): mo['Date'] = DateTime().rfc822() mo.rewindbody() finalmessage = mo finalmessage = mo.__str__() + '\n' + mfile.read() mfile.close() return finalmessage, mto, mfrom
def difference_of_address_lists(addresses, to_remove): address_set = dict([ (address, True) for (_, address) in rfc822.AddressList(addresses)]) for name, address in rfc822.AddressList(to_remove): if address in address_set: del address_set[address] address_list = [rfc822.dump_address_pair(('', address)) for address in address_set.iterkeys()] address_list.sort() return ','.join(address_list)
def person2text(value): name = value.params.get('cn', '') email = value.decode().lower() if not 'mailto:' in email: email = '' else: email = filter(None, email.split('mailto:')) email = email and email[0] or '' if email: return dump_address_pair((name, email)) return name
def difference_of_address_lists(addresses, to_remove): address_set = dict([(address, True) for (_, address) in rfc822.AddressList(addresses)]) for name, address in rfc822.AddressList(to_remove): if address in address_set: del address_set[address] address_list = [ rfc822.dump_address_pair(('', address)) for address in address_set.iterkeys() ] address_list.sort() return ','.join(address_list)
def send(self,**kw): msg,values,headers = self._process(kw) for header,value in headers: msg[header]=value to_addrs = () for key in ('mto', 'mcc', 'mbcc'): v = values.get(key) if v: if isinstance(v, basestring): v = [rfc822.dump_address_pair(addr) for addr \ in rfc822.AddressList(v)] to_addrs += tuple(v) self._send(values['mfrom'], to_addrs, msg)
def send(self, **kw): msg, values, headers = self._process(kw) for header, value in headers: msg[header] = value to_addrs = () for key in ('mto', 'mcc', 'mbcc'): v = values.get(key) if v: if isinstance(v, basestring): v = [rfc822.dump_address_pair(addr) for addr \ in rfc822.AddressList(v)] to_addrs += tuple(v) self._send(values['mfrom'], to_addrs, msg)
def get_user_id(email='', realname='', charset='utf-8'): uid = os.getuid() info = pwd.getpwuid(uid) email = (os.environ.get('REPORTBUGEMAIL', email) or os.environ.get('DEBEMAIL') or os.environ.get('EMAIL')) email = email or find_rewritten(info[0]) or info[0] if '@' not in email: if os.path.exists('/etc/mailname'): domainname = file('/etc/mailname').readline().strip() else: domainname = socket.getfqdn() email = email+'@'+domainname # Handle EMAIL if it's formatted as 'Bob <bob@host>'. if '<' in email or '(' in email: realname, email = get_email_addr(email) if not realname: realname = (os.environ.get('DEBFULLNAME') or os.environ.get('DEBNAME') or os.environ.get('NAME')) if not realname: realname = info[4].split(',', 1)[0] # Convert & in gecos field 4 to capitalized logname: #224231 realname = realname.replace('&', info[0].upper()) if not realname: return email # Decode the realname from the charset - # but only if it is not already in Unicode if isinstance(realname, str): realname = realname.decode(charset, 'replace') if re.match(r'[\w\s]+$', realname): return u'%s <%s>' % (realname, email) addr = rfc822.dump_address_pair( (realname, email) ) if isinstance(addr, str): addr = addr.decode('utf-8', 'replace') return addr
def get_user_id(email='', realname='', charset='utf-8'): uid = os.getuid() info = pwd.getpwuid(uid) email = (os.environ.get('REPORTBUGEMAIL', email) or os.environ.get('DEBEMAIL') or os.environ.get('EMAIL')) email = email or find_rewritten(info[0]) or info[0] if '@' not in email: if os.path.exists('/etc/mailname'): domainname = file('/etc/mailname').readline().strip() else: domainname = socket.getfqdn() email = email + '@' + domainname # Handle EMAIL if it's formatted as 'Bob <bob@host>'. if '<' in email or '(' in email: realname, email = get_email_addr(email) if not realname: realname = (os.environ.get('DEBFULLNAME') or os.environ.get('DEBNAME') or os.environ.get('NAME')) if not realname: realname = info[4].split(',', 1)[0] # Convert & in gecos field 4 to capitalized logname: #224231 realname = realname.replace('&', info[0].upper()) if not realname: return email # Decode the realname from the charset - # but only if it is not already in Unicode if isinstance(realname, str): realname = realname.decode(charset, 'replace') if re.match(r'[\w\s]+$', realname): return u'%s <%s>' % (realname, email) addr = rfc822.dump_address_pair((realname, email)) if isinstance(addr, str): addr = addr.decode('utf-8', 'replace') return addr
def union_of_address_lists(*email_lists): """ Takes comma separated lists of RFC822 email address and returns a comma separated list with the union of the addresses. *email_lists : str -- as entered in an email address, e.g. '[email protected], Bob <*****@*****.**>' returns : str -- a comma separated list of addresses. """ address_set = {} for email_list in email_lists: for name, address in rfc822.AddressList(email_list): address_set[address] = True address_list = [rfc822.dump_address_pair(('', address)) for address in address_set.iterkeys()] address_list.sort() return ','.join(address_list)
def get_user_id(email="", realname="", charset="utf-8"): uid = os.getuid() info = pwd.getpwuid(uid) email = os.environ.get("REPORTBUGEMAIL", email) or os.environ.get("DEBEMAIL") or os.environ.get("EMAIL") email = email or find_rewritten(info[0]) or info[0] if "@" not in email: if os.path.exists("/etc/mailname"): domainname = file("/etc/mailname").readline().strip() else: domainname = socket.getfqdn() email = email + "@" + domainname # Handle EMAIL if it's formatted as 'Bob <bob@host>'. if "<" in email or "(" in email: realname, email = get_email_addr(email) if not realname: realname = os.environ.get("DEBFULLNAME") or os.environ.get("DEBNAME") or os.environ.get("NAME") if not realname: realname = info[4].split(",", 1)[0] # Convert & in gecos field 4 to capitalized logname: #224231 realname = realname.replace("&", info[0].upper()) if not realname: return email # Decode the realname from the charset - # but only if it is not already in Unicode if isinstance(realname, str): realname = realname.decode(charset, "replace") if re.match(r"[\w\s]+$", realname): return u"%s <%s>" % (realname, email) addr = rfc822.dump_address_pair((realname, email)) if isinstance(addr, str): addr = addr.decode("utf-8", "replace") return addr
def union_of_address_lists(*email_lists): """ Takes comma separated lists of RFC822 email address and returns a comma separated list with the union of the addresses. *email_lists : str -- as entered in an email address, e.g. '[email protected], Bob <*****@*****.**>' returns : str -- a comma separated list of addresses. """ address_set = {} for email_list in email_lists: for name, address in rfc822.AddressList(email_list): address_set[address] = True address_list = [ rfc822.dump_address_pair(('', address)) for address in address_set.iterkeys() ] address_list.sort() return ','.join(address_list)
def process_msg(msg): msg = email.message_from_string('\n'.join(msg)) (listname, list_addr) = rfc822.parseaddr(msg['To']) try: mlist = MailingList.objects.get(listaddress__iexact=list_addr) except MailingList.DoesNotExist: print >>sys.stderr, 'Mailing list %s does not exist' % msg['To'] return False swimmer_set = [ s.user.email for s in mlist.swimmers.all() ] newmsg = msg try: newmsg.replace_header('Reply-To', msg['From']) except KeyError: newmsg.add_header('Reply-To', msg['From']) """ Two things. 1. Check that the sender is on the list they are sending to. 2. Save a copy of the message """ """ FIXME: I have a feeling that broken email clients are going to pass through mangled from headers """ (realname, from_email) = rfc822.parseaddr(msg['From']) rfc_from = '' swimmer = None """ The reason for this check is that we want certain automatic scripts to be able to mail lists. dev@ uses this """ if from_email != list_addr: try: swimmer = Swimmer.objects.get(user__email__iexact=from_email) except Swimmer.DoesNotExist: print >>sys.stderr, 'didn\'t find swimmer with email address = %s' % from_email return False rfc_from = rfc822.dump_address_pair(('%s %s' %( swimmer.user.first_name, swimmer.user.last_name), swimmer.user.email)) else: rfc_from = rfc822.dump_address_pair(('', list_addr)) body = '' if msg.is_multipart(): for b in msg.get_payload(): if b.get_content_type() == 'text/plain': body = b.get_payload() break elif b.get_content_type() == 'text/html': body = b.get_payload() stripper = Stripper() try: body = stripper.strip(body) except: #Sometimes the html is just a mess body = re.sub('<.*?>', '', body) break else: body = msg.get_payload() if swimmer != None: try: m = Message(fromswimmer=swimmer, tolist=mlist, message=body, subject=msg['Subject']) m.save() except: print >>sys.stderr, 'Message save failed on body = %s and subject = %s' %( body, msg['Subject']) s = smtplib.SMTP() s.connect(settings.OUTGOING_MAIL_HOST) failed_hash = {} try: failed_hash = s.sendmail(rfc_from, swimmer_set, newmsg.as_string()) except smtplib.SMTPRecipientsRefused, e: print >>sys.stderr, 'recipients refused %s' %e