From f24cd4feedb6d909fc215fcd47ae7f8ade18f7ec Mon Sep 17 00:00:00 2001
From: Fabian Affolter <fabian@affolter-engineering.ch>
Date: Wed, 3 Jun 2015 20:39:16 +0200
Subject: [PATCH] add smtp notification platform

---
 homeassistant/components/notify/smtp.py | 164 ++++++++++++++++++++++++
 1 file changed, 164 insertions(+)
 create mode 100644 homeassistant/components/notify/smtp.py

diff --git a/homeassistant/components/notify/smtp.py b/homeassistant/components/notify/smtp.py
new file mode 100644
index 00000000000..998391c81b4
--- /dev/null
+++ b/homeassistant/components/notify/smtp.py
@@ -0,0 +1,164 @@
+"""
+homeassistant.components.notify.mail
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Mail notification service.
+
+Configuration:
+
+To use the Mail notifier you will need to add something like the following
+to your config/configuration.yaml
+
+notify:
+  platform: mail
+  server: MAIL_SERVER
+  port: YOUR_SMTP_PORT
+  sender: SENDER_EMAIL_ADDRESS
+  starttls: 1 or 0
+  username: YOUR_SMTP_USERNAME
+  password: YOUR_SMTP_PASSWORD
+  recipient: YOUR_RECIPIENT
+
+Variables:
+
+server
+*Required
+SMTP server which is used to end the notifications. For Google Mail, eg.
+smtp.gmail.com. Keep in mind that Google has some extra layers of protection
+which need special attention (Hint: 'Less secure apps').
+
+port
+*Required
+The port that the SMTP server is using, eg. 587 for Google Mail and STARTTLS
+or 465/993 depending on your SMTP servers.
+
+sender
+*Required
+E-Mail address of the sender.
+
+starttls
+*Optional
+Enables STARTTLS, eg. 1 or 0.
+
+username
+*Required
+Username for the SMTP account.
+
+password
+*Required
+Password for the SMTP server that belongs to the given username. If the
+password contains a colon it need to be wrapped in apostrophes.
+
+recipient
+*Required
+Recipient of the notification.
+"""
+import logging
+import smtplib
+from email.mime.text import MIMEText
+
+from homeassistant.helpers import validate_config
+from homeassistant.components.notify import (
+    DOMAIN, ATTR_TITLE, BaseNotificationService)
+
+_LOGGER = logging.getLogger(__name__)
+
+
+def get_service(hass, config):
+    """ Get the mail notification service. """
+
+    if not validate_config(config,
+                           {DOMAIN: ['server',
+                                     'port',
+                                     'sender',
+                                     'username',
+                                     'password',
+                                     'recipient']},
+                           _LOGGER):
+        return None
+
+    smtp_server = config[DOMAIN]['server']
+    port = int(config[DOMAIN]['port'])
+    username = config[DOMAIN]['username']
+    password = config[DOMAIN]['password']
+
+    server = None
+    try:
+        server = smtplib.SMTP(smtp_server, port)
+        server.ehlo()
+        if int(config[DOMAIN]['starttls']) == 1:
+            server.starttls()
+            server.ehlo()
+
+        try:
+            server.login(username, password)
+
+        except (smtplib.SMTPException, smtplib.SMTPSenderRefused) as error:
+            _LOGGER.exception(error,
+                              "Please check your settings.")
+
+            return None
+
+    except smtplib.socket.gaierror:
+        _LOGGER.exception(
+            "SMTP server not found. "
+            "Please check the IP address or hostname of your SMTP server.")
+
+        return None
+
+    except smtplib.SMTPAuthenticationError:
+        _LOGGER.exception(
+            "Login not possible. "
+            "Please check your setting and/or your credentials.")
+
+        return None
+
+    if server:
+        server.quit()
+
+    return MailNotificationService(
+        config[DOMAIN]['server'],
+        config[DOMAIN]['port'],
+        config[DOMAIN]['sender'],
+        config[DOMAIN]['starttls'],
+        config[DOMAIN]['username'],
+        config[DOMAIN]['password'],
+        config[DOMAIN]['recipient']
+        )
+
+
+# pylint: disable=too-few-public-methods, too-many-instance-attributes
+class MailNotificationService(BaseNotificationService):
+    """ Implements notification service for E-Mail messages. """
+
+    # pylint: disable=too-many-arguments
+    def __init__(self, server, port, sender, starttls, username,
+                 password, recipient):
+        self._server = server
+        self._port = port
+        self._sender = sender
+        self.starttls = int(starttls)
+        self.username = username
+        self.password = password
+        self.recipient = recipient
+
+        self.mail = smtplib.SMTP(self._server, self._port)
+        self.mail.ehlo_or_helo_if_needed()
+        if self.starttls == 1:
+            self.mail.starttls()
+            self.mail.ehlo()
+
+        self.mail.login(self.username, self.password)
+
+    def send_message(self, message="", **kwargs):
+        """ Send a message to a user. """
+
+        subject = kwargs.get(ATTR_TITLE)
+
+        msg = MIMEText(message)
+        msg['Subject'] = subject
+        msg['To'] = self.recipient
+        msg['From'] = self._sender
+        msg['X-Mailer'] = 'HomeAssistant'
+
+        self.mail.sendmail(self._sender, self.recipient, msg.as_string())
-- 
GitLab