# HG changeset patch # User Vadim Gelfer # Date 1147713917 25200 # Node ID 903ab41ac7ebec3e6aee87504e17b20934c8c9e4 # Parent 1cad19678b4cb5a20c3172a3f960366ae8d969cb allow to send email using sendmail. default is still smtp. update hgrc doc with sendmail info. diff -r 1cad19678b4c -r 903ab41ac7eb doc/hgrc.5.txt --- a/doc/hgrc.5.txt Mon May 15 09:27:27 2006 -0700 +++ b/doc/hgrc.5.txt Mon May 15 10:25:17 2006 -0700 @@ -135,6 +135,20 @@ from;; Optional. Email address to use in "From" header and SMTP envelope of outgoing messages. + method;; + Optional. Method to use to send email messages. If value is + "smtp" (default), use SMTP (see section "[mail]" for + configuration). Otherwise, use as name of program to run that + acts like sendmail (takes "-f" option for sender, list of + recipients on command line, message on stdin). Normally, setting + this to "sendmail" or "/usr/sbin/sendmail" is enough to use + sendmail to send messages. + + Email example: + + [email] + from = Joseph User + method = /usr/sbin/sendmail extensions:: Mercurial has an extension mechanism for adding new features. To diff -r 1cad19678b4c -r 903ab41ac7eb hgext/patchbomb.py --- a/hgext/patchbomb.py Mon May 15 09:27:27 2006 -0700 +++ b/hgext/patchbomb.py Mon May 15 10:25:17 2006 -0700 @@ -254,8 +254,6 @@ else: ui.status('Sending ', m['Subject'], ' ...\n') mail.sendmail(sender, to + cc, m.as_string(0)) - if not opts['test'] and not opts['mbox']: - mail.close() cmdtable = { 'email': diff -r 1cad19678b4c -r 903ab41ac7eb mercurial/ui.py --- a/mercurial/ui.py Mon May 15 09:27:27 2006 -0700 +++ b/mercurial/ui.py Mon May 15 10:25:17 2006 -0700 @@ -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 @@ 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