From 6c699c5082b9937187865590e7beed41a09f09eb Mon Sep 17 00:00:00 2001 From: "Rifakat Haradwala (Open ERP)" Date: Tue, 22 Mar 2011 19:05:55 +0530 Subject: [PATCH] [IMP] ir_mail_server.py: created method email_send and did other changes bzr revid: rha@tinyerp.com-20110322133555-dshlx0em3n3y7el3 --- openerp/addons/base/ir/ir.xml | 8 +- openerp/addons/base/ir/ir_mail_server.py | 183 ++++++++++++++++++++++- 2 files changed, 183 insertions(+), 8 deletions(-) diff --git a/openerp/addons/base/ir/ir.xml b/openerp/addons/base/ir/ir.xml index 06f76de232e..559465ffdb8 100644 --- a/openerp/addons/base/ir/ir.xml +++ b/openerp/addons/base/ir/ir.xml @@ -1946,7 +1946,7 @@ ir.mail.server.form - ir.mail.server + ir.mail_server form
@@ -1980,7 +1980,7 @@ ir.mail.server.tree - ir.mail.server + ir.mail_server tree @@ -1993,7 +1993,7 @@ ir.mail.server.search - ir.mail.server + ir.mail_server search @@ -2004,7 +2004,7 @@ Email Accounts - ir.mail.server + ir.mail_server form form,tree diff --git a/openerp/addons/base/ir/ir_mail_server.py b/openerp/addons/base/ir/ir_mail_server.py index 05bca603742..b722559d961 100644 --- a/openerp/addons/base/ir/ir_mail_server.py +++ b/openerp/addons/base/ir/ir_mail_server.py @@ -23,15 +23,62 @@ from osv import osv from osv import fields from tools.translate import _ import tools - -import smtplib +from tools import ustr +from tools import config import netsvc +import inspect +import subprocess +import logging +import os +import re +import smtplib +import socket +import sys +import threading +import time +import warnings +import zipfile +from datetime import datetime +from email.MIMEText import MIMEText +from email.MIMEBase import MIMEBase +from email.MIMEMultipart import MIMEMultipart +from email.Header import Header +from email.Utils import formatdate, COMMASPACE +from email import Utils +from email import Encoders +from itertools import islice, izip +from lxml import etree +if sys.version_info[:2] < (2, 4): + from threadinglocal import local +else: + from threading import local +try: + from html2text import html2text +except ImportError: + html2text = None + +import openerp.loglevels as loglevels +from tools import config +from email.generator import Generator + + +# get_encodings, ustr and exception_to_unicode were originally from tools.misc. +# There are moved to loglevels until we refactor tools. +from openerp.loglevels import get_encodings, ustr, exception_to_unicode + +_logger = logging.getLogger('tools') + +# List of etree._Element subclasses that we choose to ignore when parsing XML. +# We include the *Base ones just in case, currently they seem to be subclasses of the _* ones. +SKIPPED_ELEMENT_TYPES = (etree._Comment, etree._ProcessingInstruction, etree.CommentBase, etree.PIBase) + + class ir_mail_server(osv.osv): """ mail server """ - _name = "ir.mail.server" + _name = "ir.mail_server" _columns = { 'name': fields.char('Name', @@ -81,7 +128,7 @@ unless it is already specified in the From Email, e.g: John Doe ", """ try: for smtp_server in self.browse(cr, uid, ids, context=context): - smtp = tools.connect_smtp_server(smtp_server.smtp_host, smtp_server.smtp_port, user_name=smtp_server.smtp_user, + smtp = self.connect_smtp_server(smtp_server.smtp_host, smtp_server.smtp_port, user_name=smtp_server.smtp_user, user_password=smtp_server.smtp_pass, ssl=smtp_server.smtp_ssl, tls=smtp_server.smtp_tls) try: smtp.quit() @@ -96,6 +143,134 @@ unless it is already specified in the From Email, e.g: John Doe ", raise osv.except_osv(_("SMTP Connection: Test Successfully!"), '') + def connect_smtp_server(server_host, server_port, user_name=None, user_password=None, ssl=False, tls=False, debug=False): + """ + Connect SMTP Server and returned the (SMTP) object + """ + smtp_server = None + try: + if ssl: + # In Python 2.6 + smtp_server = smtplib.SMTP_SSL(server_host, server_port) + else: + smtp_server = smtplib.SMTP(server_host, server_port) + + smtp_server.set_debuglevel(int(bool(debug))) # 0 or 1 + + + if tls: + smtp_server.ehlo() + smtp_server.starttls() + smtp_server.ehlo() + + #smtp_server.connect(server_host, server_port) + + if smtp_server.has_extn('AUTH') or user_name or user_password: + smtp_server.login(user_name, user_password) + + + except Exception, error: + _logger.error('Could not connect to smtp server : %s' %(error), exc_info=True) + raise error + return smtp_server + + def _email_send(smtp_from, smtp_to_list, message, ssl=False, debug=False, + smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None): + """Low-level method to send directly a Message through the configured smtp server. + :param smtp_from: RFC-822 envelope FROM (not displayed to recipient) + :param smtp_to_list: RFC-822 envelope RCPT_TOs (not displayed to recipient) + :param message: an email.message.Message to send + :param debug: True if messages should be output to stderr before being sent, + and smtplib.SMTP put into debug mode. + :return: True if the mail was delivered successfully to the smtp, + else False (+ exception logged) + """ + print '_email::' + class WriteToLogger(object): + def __init__(self): + self.logger = loglevels.Logger() + + def write(self, s): + self.logger.notifyChannel('email_send', loglevels.LOG_DEBUG, s) + + try: + smtp_server = smtp_server or config['smtp_server'] + + if smtp_server.startswith('maildir:/'): + from mailbox import Maildir + maildir_path = smtp_server[8:] + mdir = Maildir(maildir_path,factory=None, create = True) + mdir.add(message.as_string(True)) + return True + + if debug: + oldstderr = smtplib.stderr + smtplib.stderr = WriteToLogger() + + if not ssl: ssl = config.get('smtp_ssl', False) + smtp = self.connect_smtp_server(smtp_server, smtp_port, smtp_user, smtp_password, ssl=ssl, tls=True, debug=debug) + try: + smtp.sendmail(smtp_from, smtp_to_list, message.as_string()) + except Exception: + _logger.error('could not deliver Email(s)', exc_info=True) + return False + finally: + try: + smtp.quit() + except Exception: + # ignored, just a consequence of the previous exception + pass + + if debug: + smtplib.stderr = oldstderr + except Exception: + _logger.error('Error on Send Emails Services', exc_info=True) + return False + + return True + + def send_email(self, cr, uid, smtp_from, smtp_to_list, message, id=None, subject=None, ssl=False, + debug=False, smtp_server=None, smtp_port=None, smtp_user=None, smtp_password=None): + + """Send an email. + """ + + if not (smtp_from or config['email_from']): + raise ValueError("Sending an email requires either providing a sender " + "address or having configured one") + if not smtp_from: smtp_from = config.get('email_from', False) + + smtp_from = ustr(smtp_from).encode('utf-8') + + email_body = ustr(message).encode('utf-8') + email_text = MIMEText(email_body or '',_charset='utf-8') + msg = MIMEMultipart() + +# if not message_id and openobject_id: +# message_id = generate_tracking_message_id(openobject_id) +# else: + message_id = Utils.make_msgid() + msg['Message-Id'] = message_id + if subject: + msg['Subject'] = Header(ustr(subject), 'utf-8') + msg['From'] = smtp_from + msg['To'] = COMMASPACE.join(smtp_to_list) + msg['Date'] = formatdate(localtime=True) + + if html2text and subtype == 'html': + text = html2text(email_body.decode('utf-8')).encode('utf-8') + alternative_part = MIMEMultipart(_subtype="alternative") + alternative_part.attach(MIMEText(text, _charset='utf-8', _subtype='plain')) + alternative_part.attach(email_text) + msg.attach(alternative_part) + else: + msg.attach(email_text) + res = self._email_send(smtp_from, smtp_to_list, msg) + if res: + return message_id + return False + + ir_mail_server() # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: