diff --git a/rhodecode/lib/smtp_mailer.py b/rhodecode/lib/smtp_mailer.py --- a/rhodecode/lib/smtp_mailer.py +++ b/rhodecode/lib/smtp_mailer.py @@ -1,6 +1,20 @@ +# -*- coding: utf-8 -*- +""" + rhodecode.lib.smtp_mailer + ~~~~~~~~~~~~~~~~~~~~~~~~~ + + Simple smtp mailer used in RhodeCode + + :created_on: Sep 13, 2011 + :copyright: (c) 2011 by marcink. + :license: LICENSE_NAME, see LICENSE_FILE for more details. +""" + import logging import smtplib import mimetypes +from socket import sslerror + from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage from email.mime.audio import MIMEAudio @@ -10,14 +24,15 @@ from email.utils import formatdate from email import encoders class SmtpMailer(object): - """simple smtp mailer class + """SMTP mailer class mailer = SmtpMailer(mail_from, user, passwd, mail_server, mail_port, ssl, tls) mailer.send(recipients, subject, body, attachment_files) :param recipients might be a list of string or single string :param attachment_files is a dict of {filename:location} - it tries to guess the mimetype and attach the file + it tries to guess the mimetype and attach the file + """ def __init__(self, mail_from, user, passwd, mail_server, @@ -42,6 +57,7 @@ class SmtpMailer(object): smtp_serv = smtplib.SMTP(self.mail_server, self.mail_port) if self.tls: + smtp_serv.ehlo() smtp_serv.starttls() if self.debug: @@ -50,7 +66,10 @@ class SmtpMailer(object): smtp_serv.ehlo() #if server requires authorization you must provide login and password - smtp_serv.login(self.user, self.passwd) + #but only if we have them + if self.user and self.passwd: + smtp_serv.login(self.user, self.passwd) + date_ = formatdate(localtime=True) msg = MIMEMultipart() @@ -67,7 +86,13 @@ class SmtpMailer(object): smtp_serv.sendmail(self.mail_from, recipients, msg.as_string()) logging.info('MAIL SEND TO: %s' % recipients) - smtp_serv.quit() + + try: + smtp_serv.quit() + except sslerror: + # sslerror is raised in tls connections on closing sometimes + pass + def __atach_files(self, msg, attachment_files):