Comments
Patch
@@ -151,6 +151,29 @@
if starttls or smtps:
ui.note(_(b'(verifying remote certificate)\n'))
sslutil.validatesocket(s.sock)
+
+ _smtp_login(ui, s, mailhost, mailport)
+
+ def send(sender, recipients, msg):
+ try:
+ return s.sendmail(sender, recipients, msg)
+ except smtplib.SMTPRecipientsRefused as inst:
+ recipients = [r[1] for r in inst.recipients.values()]
+ raise error.Abort(b'\n' + b'\n'.join(recipients))
+ except smtplib.SMTPException as inst:
+ raise error.Abort(inst)
+
+ return send
+
+
+def _smtp_login(ui, smtp, mailhost, mailport):
+ """A hook for the keyring extension to perform the actual SMTP login.
+
+ An already connected SMTP object of the proper type is provided, based on
+ the current configuration. The host and port to which the connection was
+ established are provided for accessibility, since the SMTP object doesn't
+ provide an accessor.
+ """
username = ui.config(b'smtp', b'username')
password = ui.config(b'smtp', b'password')
if username:
@@ -164,21 +187,10 @@
ui.note(_(b'(authenticating to mail server as %s)\n') % username)
username = encoding.strfromlocal(username)
try:
- s.login(username, password)
+ smtp.login(username, password)
except smtplib.SMTPException as inst:
raise error.Abort(stringutil.forcebytestr(inst))
- def send(sender, recipients, msg):
- try:
- return s.sendmail(sender, recipients, msg)
- except smtplib.SMTPRecipientsRefused as inst:
- recipients = [r[1] for r in inst.recipients.values()]
- raise error.Abort(b'\n' + b'\n'.join(recipients))
- except smtplib.SMTPException as inst:
- raise error.Abort(inst)
-
- return send
-
def _sendmail(ui, sender, recipients, msg):
'''send mail using sendmail.'''