def __init__(self): ''' :ivar to_addr: The default recipient email address Will be set to the configuration variable "email_to", if configuration is available :ivar from_addr: The default sender email address Will be set to the configuration variable "admin_email_from", if configuration is available ''' self.to_addr = config.get('email_to') self.from_addr = config.get('admin_email_from') smtp_server = config.get('smtp_server') smtp_use_tls = asbool(config.get('smtp_use_tls')) smtp_username = config.get('smtp_username') smtp_password = config.get('smtp_password') test = asbool(config.get('test')) if test: log.debug('Using DummyDelivery()') self.delivery = DummyDelivery() else: # pragma: no cover if smtp_server: mailer = SMTPMailer(hostname=smtp_server, username=smtp_username, password=smtp_password, force_tls=smtp_use_tls) log.debug('Using SMTPMailer(hostname=%s, ...)', smtp_server) else: mailer = SendmailMailer() log.debug('Using SendmailMailer()') self.delivery = DirectMailDelivery(mailer)
def __init__(self, host='localhost', port=25, username=None, password=None, tls=False, ssl=False, keyfile=None, certfile=None, queue_path=None, default_sender=None, sendmail_app=None, sendmail_template=None, debug=0): if ssl: self.smtp_mailer = SMTP_SSLMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: self.smtp_mailer = SMTPMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug) self.direct_delivery = DirectMailDelivery(self.smtp_mailer) if queue_path: self.queue_delivery = QueuedMailDelivery(queue_path) else: self.queue_delivery = None self.sendmail_mailer = SendmailMailer(sendmail_app, sendmail_template) self.sendmail_delivery = DirectMailDelivery(self.sendmail_mailer) self.default_sender = default_sender
class Mailer(object): """ Manages sending of email messages. :param host: SMTP hostname :param port: SMTP port :param username: SMTP username :param password: SMPT password :param tls: use TLS :param ssl: use SSL :param keyfile: SSL key file :param certfile: SSL certificate file :param queue_path: path to maildir for queued messages :param default_sender: default "from" address :param sendmail_app: path to "sendmail" binary. repoze defaults to "/usr/sbin/sendmail" :param sendmail_template: custom commandline template passed to sendmail binary, defaults to'["{sendmail_app}", "-t", "-i", "-f", "{sender}"]' :param debug: SMTP debug level """ def __init__(self, host='localhost', port=25, username=None, password=None, tls=False, ssl=False, keyfile=None, certfile=None, queue_path=None, default_sender=None, sendmail_app=None, sendmail_template=None, debug=0): if ssl: self.smtp_mailer = SMTP_SSLMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: self.smtp_mailer = SMTPMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug) self.direct_delivery = DirectMailDelivery(self.smtp_mailer) if queue_path: self.queue_delivery = QueuedMailDelivery(queue_path) else: self.queue_delivery = None self.sendmail_mailer = SendmailMailer(sendmail_app, sendmail_template) self.sendmail_delivery = DirectMailDelivery(self.sendmail_mailer) self.default_sender = default_sender @classmethod def from_settings(cls, settings, prefix='mail.'): """ Creates a new instance of **Mailer** from settings dict. :param settings: a settings dict-like :param prefix: prefix separating **pyramid_mailer** settings """ settings = settings or {} kwarg_names = [prefix + k for k in ( 'host', 'port', 'username', 'password', 'tls', 'ssl', 'keyfile', 'certfile', 'queue_path', 'debug', 'default_sender')] size = len(prefix) kwargs = dict(((k[size:], settings[k]) for k in settings.keys() if k in kwarg_names)) for key in ('tls', 'ssl'): val = kwargs.get(key) if val: kwargs[key] = asbool(val) return cls(**kwargs) def send(self, message): """ Sends a message. The message is handled inside a transaction, so in case of failure (or the message fails) the message will not be sent. :param message: a **Message** instance. """ return self.direct_delivery.send(*self._message_args(message)) def send_immediately(self, message, fail_silently=False): """ Sends a message immediately, outside the transaction manager. If there is a connection error to the mail server this will have to be handled manually. However if you pass ``fail_silently`` the error will be swallowed. :versionadded: 0.3 :param message: a **Message** instance. :param fail_silently: silently handle connection errors. """ try: return self.smtp_mailer.send(*self._message_args(message)) except smtplib.socket.error: if not fail_silently: raise def send_to_queue(self, message): """ Adds a message to a maildir queue. In order to handle this, the setting **mail.queue_path** must be provided and must point to a valid maildir. :param message: a **Message** instance. """ if not self.queue_delivery: raise RuntimeError("No queue_path provided") return self.queue_delivery.send(*self._message_args(message)) def _message_args(self, message): message.sender = message.sender or self.default_sender # convert Lamson message to Python email package msessage msg = message.to_message() return (message.sender, message.send_to, msg) def send_sendmail(self, message ): """ Sends a message within the transaction manager. Uses the local sendmail option :param message: a **Message** instance. """ return self.sendmail_delivery.send(*self._message_args(message)) def send_immediately_sendmail(self, message, fail_silently=False): """ Sends a message immediately, outside the transaction manager. Uses the local sendmail option If there is a connection error to the mail server this will have to be handled manually. However if you pass ``fail_silently`` the error will be swallowed. :param message: a **Message** instance. :param fail_silently: silently handle connection errors. """ try: return self.sendmail_mailer.send(*self._message_args(message)) except: if not fail_silently: raise
class Mailer(object): """Manages sending of email messages. :param host: SMTP hostname :param port: SMTP port :param username: SMTP username :param password: SMPT password :param tls: use TLS :param ssl: use SSL :param keyfile: SSL key file :param certfile: SSL certificate file :param queue_path: path to maildir for queued messages :param default_sender: default "from" address :param sendmail_app: path to "sendmail" binary. repoze defaults to "/usr/sbin/sendmail" :param sendmail_template: custom commandline template passed to sendmail binary, defaults to'["{sendmail_app}", "-t", "-i", "-f", "{sender}"]' :param debug: SMTP debug level """ def __init__(self, host='localhost', port=25, username=None, password=None, tls=False, ssl=False, keyfile=None, certfile=None, queue_path=None, default_sender=None, sendmail_app=None, sendmail_template=None, debug=0): if ssl: self.smtp_mailer = SMTP_SSLMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: self.smtp_mailer = SMTPMailer( hostname=host, port=port, username=username, password=password, no_tls=not(tls), force_tls=tls, debug_smtp=debug) self.direct_delivery = DirectMailDelivery(self.smtp_mailer) if queue_path: self.queue_delivery = QueuedMailDelivery(queue_path) else: self.queue_delivery = None self.sendmail_mailer = SendmailMailer(sendmail_app, sendmail_template) self.sendmail_delivery = DirectMailDelivery(self.sendmail_mailer) self.default_sender = default_sender @classmethod def from_settings(cls, settings, prefix='mail.'): """Create a new instance of 'Mailer' from settings dict. :param settings: a settings dict-like :param prefix: prefix separating 'pyramid_mailer' settings """ settings = settings or {} kwarg_names = [prefix + k for k in ( 'host', 'port', 'username', 'password', 'tls', 'ssl', 'keyfile', 'certfile', 'queue_path', 'debug', 'default_sender')] size = len(prefix) kwargs = dict(((k[size:], settings[k]) for k in settings.keys() if k in kwarg_names)) for key in ('tls', 'ssl'): val = kwargs.get(key) if val: kwargs[key] = asbool(val) return cls(**kwargs) def send(self, message): """Send a message. The message is handled inside a transaction, so in case of failure (or the message fails) the message will not be sent. :param message: a 'Message' instance. """ return self.direct_delivery.send(*self._message_args(message)) def send_immediately(self, message, fail_silently=False): """Send a message immediately, outside the transaction manager. If there is a connection error to the mail server this will have to be handled manually. However if you pass ``fail_silently`` the error will be swallowed. :versionadded: 0.3 :param message: a 'Message' instance. :param fail_silently: silently handle connection errors. """ try: return self.smtp_mailer.send(*self._message_args(message)) except smtplib.socket.error: if not fail_silently: raise def send_to_queue(self, message): """Add a message to a maildir queue. In order to handle this, the setting 'mail.queue_path' must be provided and must point to a valid maildir. :param message: a 'Message' instance. """ if not self.queue_delivery: raise RuntimeError("No queue_path provided") return self.queue_delivery.send(*self._message_args(message)) def _message_args(self, message): message.sender = message.sender or self.default_sender # convert Lamson message to Python email package msessage msg = message.to_message() return (message.sender, message.send_to, msg) def send_sendmail(self, message ): """Send a message within the transaction manager. Uses the local sendmail option :param message: a 'Message' instance. """ return self.sendmail_delivery.send(*self._message_args(message)) def send_immediately_sendmail(self, message, fail_silently=False): """Send a message immediately, outside the transaction manager. Uses the local sendmail option If there is a connection error to the mail server this will have to be handled manually. However if you pass ``fail_silently`` the error will be swallowed. :param message: a 'Message' instance. :param fail_silently: silently handle connection errors. """ try: return self.sendmail_mailer.send(*self._message_args(message)) except: if not fail_silently: raise
def __init__(self, **kw): smtp_mailer = kw.pop('smtp_mailer', None) if smtp_mailer is None: host = kw.pop('host', 'localhost') port = kw.pop('port', 25) username = kw.pop('username', None) password = kw.pop('password', None) tls = kw.pop('tls', False) ssl = kw.pop('ssl', False) keyfile = kw.pop('keyfile', None) certfile = kw.pop('certfile', None) debug = kw.pop('debug', 0) if ssl: smtp_mailer = SMTP_SSLMailer(hostname=host, port=port, username=username, password=password, no_tls=not (tls), force_tls=tls, debug_smtp=debug, keyfile=keyfile, certfile=certfile) else: smtp_mailer = SMTPMailer(hostname=host, port=port, username=username, password=password, no_tls=not (tls), force_tls=tls, debug_smtp=debug) self.smtp_mailer = smtp_mailer sendmail_mailer = kw.pop('sendmail_mailer', None) if sendmail_mailer is None: sendmail_mailer = SendmailMailer( kw.pop('sendmail_app', None), kw.pop('sendmail_template', None), ) self.sendmail_mailer = sendmail_mailer self.queue_path = kw.pop('queue_path', None) self.default_sender = kw.pop('default_sender', None) transaction_manager = kw.pop('transaction_manager', None) if transaction_manager is None: transaction_manager = transaction.manager self.transaction_manager = transaction_manager if kw: raise ValueError('invalid options: %s' % ', '.join(sorted(kw.keys()))) self.direct_delivery = DirectMailDelivery( self.smtp_mailer, transaction_manager=transaction_manager) if self.queue_path: self.queue_delivery = QueuedMailDelivery( self.queue_path, transaction_manager=transaction_manager) else: self.queue_delivery = None self.sendmail_delivery = DirectMailDelivery( self.sendmail_mailer, transaction_manager=transaction_manager)