Commit | Line | Data |
---|---|---|
03ae172a AW |
1 | # GNU MediaGoblin -- federated, autonomous media hosting |
2 | # Copyright (C) 2011 MediaGoblin contributors. See AUTHORS. | |
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 | ||
17 | import smtplib | |
18 | from email.MIMEText import MIMEText | |
19 | from mediagoblin import mg_globals | |
20 | from 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 | |
49 | EMAIL_TEST_INBOX = [] | |
50 | EMAIL_TEST_MBOX_INBOX = [] | |
51 | ||
ee91c2b8 | 52 | |
03ae172a AW |
53 | class 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 |
68 | def _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 | ||
79 | def 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()) |