Hỏi OpenERP7 cách gửi mail thông qua Queue ?

Thảo luận trong 'OpenERP Framework' bắt đầu bởi khang, 28/7/14.

  1. khang New Member

    Hi mọi người , Mình có 1 Trouble thế này mọi người góp ý dùm mình nhé .
    1. Trên OpenERP 7 mình thực hiện gửi mail bằng hàm message_post .
    2. message_post sẽ call _notify method trong mail_followers.py và notify gọi thẳng xuống hàm send_email (Gửi mail Trực tiếp ko thông qua Queue).
    Có cách nào để mình đẩy email vào queue rồi dùng scheduler Email Queue Manager để gửi đi theo thời gian mà mình qui định ko nhỉ ?
  2. bruce.nguyen Active Member

    Dear Khang,

    - Hàm send_email : em orveride lại ko post data tới smtp out-going server mail.
    - Khởi tạo 1 scheduler tự động quét qua bảng này và gửi mail ra ngoài

    Good luck.
  3. khang New Member


    Dear anh Thành, Cám ơn anh đã reply . Em chưa clear lắm anh giải thích dùm em xíu nha.

    Em thấy là hàm send_email nó connect và gọi send email trực tiếp luôn. Em không rõ bằng cách nào để đẩy nó vào Queue anh nhỉ ? Còn scheduler thì mình đã có Mail Queue Manager rồi phải ko anh ?

    Đây là đoạn code :
    Mã (text):
    1. def send_email(self, cr, uid, message, mail_server_id=None, smtp_server=None, smtp_port=None,
    2.                   smtp_user=None, smtp_password=None, smtp_encryption=None, smtp_debug=False,
    3.                   context=None):
    4.         """Sends an email directly (no queuing).
    5.  
    6.         No retries are done, the caller should handle MailDeliveryException in order to ensure that
    7.         the mail is never lost.
    8.  
    9.         If the mail_server_id is provided, sends using this mail server, ignoring other smtp_* arguments.
    10.         If mail_server_id is None and smtp_server is None, use the default mail server (highest priority).
    11.         If mail_server_id is None and smtp_server is not None, use the provided smtp_* arguments.
    12.         If both mail_server_id and smtp_server are None, look for an 'smtp_server' value in server config,
    13.         and fails if not found.
    14.  
    15.         :param message: the email.message.Message to send. The envelope sender will be extracted from the
    16.                         ``Return-Path`` or ``From`` headers. The envelope recipients will be
    17.                         extracted from the combined list of ``To``, ``CC`` and ``BCC`` headers.
    18.         :param mail_server_id: optional id of ir.mail_server to use for sending. overrides other smtp_* arguments.
    19.         :param smtp_server: optional hostname of SMTP server to use
    20.         :param smtp_encryption: optional TLS mode, one of 'none', 'starttls' or 'ssl' (see ir.mail_server fields for explanation)
    21.         :param smtp_port: optional SMTP port, if mail_server_id is not passed
    22.         :param smtp_user: optional SMTP user, if mail_server_id is not passed
    23.         :param smtp_password: optional SMTP password to use, if mail_server_id is not passed
    24.         :param smtp_debug: optional SMTP debug flag, if mail_server_id is not passed
    25.         :return: the Message-ID of the message that was just sent, if successfully sent, otherwise raises
    26.                 MailDeliveryException and logs root cause.
    27.         """
    28.         smtp_from = message['Return-Path'] or message['From']
    29.         assert smtp_from, "The Return-Path or From header is required for any outbound email"
    30.  
    31.         # The email's "Envelope From" (Return-Path), and all recipient addresses must only contain ASCII characters.
    32.         from_rfc2822 = extract_rfc2822_addresses(smtp_from)
    33.         assert len(from_rfc2822) == 1, "Malformed 'Return-Path' or 'From' address - it may only contain plain ASCII characters"
    34.         smtp_from = from_rfc2822[0]
    35.         email_to = message['To']
    36.         email_cc = message['Cc']
    37.         email_bcc = message['Bcc']
    38.         smtp_to_list = filter(None, tools.flatten(map(extract_rfc2822_addresses,[email_to, email_cc, email_bcc])))
    39.         assert smtp_to_list, "At least one valid recipient address should be specified for outgoing emails (To/Cc/Bcc)"
    40.  
    41.         # Do not actually send emails in testing mode!
    42.         if getattr(threading.currentThread(), 'testing', False):
    43.             _logger.log(logging.TEST, "skip sending email in test mode")
    44.             return message['Message-Id']
    45.  
    46.         # Get SMTP Server Details from Mail Server
    47.         mail_server = None
    48.         if mail_server_id:
    49.             mail_server = self.browse(cr, uid, mail_server_id)
    50.         elif not smtp_server:
    51.             mail_server_ids = self.search(cr, uid, [], order='sequence', limit=1)
    52.             if mail_server_ids:
    53.                 mail_server = self.browse(cr, uid, mail_server_ids[0])
    54.  
    55.         if mail_server:
    56.             smtp_server = mail_server.smtp_host
    57.             smtp_user = mail_server.smtp_user
    58.             smtp_password = mail_server.smtp_pass
    59.             smtp_port = mail_server.smtp_port
    60.             smtp_encryption = mail_server.smtp_encryption
    61.             smtp_debug = smtp_debug or mail_server.smtp_debug
    62.         else:
    63.             # we were passed an explicit smtp_server or nothing at all
    64.             smtp_server = smtp_server or tools.config.get('smtp_server')
    65.             smtp_port = tools.config.get('smtp_port', 25) if smtp_port is None else smtp_port
    66.             smtp_user = smtp_user or tools.config.get('smtp_user')
    67.             smtp_password = smtp_password or tools.config.get('smtp_password')
    68.             if smtp_encryption is None and tools.config.get('smtp_ssl'):
    69.                 smtp_encryption = 'starttls' # STARTTLS is the new meaning of the smtp_ssl flag as of v7.0
    70.  
    71.         if not smtp_server:
    72.             raise osv.except_osv(
    73.                         _("Missing SMTP Server"),
    74.                         _("Please define at least one SMTP server, or provide the SMTP parameters explicitly."))
    75.  
    76.         try:
    77.             message_id = message['Message-Id']
    78.  
    79.             # Add email in Maildir if smtp_server contains maildir.
    80.             if smtp_server.startswith('maildir:/'):
    81.                 from mailbox import Maildir
    82.                 maildir_path = smtp_server[8:]
    83.                 mdir = Maildir(maildir_path, factory=None, create = True)
    84.                 mdir.add(message.as_string(True))
    85.                 return message_id
    86.  
    87.             try:
    88.                 smtp = self.connect(smtp_server, smtp_port, smtp_user, smtp_password, smtp_encryption or False, smtp_debug)
    89.                 smtp.sendmail(smtp_from, smtp_to_list, message.as_string())
    90.             finally:
    91.                 try:
    92.                     # Close Connection of SMTP Server
    93.                     smtp.quit()
    94.                 except Exception:
    95.                     # ignored, just a consequence of the previous exception
    96.                     pass
    97.         except Exception, e:
    98.             msg = _("Mail delivery failed via SMTP server '%s'.\n%s: %s") % (tools.ustr(smtp_server),
    99.                                                                             e.__class__.__name__,
    100.                                                                             tools.ustr(e))
    101.             _logger.exception(msg)
    102.             raise MailDeliveryException(_("Mail delivery failed"), msg)
    103.         return message_id
    104.  
    105.     def on_change_encryption(self, cr, uid, ids, smtp_encryption):
    106.         if smtp_encryption == 'ssl':
    107.             result = {'value': {'smtp_port': 465}}
    108.             if not 'SMTP_SSL' in smtplib.__all__:
    109.                 result['warning'] = {'title': _('Warning'),
    110.                                     'message': _('Your server does not seem to support SSL, you may want to try STARTTLS instead')}
    111.         else:
    112.             result = {'value': {'smtp_port': 25}}
    113.         return result
  4. bruce.nguyen Active Member

    Dear khang,

    - Em overide lại function này không cho nó làm gì hết
    - Tạo 1 function khác dùng schedule tự động gọi hàm đó gửi mail

    Good luck.
  5. quangthanh Member

    Dear khang,

    Bạn tạo 1 bản ghi của object mail.mail với state là outgoing và type là email là nó sẽ tự đấy vào queue, bạn vào sheduled sẽ thấy Queue send mail (nếu đã cài module mail).
    Nếu mail gửi thành công nó sẽ tự xóa, còn không nó sẽ báo state là exception.
    bruce.nguyen thích bài này.

Chia sẻ trang này