Beispiel #1
0
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
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #4
0
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
Beispiel #5
0
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 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
Beispiel #8
0
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)
Beispiel #9
0
    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)
Beispiel #10
0
    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)
Beispiel #11
0
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
Beispiel #12
0
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
Beispiel #13
0
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)
Beispiel #14
0
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
Beispiel #15
0
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)
Beispiel #16
0
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