mercurial/mail.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Thu, 08 Feb 2007 16:31:21 -0200
changeset 4074 0f9381cf9723
parent 2964 26c8d37496c2
child 3886 abaee83ce0a6
child 4093 669f99f78db0
permissions -rw-r--r--
Try to pass repo.ui to reposetup hooks The ui object we received in this function may belong to another repo, which could be confusing from the hook point of view. Trying to use the ui object from the newly created repo should avoid this confusion.

# mail.py - mail sending bits for mercurial
#
# Copyright 2006 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.

from i18n import gettext as _
from demandload import *
demandload(globals(), "os re smtplib templater util")

def _smtp(ui):
    '''send mail using smtp.'''

    local_hostname = ui.config('smtp', 'local_hostname')
    s = smtplib.SMTP(local_hostname=local_hostname)
    mailhost = ui.config('smtp', 'host')
    if not mailhost:
        raise util.Abort(_('no [smtp]host in hgrc - cannot send mail'))
    mailport = int(ui.config('smtp', 'port', 25))
    ui.note(_('sending mail: smtp host %s, port %s\n') %
            (mailhost, mailport))
    s.connect(host=mailhost, port=mailport)
    if ui.configbool('smtp', 'tls'):
        ui.note(_('(using tls)\n'))
        s.ehlo()
        s.starttls()
        s.ehlo()
    username = ui.config('smtp', 'username')
    password = ui.config('smtp', 'password')
    if username and password:
        ui.note(_('(authenticating to mail server as %s)\n') %
                  (username))
        s.login(username, password)
    return s

class _sendmail(object):
    '''send mail using sendmail.'''

    def __init__(self, ui, program):
        self.ui = ui
        self.program = program

    def sendmail(self, sender, recipients, msg):
        cmdline = '%s -f %s %s' % (
            self.program, templater.email(sender),
            ' '.join(map(templater.email, recipients)))
        self.ui.note(_('sending mail: %s\n') % cmdline)
        fp = os.popen(cmdline, 'w')
        fp.write(msg)
        ret = fp.close()
        if ret:
            raise util.Abort('%s %s' % (
                os.path.basename(self.program.split(None, 1)[0]),
                util.explain_exit(ret)[0]))

def connect(ui):
    '''make a mail connection. object returned has one method, sendmail.
    call as sendmail(sender, list-of-recipients, msg).'''

    method = ui.config('email', 'method', 'smtp')
    if method == 'smtp':
        return _smtp(ui)

    return _sendmail(ui, method)

def sendmail(ui, sender, recipients, msg):
    return connect(ui).sendmail(sender, recipients, msg)