105 lines
3.6 KiB
Python
105 lines
3.6 KiB
Python
"""
|
|
Support for the Mailgun mail service.
|
|
|
|
For more details about this platform, please refer to the documentation at
|
|
https://home-assistant.io/components/notify.mailgun/
|
|
"""
|
|
import logging
|
|
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.components.notify import (
|
|
PLATFORM_SCHEMA, BaseNotificationService, ATTR_TITLE, ATTR_TITLE_DEFAULT,
|
|
ATTR_DATA)
|
|
from homeassistant.const import (
|
|
CONF_TOKEN, CONF_DOMAIN, CONF_RECIPIENT, CONF_SENDER)
|
|
import homeassistant.helpers.config_validation as cv
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
REQUIREMENTS = ['https://github.com/pschmitt/pymailgun/'
|
|
'archive/1.3.zip#'
|
|
'pymailgun==1.3']
|
|
|
|
# Images to attach to notification
|
|
ATTR_IMAGES = 'images'
|
|
|
|
CONF_SANDBOX = 'sandbox'
|
|
|
|
DEFAULT_SENDER = 'hass@{domain}'
|
|
DEFAULT_SANDBOX = False
|
|
|
|
# pylint: disable=no-value-for-parameter
|
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
|
vol.Required(CONF_TOKEN): cv.string,
|
|
vol.Required(CONF_RECIPIENT): vol.Email(),
|
|
vol.Optional(CONF_DOMAIN): cv.string,
|
|
vol.Optional(CONF_SENDER): vol.Email(),
|
|
vol.Optional(CONF_SANDBOX, default=DEFAULT_SANDBOX): cv.boolean,
|
|
})
|
|
|
|
|
|
def get_service(hass, config, discovery_info=None):
|
|
"""Get the Mailgun notification service."""
|
|
mailgun_service = MailgunNotificationService(
|
|
config.get(CONF_DOMAIN), config.get(CONF_SANDBOX),
|
|
config.get(CONF_TOKEN), config.get(CONF_SENDER),
|
|
config.get(CONF_RECIPIENT))
|
|
if mailgun_service.connection_is_valid():
|
|
return mailgun_service
|
|
else:
|
|
return None
|
|
|
|
|
|
class MailgunNotificationService(BaseNotificationService):
|
|
"""Implement a notification service for the Mailgun mail service."""
|
|
|
|
def __init__(self, domain, sandbox, token, sender, recipient):
|
|
"""Initialize the service."""
|
|
self._client = None # Mailgun API client
|
|
self._domain = domain
|
|
self._sandbox = sandbox
|
|
self._token = token
|
|
self._sender = sender
|
|
self._recipient = recipient
|
|
|
|
def initialize_client(self):
|
|
"""Initialize the connection to Mailgun."""
|
|
from pymailgun import Client
|
|
self._client = Client(self._token, self._domain, self._sandbox)
|
|
_LOGGER.debug("Mailgun domain: %s", self._client.domain)
|
|
self._domain = self._client.domain
|
|
if not self._sender:
|
|
self._sender = DEFAULT_SENDER.format(domain=self._domain)
|
|
|
|
def connection_is_valid(self):
|
|
"""Check whether the provided credentials are valid."""
|
|
from pymailgun import (MailgunCredentialsError, MailgunDomainError)
|
|
try:
|
|
self.initialize_client()
|
|
except MailgunCredentialsError:
|
|
_LOGGER.exception("Invalid credentials")
|
|
return False
|
|
except MailgunDomainError as mailgun_error:
|
|
_LOGGER.exception(mailgun_error)
|
|
return False
|
|
return True
|
|
|
|
def send_message(self, message="", **kwargs):
|
|
"""Send a mail to the recipient."""
|
|
from pymailgun import MailgunError
|
|
subject = kwargs.get(ATTR_TITLE, ATTR_TITLE_DEFAULT)
|
|
data = kwargs.get(ATTR_DATA)
|
|
files = data.get(ATTR_IMAGES) if data else None
|
|
|
|
try:
|
|
# Initialize the client in case it was not.
|
|
if self._client is None:
|
|
self.initialize_client()
|
|
resp = self._client.send_mail(
|
|
sender=self._sender, to=self._recipient, subject=subject,
|
|
text=message, files=files)
|
|
_LOGGER.debug("Message sent: %s", resp)
|
|
except MailgunError as mailgun_error:
|
|
_LOGGER.exception("Failed to send message: %s", mailgun_error)
|