diff --git a/mercurial/ui.py b/mercurial/ui.py --- a/mercurial/ui.py +++ b/mercurial/ui.py @@ -8,7 +8,8 @@ import ConfigParser from i18n import gettext as _ from demandload import * -demandload(globals(), "errno getpass os re smtplib socket sys tempfile util") +demandload(globals(), "errno getpass os re smtplib socket sys tempfile") +demandload(globals(), "templater util") class ui(object): def __init__(self, verbose=False, debug=False, quiet=False, @@ -270,17 +271,56 @@ class ui(object): return t def sendmail(self): - s = smtplib.SMTP() - mailhost = self.config('smtp', 'host') - if not mailhost: - raise util.Abort(_('no [smtp]host in hgrc - cannot send mail')) - s.connect(host=mailhost, port=int(self.config('smtp', 'port', 25))) - if self.configbool('smtp', 'tls'): - s.ehlo() - s.starttls() - s.ehlo() - username = self.config('smtp', 'username') - password = self.config('smtp', 'password') - if username and password: - s.login(username, password) - return s + '''send mail message. object returned has one method, sendmail. + call as sendmail(sender, list-of-recipients, msg).''' + + def smtp(): + '''send mail using smtp.''' + + s = smtplib.SMTP() + mailhost = self.config('smtp', 'host') + if not mailhost: + raise util.Abort(_('no [smtp]host in hgrc - cannot send mail')) + mailport = int(self.config('smtp', 'port', 25)) + self.note(_('sending mail: smtp host %s, port %s\n') % + (mailhost, mailport)) + s.connect(host=mailhost, port=mailport) + if self.configbool('smtp', 'tls'): + self.note(_('(using tls)\n')) + s.ehlo() + s.starttls() + s.ehlo() + username = self.config('smtp', 'username') + password = self.config('smtp', 'password') + if username and password: + self.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])) + + method = self.config('email', 'method', 'smtp') + if method == 'smtp': + mail = smtp() + else: + mail = sendmail(self, method) + return mail