It's 2012 all up in here
[mediagoblin.git] / mediagoblin / tools / mail.py
CommitLineData
03ae172a 1# GNU MediaGoblin -- federated, autonomous media hosting
cf29e8a8 2# Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
03ae172a
AW
3#
4# This program is free software: you can redistribute it and/or modify
5# it under the terms of the GNU Affero General Public License as published by
6# the Free Software Foundation, either version 3 of the License, or
7# (at your option) any later version.
8#
9# This program is distributed in the hope that it will be useful,
10# but WITHOUT ANY WARRANTY; without even the implied warranty of
11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12# GNU Affero General Public License for more details.
13#
14# You should have received a copy of the GNU Affero General Public License
15# along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17import smtplib
18from email.MIMEText import MIMEText
19from mediagoblin import mg_globals
20from mediagoblin.tools import common
21
22### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
23### Special email test stuff begins HERE
24### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
26# We have two "test inboxes" here:
ee91c2b8 27#
03ae172a
AW
28# EMAIL_TEST_INBOX:
29# ----------------
30# If you're writing test views, you'll probably want to check this.
31# It contains a list of MIMEText messages.
32#
33# EMAIL_TEST_MBOX_INBOX:
34# ----------------------
35# This collects the messages from the FakeMhost inbox. It's reslly
36# just here for testing the send_email method itself.
37#
38# Anyway this contains:
39# - from
40# - to: a list of email recipient addresses
41# - message: not just the body, but the whole message, including
42# headers, etc.
43#
44# ***IMPORTANT!***
45# ----------------
46# Before running tests that call functions which send email, you should
ee91c2b8 47# always call _clear_test_inboxes() to "wipe" the inboxes clean.
03ae172a
AW
48
49EMAIL_TEST_INBOX = []
50EMAIL_TEST_MBOX_INBOX = []
51
ee91c2b8 52
03ae172a
AW
53class FakeMhost(object):
54 """
55 Just a fake mail host so we can capture and test messages
56 from send_email
57 """
58 def login(self, *args, **kwargs):
59 pass
60
61 def sendmail(self, from_addr, to_addrs, message):
62 EMAIL_TEST_MBOX_INBOX.append(
63 {'from': from_addr,
64 'to': to_addrs,
65 'message': message})
66
ee91c2b8 67
03ae172a
AW
68def _clear_test_inboxes():
69 global EMAIL_TEST_INBOX
70 global EMAIL_TEST_MBOX_INBOX
71 EMAIL_TEST_INBOX = []
72 EMAIL_TEST_MBOX_INBOX = []
73
ee91c2b8 74
03ae172a
AW
75### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
76### </Special email test stuff>
77### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
78
79def send_email(from_addr, to_addrs, subject, message_body):
80 """
81 Simple email sending wrapper, use this so we can capture messages
82 for unit testing purposes.
83
84 Args:
85 - from_addr: address you're sending the email from
86 - to_addrs: list of recipient email addresses
87 - subject: subject of the email
88 - message_body: email body text
89 """
90 if common.TESTS_ENABLED or mg_globals.app_config['email_debug_mode']:
91 mhost = FakeMhost()
92 elif not mg_globals.app_config['email_debug_mode']:
93 mhost = smtplib.SMTP(
94 mg_globals.app_config['email_smtp_host'],
95 mg_globals.app_config['email_smtp_port'])
96
97 # SMTP.__init__ Issues SMTP.connect implicitly if host
98 if not mg_globals.app_config['email_smtp_host']: # e.g. host = ''
99 mhost.connect() # We SMTP.connect explicitly
100
101 if mg_globals.app_config['email_smtp_user'] \
102 or mg_globals.app_config['email_smtp_pass']:
103 mhost.login(
104 mg_globals.app_config['email_smtp_user'],
105 mg_globals.app_config['email_smtp_pass'])
106
107 message = MIMEText(message_body.encode('utf-8'), 'plain', 'utf-8')
108 message['Subject'] = subject
109 message['From'] = from_addr
110 message['To'] = ', '.join(to_addrs)
111
112 if common.TESTS_ENABLED:
113 EMAIL_TEST_INBOX.append(message)
114
115 if mg_globals.app_config['email_debug_mode']:
116 print u"===== Email ====="
117 print u"From address: %s" % message['From']
118 print u"To addresses: %s" % message['To']
119 print u"Subject: %s" % message['Subject']
120 print u"-- Body: --"
121 print message.get_payload(decode=True)
122
123 return mhost.sendmail(from_addr, to_addrs, message.as_string())