Move ui.sendmail to mail.connect/sendmail

This commit is contained in:
Matt Mackall 2006-08-15 14:06:50 -05:00
parent 6ecbc46d1a
commit f849bdf704
4 changed files with 75 additions and 63 deletions

View File

@ -67,8 +67,8 @@
from mercurial.demandload import *
from mercurial.i18n import gettext as _
from mercurial.node import *
demandload(globals(), 'email.Parser mercurial:commands,patch,templater,util')
demandload(globals(), 'fnmatch socket time')
demandload(globals(), 'mercurial:commands,patch,templater,util,mail')
demandload(globals(), 'email.Parser fnmatch socket time')
# template for single changeset can include email headers.
single_template = '''
@ -229,8 +229,8 @@ class notifier(object):
else:
self.ui.status(_('notify: sending %d subscribers %d changes\n') %
(len(self.subs), count))
mail = self.ui.sendmail()
mail.sendmail(templater.email(msg['From']), self.subs, msgtext)
mail.sendmail(self.ui, templater.email(msg['From']),
self.subs, msgtext)
def diff(self, node, ref):
maxdiff = int(self.ui.config('notify', 'maxdiff', 300))

View File

@ -241,7 +241,7 @@ def patchbomb(ui, repo, *revs, **opts):
ui.write('\n')
if not opts['test'] and not opts['mbox']:
mail = ui.sendmail()
mailer = mail.connect(ui)
parent = None
# Calculate UTC offset
@ -290,7 +290,7 @@ def patchbomb(ui, repo, *revs, **opts):
ui.status('Sending ', m['Subject'], ' ...\n')
# Exim does not remove the Bcc field
del m['Bcc']
mail.sendmail(sender, to + bcc + cc, m.as_string(0))
mailer.sendmail(sender, to + bcc + cc, m.as_string(0))
cmdtable = {
'email':

68
mercurial/mail.py Normal file
View File

@ -0,0 +1,68 @@
# 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))
self.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)

View File

@ -7,7 +7,7 @@
from i18n import gettext as _
from demandload import *
demandload(globals(), "errno getpass os re smtplib socket sys tempfile")
demandload(globals(), "errno getpass os re socket sys tempfile")
demandload(globals(), "ConfigParser mdiff templater traceback util")
class ui(object):
@ -281,62 +281,6 @@ class ui(object):
return t
def sendmail(self):
'''send mail message. object returned has one method, sendmail.
call as sendmail(sender, list-of-recipients, msg).'''
def smtp():
'''send mail using smtp.'''
local_hostname = self.config('smtp', 'local_hostname')
s = smtplib.SMTP(local_hostname=local_hostname)
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
def print_exc(self):
'''print exception traceback if traceback printing enabled.
only to call in exception handler. returns true if traceback