Ejemplo n.º 1
0
    def update_bcc_addresses(self, mail_server, message):
        auto_bcc_addresses = mail_server.auto_bcc_addresses

        if mail_server.auto_add_sender:
            ignore_auto_add_sender = False
            if self.env.context.get('channel_email_from'):
                # Do not automatically add sender to bcc if the message comes
                # from a channel
                from_rfc2822 = extract_rfc2822_addresses(message['From'])
                channel_email_from_rfc2822 = extract_rfc2822_addresses(
                    self.env.context.get('channel_email_from'))
                if from_rfc2822 == channel_email_from_rfc2822:
                    ignore_auto_add_sender = True
            if not ignore_auto_add_sender:
                if not auto_bcc_addresses:
                    auto_bcc_addresses = message['From']
                else:
                    auto_bcc_addresses += "," + message['From']

        if auto_bcc_addresses:
            if not message.get('Bcc'):
                message['Bcc'] = auto_bcc_addresses
            else:
                del message['Bcc']  # avoid multiple Bcc: headers!
                message['Bcc'] += "," + auto_bcc_addresses
Ejemplo n.º 2
0
 def send_email(self,
                message,
                mail_server_id=None,
                smtp_server=None,
                smtp_port=None,
                smtp_user=None,
                smtp_password=None,
                smtp_encryption=None,
                smtp_debug=False,
                smtp_session=None):
     # Start copy from native method
     smtp_from = message['Return-Path'] or\
         self._get_default_bounce_address() or message['From']
     from_rfc2822 = extract_rfc2822_addresses(smtp_from)
     smtp_from = from_rfc2822[-1]
     # End copy from native method
     logger.info(
         "Sending email from '%s' to '%s' Cc '%s' Bcc '%s' "
         "with subject '%s'", smtp_from, message.get('To'),
         message.get('Cc'), message.get('Bcc'), message.get('Subject'))
     return super(IrMailServer,
                  self).send_email(message,
                                   mail_server_id=mail_server_id,
                                   smtp_server=smtp_server,
                                   smtp_port=smtp_port,
                                   smtp_user=smtp_user,
                                   smtp_password=smtp_password,
                                   smtp_encryption=smtp_encryption,
                                   smtp_debug=smtp_debug,
                                   smtp_session=smtp_session)
Ejemplo n.º 3
0
 def check_email_validity(self):
     if self.env.context.get('skip_check_email_validity'):
         return
     for channel in self:
         if not extract_rfc2822_addresses(channel.email_exchange_system):
             raise exceptions.ValidationError(
                 _("Email %s is not valid") % channel.email_exchange_system)
Ejemplo n.º 4
0
    def send(self, auto_commit=False, raise_exception=False):

        for email in self.env['mail.mail'].browse(self.ids):
            from_rfc2822 = extract_rfc2822_addresses(email.email_from)
            server_id = self.env['ir.mail_server'].search([('smtp_user', 'in',
                                                            from_rfc2822)])
            server_id = server_id and server_id[0] or False
            if server_id:
                self.write({
                    'mail_server_id': server_id[0].id,
                    'reply_to': email.email_from
                })
            else:
                server_id = self.env['ir.mail_server'].search([],
                                                              order="sequence",
                                                              limit=1)
                server_id = server_id.id or False
                server_obj = self.env['ir.mail_server'].browse(server_id)
                if server_id:
                    self.write({
                        'mail_server_id': server_id,
                        'email_from': server_obj.smtp_user,
                        'reply_to': server_obj.smtp_user
                    })
        return super(MailMail, self).send(auto_commit=auto_commit,
                                          raise_exception=raise_exception)
Ejemplo n.º 5
0
 def build_email(self, email_from, email_to, subject, body, email_cc=None, email_bcc=None, reply_to=False,
                 attachments=None, message_id=None, references=None, object_id=False, subtype='plain', headers=None,
                 body_alternative=None, subtype_alternative='plain'):
     try:
         headers.update({'Return-Path' : extract_rfc2822_addresses(email_from)[-1]})
     except:
         _logger.error("Couldn't compute  Return-Path for %s!" %email_from)
     return super(ir_mail_server, self).build_email(email_from, email_to, subject, body, email_cc=email_cc, email_bcc=email_bcc, reply_to=reply_to,
                 attachments=attachments, message_id=message_id, references=references, object_id=object_id, subtype=subtype, headers=headers,
                 body_alternative=body_alternative, subtype_alternative=subtype_alternative)
Ejemplo n.º 6
0
 def check_email_validity(self):
     """
     Validazione solamente se si tratta di un canale PEC
     """
     for channel in self:
         if channel.channel_type == 'pec':
             if not extract_rfc2822_addresses(channel.email_exchange_system):
                 raise exceptions.ValidationError(
                     _("Email %s is not valid")
                     % channel.email_exchange_system)
Ejemplo n.º 7
0
    def test_extract_rfc2822_addresses(self):
        tests = [
            ('"Admin" <*****@*****.**>', ['*****@*****.**']),
            ('"Admin" <*****@*****.**>, Demo <*****@*****.**>', ['*****@*****.**', '*****@*****.**']),
            ('*****@*****.**', ['*****@*****.**']),
            ('"Admin" <*****@*****.**>, Demo <malformed email>', ['*****@*****.**']),
            ('admin@éxample.com', ['*****@*****.**']),
        ]

        for (rfc2822_email, expected) in tests:
            self.assertEqual(extract_rfc2822_addresses(rfc2822_email), expected)
