Exemple #1
0
    def validateTo(self, user):
        if not user.dest.domain:
            raise smtp.SMTPBadRcpt, (user, 550, 'No domain name given')

        # test whether such host dir exists
        box, domain=util.host_split(user.dest.domain)

        if domain is None:
            raise smtp.SMTPBadRcpt, (user, 550, 'Invalid domain name given: %r' % user.dest.domain)

        if box is None:
            d = self._userBelongsToMe(user, domain)
        else:
            d = defer.succeed(box)

        d.addCallback(self._cbGotBox, domain, user)
        return d
Exemple #2
0
def prepare(msg, reply, recipient=None, recipientName=None, subjectPrefix=None):
    sender = goneutil.getSender(msg)

    if "From" not in reply and recipient is not None:
        if "@" in recipient:
            local, host = recipient.split("@", 1)
            box, domain = util.host_split(host)
            if domain is not None:
                host = domain
            recipient = str(smtp.Address(local, host))
        reply["From"] = email.Utils.formataddr((recipientName, recipient))

    to = msg.get_all("Sender", None)
    if to is None:
        to = msg.get_all("From", None)
    if to is None:
        to = [sender]
    for addr in to:
        reply["To"] = addr

    if "Subject" not in reply:
        subject = msg["Subject"]
        if subject is None:
            # echo foo | mail testaccount has no subject, if vacation
            # message has no subject either, sees this.. ugly due to
            # lack of l10n
            subject = "Your mail"
        if subjectPrefix is not None:
            subject = subjectPrefix + subject
        reply["Subject"] = subject

    msgid = msg.get("Message-ID", None)
    if msgid is not None:
        msgid = msgid.strip()
        reply["In-Reply-To"] = msgid

    if reply.is_multipart():
        reply.attach(MIMEMessage(msg))
    return reply
Exemple #3
0
    def get(self, key):
        if '@' not in key:
            box, domain = util.host_split(key)

            if box is not None:
                # box.scalemail.example.com
                # tell postfix this isn't a virtual domain,
                # so it will obey transports
                return

            # example.com or scalemail.example.com
            if domain is None:
                # example.com
                domain = util.quot(key)
            if self.domainExists(domain):
                return 'DOMAINEXISTS'
            else:
                return None
        else:
            local, host = key.split('@', 1)

            if not host:
                # "foo@", no way it'll ever match anything, claim it's
                # not found
                return None

            box, domain = util.host_split(host)

            if box is not None and domain is None:
                raise ScalemailVirtualMapImpossibleDomain, \
                      (key, box, domain)

            if domain is None:
                # [email protected]
                # handle just like [email protected]
                domain = util.quot(host)

            if not self.domainExists(domain):
                # [email protected], where example.com is not known
                return None

            if box is not None:
                # [email protected]
                # no need to rewrite, claim it's not found
                return None

            d = self.callMappers('pre',
                                 config=self.config,
                                 local=local,
                                 domain=domain)
            def _afterPreMappers(answer, callMappers, config, local, domain):
                if answer is not None:
                    return answer
                d = self._getAccount(config, local, domain)

                def _gotAccount(account, callMappers, *a, **kw):
                    d = callMappers('post', account=account, *a, **kw)
                    return d
                d.addCallback(_gotAccount, callMappers, config=self.config, local=local, domain=domain)
                return d
            d.addCallback(_afterPreMappers, self.callMappers, self.config, local, domain)

            def _joinAnswer(answer):
                if answer is not None:
                    answer = ', '.join(answer)
                return answer
            d.addCallback(_joinAnswer)

            def _fail(fail):
                fail.trap(util.ScaleMailAccountNotFound)
                return None
            d.addErrback(_fail)
            return d