Source code for mailkit.core.smtp.sendemail
import smtplib
import functools
from inspect import signature
import click
from mailkit.error import LoginError, SendMailError
from .message import Message
from .config import SmtpConfig
message_signature = signature(Message)
[docs]def wrap_message_signature(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
wrapper.__signature__ = message_signature
return wrapper
[docs]class SendEmail(SmtpConfig):
_smtp = None
def __enter__(self):
return self
def __exit__(self, exc_type, exc_val, exc_tb):
self.close()
[docs] def close(self):
if self.smtp is not None:
self.smtp.quit()
@property
def smtp(self):
if self._smtp is None:
self.login()
return self._smtp
[docs] def login(self):
SmtpType = smtplib.SMTP_SSL if self.use_ssl else smtplib.SMTP
port = self.port or smtplib.SMTP_SSL_PORT if self.use_ssl else smtplib.SMTP_PORT
try:
self._smtp = SmtpType(self.host, port, timeout=self.timeout)
self._smtp.login(self.username, self.password)
click.secho('login success.', fg='green', err=True)
except Exception as e:
raise LoginError(click.style(f'login failed as: {e}', fg='red'))
[docs] @wrap_message_signature
def send(self, **kwargs):
kwargs['from_addr'] = kwargs.get('from_addr', self.username)
msg = Message(**kwargs).message
try:
self.smtp.sendmail(self.username, kwargs['to_addrs'], msg.as_string())
click.secho('email has send to: {to_addrs}'.format(**kwargs), fg='green', err=True)
except Exception as e:
raise SendMailError(f'send email failed as: {e}')