From 2f74cd84bdffd020962e7dd3a9da747a4fe6a7af Mon Sep 17 00:00:00 2001 From: Dag Wieers Date: Tue, 9 Oct 2012 19:36:23 +0200 Subject: [PATCH] Module mail to send out emails as an action Sending mails could be part of the workflow to have teams/responsibles perform specific task. Or simply to notify that a process has finished successfully (e.g. provisioning). --- library/mail | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 library/mail diff --git a/library/mail b/library/mail new file mode 100644 index 0000000000..afe5323ef8 --- /dev/null +++ b/library/mail @@ -0,0 +1,134 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# Copyright 2012 Dag Wieers +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . + +DOCUMENTATION = ''' +--- +author: Dag Wieers +module: email +short_description: Send an email +description: + - This module is useful for sending emails from playbooks. + - One may wonder why automate sending emails ? In complex environments + there are from time to time processes that cannot be automated, either + because you lack the authority to make it so, or because not everyone + agrees to a common approach. + - If you cannot automate a specific step, but the step is non-blocking, + sending out an email to the responsible party to make him perform his + part of the bargain is an elegant way to put the responsibility in + someone else's lap. + - Of course sending out a mail can be equally useful as a way to notify + one or more people in a team that a specific action has been + (successfully) taken. +version_added: "0.8" +options: + from: + description: + - The email-address the mail is sent from. + default: root + required: false + to: + description: + - The email-address(es) the mail is being sent to. This is + a comma-separated list. + default: root + required: false + cc: + description: + - The email-address(es) the mail is being copied to. This is + a comma-separated list. + required: false + bcc: + description: + - The email-address(es) the mail is being 'blind' copied to. This is + a comma-separated list. + required: false + subject: + description: + - The subject of the email being sent. + aliases: [ msg ] + required: true + body: + description: + - The body of the email being sent. + default: $subject + required: false +examples: + - description: "Example playbook sending mail to root" + code: local_action: mail msg="System ${ansible_hostname} has been sucessfully provisioned." +''' + +import smtplib + +def main(): + + module = AnsibleModule( + argument_spec = dict( + host = dict(default='localhost'), + sender = dict(default='root', aliases=['from']), + to = dict(default='root', aliases=['recipients']), + cc = dict(default=None), + bcc = dict(default=None), + subject = dict(required=True, aliases=['msg']), + body = dict(default=None), + ) + ) + + host = module.params.get('host') + sender = module.params.get('sender') + recipients = module.params.get('to') + copies = module.params.get('cc') + blindcopies = module.params.get('bcc') + subject = module.params.get('subject') + body = module.params.get('body') + + if not body: + body = subject + + try: + smtp = smtplib.SMTP(host) + except Exception, e: + module.fail_json(rc=1, msg='Failed to send mail to server %s: %s' % (host, e)) + + content = 'From: %s\n' % sender + content += 'To: %s\n' % recipients + if copies: + content += 'Cc: %s\n' % copies + content += 'Subject: %s\n\n' % subject + content += body + + addresses = recipients.split(',') + if copies: + addresses += copies.split(',') + if blindcopies: + addresses += blindcopies.split(',') + + for address in addresses: + try: + smtp.sendmail(sender, address, content) + except Exception, e: + module.fail_json(rc=1, msg='Failed to send mail to address %s: %s' % (address, e)) + + smtp.quit() + + module.exit_json(changed=False) + +# this is magic, see lib/ansible/module_common.py +#<> +main()