Ejemplo n.º 8
0
 def send(self, auto_commit=False, raise_exception=False):
     for email in self.env['mail.mail'].sudo().browse(self.ids):
         reply_to = email.email_from
         from_rfc2822 = extract_rfc2822_addresses(reply_to)[-1]
         server_id = self.env['ir.mail_server'].search([('smtp_user', '=',
                                                         from_rfc2822)])
         server_id = server_id and server_id[0] or False
         if server_id:
             self.write({
                 'mail_server_id': server_id[0].id,
                 'reply_to': reply_to
             })
     return super(MailMail, self).send(auto_commit=auto_commit,
                                       raise_exception=raise_exception)
Ejemplo n.º 9
0
    def send(self, auto_commit=False, raise_exception=False):
        for email in self:
            from_rfc2822 = extract_rfc2822_addresses(email.email_from)[-1]
            outgoing_mail_server = self.env['ir.mail_server'].search([('smtp_user', '=', from_rfc2822)], limit=1)
            if len(outgoing_mail_server):
                email.write({'mail_server_id': outgoing_mail_server.id,
                             'reply_to': email.email_from, })
            else:
                failure_reason = "No outgoing mail server found for  %s !" % from_rfc2822
                email.write({'state': 'exception', 'failure_reason': failure_reason})
                email._postprocess_sent_message(success_pids=[], failure_type='OUTGOING_MISSING')
                _logger.error("No outgoing server found for  %s !" % from_rfc2822)
                return True

        return super(mail_mail, self).send(auto_commit=auto_commit, raise_exception=raise_exception)
Ejemplo n.º 10
0
 def send_email(self,
                message,
                mail_server_id=None,
                smtp_server=None,
                smtp_port=None,
                smtp_user=None,
                smtp_password=None,
                smtp_encryption=None,
                smtp_debug=False,
                smtp_session=None):
     from_rfc2822 = extract_rfc2822_addresses(message['From'])[-1]
     server_id = self.env['ir.mail_server'].search([('smtp_user', '=',
                                                     from_rfc2822)])
     if server_id and server_id[0]:
         message['Return-Path'] = from_rfc2822
     return super(IrMailServer,
                  self).send_email(message, mail_server_id, smtp_server,
                                   smtp_port, smtp_user, smtp_password,
                                   smtp_encryption, smtp_debug,
                                   smtp_session)
Ejemplo n.º 11
0
    def send_email(
        self,
        message,
        mail_server_id=None,
        smtp_server=None,
        smtp_port=None,
        smtp_user=None,
        smtp_password=None,
        smtp_encryption=None,
        smtp_debug=False,
        smtp_session=None,
    ):
        """Override the standard method to fix the issue of using a mail
        client where relaying is disallowed."""
        # Use the default bounce address **only if** no Return-Path was
        # provided by caller.  Caller may be using Variable Envelope Return
        # Path (VERP) to detect no-longer valid email addresses.
        smtp_from = (message["Return-Path"]
                     or self._get_default_bounce_address() or message["From"])
        assert (
            smtp_from
        ), "The Return-Path or From header is required for any outbound email"

        # The email's "Envelope From" (Return-Path), and all recipient
        # addresses must only contain ASCII characters.
        from_rfc2822 = extract_rfc2822_addresses(smtp_from)
        assert from_rfc2822, ("Malformed 'Return-Path' or 'From' address: "
                              "%r - "
                              "It should contain one valid plain ASCII "
                              "email") % smtp_from
        # use last extracted email, to support rarities like 'Support@MyComp
        # <*****@*****.**>'
        smtp_from = from_rfc2822[-1]
        email_to = message["To"]
        email_cc = message["Cc"]
        email_bcc = message["Bcc"]
        del message["Bcc"]

        smtp_to_list = [
            address for base in [email_to, email_cc, email_bcc]
            for address in extract_rfc2822_addresses(base) if address
        ]
        assert smtp_to_list, self.NO_VALID_RECIPIENT

        x_forge_to = message["X-Forge-To"]
        if x_forge_to:
            # `To:` header forged, e.g. for posting on mail.channels,
            # to avoid confusion
            del message["X-Forge-To"]
            del message["To"]  # avoid multiple To: headers!
            message["To"] = x_forge_to

        # Do not actually send emails in testing mode!
        if (getattr(threading.currentThread(), "testing", False)
                or self.env.registry.in_test_mode()):
            _test_logger.info("skip sending email in test mode")
            return message["Message-Id"]

        try:
            message_id = message["Message-Id"]

            # START OF CODE ADDED
            smtp = self.connect(
                smtp_server,
                smtp_port,
                smtp_user,
                smtp_password,
                smtp_encryption or False,
                smtp_debug,
            )

            from email.utils import parseaddr, formataddr

            # exact name and address
            (oldname, oldemail) = parseaddr(message["From"])
            # use original name with new address
            newfrom = formataddr((oldname, smtp.user))
            # need to use replace_header instead '=' to prevent
            # double field
            message.replace_header("From", newfrom)
            smtp.sendmail(smtp.user, smtp_to_list, message.as_string())
            # END OF CODE ADDED

            # do not quit() a pre-established smtp_session
            if not smtp_session:
                smtp.quit()
        except smtplib.SMTPServerDisconnected:
            raise
        except Exception as e:
            params = (ustr(smtp_server), e.__class__.__name__, ustr(e))
            msg = _(
                "Mail delivery failed via SMTP server '%s'.\n%s: %s") % params
            _logger.info(msg)
            raise MailDeliveryException(_("Mail Delivery Failed"), msg)
        return message_id