Sending an email when a system breaks, warning level reached or just simply when a job completes is standard stuff. The smtplib module handles the sending and the email module makes building even a multipart mime email straightforward. If you have not used these libraries to send an email before then there are lots of other articles on the Internet with examples for example Matt’s blog post for a quick overview on sending plain text and then text + html multipart emails.
What can be surprising is the slight variations in what different SMTP gateways will require in order to work. The following table gives you the different settings needed to get the most common gateways working.
|Exchange||your dns entry||25||no||n/a *|
|Exchange||your dns entry||587||yes||Windows username
|Office 365||smtp.office365.com||587||yes||email address|
|Gmail||smtp.gmail.com||587||yes||email address !|
|Yahoo mail||smtp.mail.yahoo.com||587||yes||email address !|
|AWS SES|| email-smtp.us-east-1.amazonaws.com
|yes||Access key +|
* Exchange with use the credentials of the user running the Python command to determine what rights they have to send email. You do not need to login when using this method.
! You will have to allow access to less less secure apps. See here for Gmail and here for YahooMail.
+ Password is the secret access key. Verify email address before sending with this guide.
For a local Exchange server where you control the network (top option in the table above) you can use the code from Matt’s blog post above without change. However where the server is remote or you want to specify login credentials for Exchange you should look to using the Extended SMTP commands. This can be done by changing the sendmail code with the following.
s=smtplib.SMTP(Server,Port) if 'STARTTLS' in s.ehlo(): s.starttls() s.login(Username,Password) s.sendmail(...) s.quit()
As a final note, I’ve included the ehlo command (Extended Hello) in the example above although all of the gateways listed will work without this. This is best practice as it informs the gateway you want to use extended commands and will also return a list of commands accepted. I’ve used this to check the gateway supports STARTTLS (I don’t want my username and password sent unencrypted to the server).