##// END OF EJS Templates
hgweb: return iterable, add deprecation note
hgweb: return iterable, add deprecation note

File last commit:

r5866:dc6ed273 default
r5887:41a3fce1 default
Show More
mail.py
94 lines | 3.3 KiB | text/x-python | PythonLexer
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 # 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.
Matt Mackall
Simplify i18n imports
r3891 from i18n import _
Alexis S. L. Carvalho
merge with crew-stable
r4096 import os, smtplib, templater, util, socket
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889
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))
Alexis S. L. Carvalho
fix typo in mail.py
r2964 ui.note(_('sending mail: smtp host %s, port %s\n') %
(mailhost, mailport))
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 s.connect(host=mailhost, port=mailport)
if ui.configbool('smtp', 'tls'):
Alexis S. L. Carvalho
mail.py: don't try to use TLS if python doesn't have SSL support...
r4093 if not hasattr(socket, 'ssl'):
raise util.Abort(_("can't use TLS: Python SSL support "
"not installed"))
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 ui.note(_('(using tls)\n'))
s.ehlo()
s.starttls()
s.ehlo()
username = ui.config('smtp', 'username')
password = ui.config('smtp', 'password')
Arun Thomas
Patchbomb: Prompt password when using SMTP/TLS and no password in .hgrc....
r5749 if username and not password:
password = ui.getpass()
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 if username and password:
ui.note(_('(authenticating to mail server as %s)\n') %
(username))
s.login(username, password)
return s
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 def _sendmail(ui, sender, recipients, msg):
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 '''send mail using sendmail.'''
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 program = ui.config('email', 'method')
cmdline = '%s -f %s %s' % (program, templater.email(sender),
' '.join(map(templater.email, recipients)))
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(program.split(None, 1)[0]),
util.explain_exit(ret)[0]))
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889
def connect(ui):
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 '''make a mail connection. return a function to send mail.
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889 call as sendmail(sender, list-of-recipients, msg).'''
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 func = _sendmail
if ui.config('email', 'method', 'smtp') == 'smtp':
func = _smtp(ui)
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 def send(ui, sender, recipients, msg):
try:
return func.sendmail(sender, recipients, msg)
except smtplib.SMTPRecipientsRefused, inst:
recipients = [r[1] for r in inst.recipients.values()]
raise util.Abort('\n' + '\n'.join(recipients))
except smtplib.SMTPException, inst:
raise util.Abort(inst)
return send
Matt Mackall
Move ui.sendmail to mail.connect/sendmail
r2889
def sendmail(ui, sender, recipients, msg):
Christian Ebert
Catch smtp exceptions
r5472 try:
Matt Mackall
patchbomb: prompt only once for SMTP password...
r5866 send = connect(ui)
return send(sender, recipients, msg)
Christian Ebert
Catch smtp exceptions
r5472 except smtplib.SMTPRecipientsRefused, inst:
recipients = [r[1] for r in inst.recipients.values()]
raise util.Abort('\n' + '\n'.join(recipients))
except smtplib.SMTPException, inst:
raise util.Abort(inst)
Bryan O'Sullivan
patchbomb: Validate email config before we start prompting for info.
r4489
def validateconfig(ui):
'''determine if we have enough config data to try sending email.'''
method = ui.config('email', 'method', 'smtp')
if method == 'smtp':
if not ui.config('smtp', 'host'):
raise util.Abort(_('smtp specified as email transport, '
'but no smtp host configured'))
else:
if not util.find_exe(method):
raise util.Abort(_('%r specified as email transport, '
'but not in PATH') % method)