14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
from email.message import Message
19
except ImportError: # python < 3
20
from email.Message import Message
17
from email.message import Message
97
95
my_config, _smtp_factory=smtp_factory)
99
97
def test_defaults(self):
100
conn = self.get_connection('')
98
conn = self.get_connection(b'')
101
99
self.assertEqual('localhost', conn._smtp_server)
102
100
self.assertEqual(None, conn._smtp_username)
103
101
self.assertEqual(None, conn._smtp_password)
105
103
def test_smtp_server(self):
106
conn = self.get_connection('smtp_server=host:10')
104
conn = self.get_connection(b'smtp_server=host:10')
107
105
self.assertEqual('host:10', conn._smtp_server)
109
107
def test_missing_server(self):
110
conn = self.get_connection('', smtp_factory=connection_refuser)
108
conn = self.get_connection(b'', smtp_factory=connection_refuser)
111
109
self.assertRaises(smtp_connection.DefaultSMTPConnectionRefused,
113
conn = self.get_connection('smtp_server=smtp.example.com',
111
conn = self.get_connection(b'smtp_server=smtp.example.com',
114
112
smtp_factory=connection_refuser)
115
113
self.assertRaises(smtp_connection.SMTPConnectionRefused, conn._connect)
117
115
def test_smtp_username(self):
118
conn = self.get_connection('')
116
conn = self.get_connection(b'')
119
117
self.assertIs(None, conn._smtp_username)
121
conn = self.get_connection('smtp_username=joebody')
119
conn = self.get_connection(b'smtp_username=joebody')
122
120
self.assertEqual(u'joebody', conn._smtp_username)
124
122
def test_smtp_password_from_config(self):
125
conn = self.get_connection('')
123
conn = self.get_connection(b'')
126
124
self.assertIs(None, conn._smtp_password)
128
conn = self.get_connection('smtp_password=mypass')
126
conn = self.get_connection(b'smtp_password=mypass')
129
127
self.assertEqual(u'mypass', conn._smtp_password)
131
129
def test_smtp_password_from_user(self):
133
131
password = 'hispass'
134
132
factory = WideOpenSMTPFactory()
135
conn = self.get_connection('[DEFAULT]\nsmtp_username=%s\n' % user,
136
smtp_factory=factory)
133
conn = self.get_connection(
134
b'[DEFAULT]\nsmtp_username=%s\n' % user.encode('ascii'),
135
smtp_factory=factory)
137
136
self.assertIs(None, conn._smtp_password)
139
138
ui.ui_factory = ui.CannedInputUIFactory([password])
145
144
password = 'hispass'
146
145
factory = WideOpenSMTPFactory()
147
conn = self.get_connection('[DEFAULT]\nsmtp_username=%s\n' % user,
148
smtp_factory=factory)
146
conn = self.get_connection(
147
b'[DEFAULT]\nsmtp_username=%s\n' % user.encode('ascii'),
148
smtp_factory=factory)
149
149
self.assertEqual(user, conn._smtp_username)
150
150
self.assertIs(None, conn._smtp_password)
151
151
# Create a config file with the right password
152
152
conf = config.AuthenticationConfig()
153
153
conf._get_config().update({'smtptest':
154
{'scheme': 'smtp', 'user':user,
155
'password': password}})
154
{'scheme': 'smtp', 'user': user,
155
'password': password}})
159
159
self.assertEqual(password, conn._smtp_password)
161
161
def test_authenticate_with_byte_strings(self):
163
163
unicode_pass = u'h\xECspass'
164
164
utf8_pass = unicode_pass.encode('utf-8')
165
165
factory = WideOpenSMTPFactory()
166
166
conn = self.get_connection(
167
'[DEFAULT]\nsmtp_username=%s\nsmtp_password=%s\n'
167
b'[DEFAULT]\nsmtp_username=%s\nsmtp_password=%s\n'
168
168
% (user, utf8_pass), smtp_factory=factory)
169
169
self.assertEqual(unicode_pass, conn._smtp_password)
173
173
('has_extn', 'starttls'),
174
174
('login', user, utf8_pass)], factory._calls)
175
175
smtp_username, smtp_password = factory._calls[-1][1:]
176
self.assertIsInstance(smtp_username, str)
177
self.assertIsInstance(smtp_password, str)
176
self.assertIsInstance(smtp_username, bytes)
177
self.assertIsInstance(smtp_password, bytes)
179
179
def test_create_connection(self):
180
180
factory = StubSMTPFactory()
181
conn = self.get_connection('', smtp_factory=factory)
181
conn = self.get_connection(b'', smtp_factory=factory)
182
182
conn._create_connection()
183
183
self.assertEqual([('connect', 'localhost'),
187
187
def test_create_connection_ehlo_fails(self):
188
188
# Check that we call HELO if EHLO failed.
189
189
factory = StubSMTPFactory(fail_on=['ehlo'])
190
conn = self.get_connection('', smtp_factory=factory)
190
conn = self.get_connection(b'', smtp_factory=factory)
191
191
conn._create_connection()
192
192
self.assertEqual([('connect', 'localhost'),
197
197
def test_create_connection_ehlo_helo_fails(self):
198
198
# Check that we raise an exception if both EHLO and HELO fail.
199
199
factory = StubSMTPFactory(fail_on=['ehlo', 'helo'])
200
conn = self.get_connection('', smtp_factory=factory)
200
conn = self.get_connection(b'', smtp_factory=factory)
201
201
self.assertRaises(smtp_connection.SMTPError, conn._create_connection)
202
202
self.assertEqual([('connect', 'localhost'),
207
207
# Check that STARTTLS plus a second EHLO are called if the
208
208
# server says it supports the feature.
209
209
factory = StubSMTPFactory(smtp_features=['starttls'])
210
conn = self.get_connection('', smtp_factory=factory)
210
conn = self.get_connection(b'', smtp_factory=factory)
211
211
conn._create_connection()
212
212
self.assertEqual([('connect', 'localhost'),
220
220
# support STARTTLS, but then fails when we try to activate it.
221
221
factory = StubSMTPFactory(fail_on=['starttls'],
222
222
smtp_features=['starttls'])
223
conn = self.get_connection('', smtp_factory=factory)
223
conn = self.get_connection(b'', smtp_factory=factory)
224
224
self.assertRaises(smtp_connection.SMTPError, conn._create_connection)
225
225
self.assertEqual([('connect', 'localhost'),
242
242
from_, to = smtp_connection.SMTPConnection.get_message_addresses(msg)
243
243
self.assertEqual('jrandom@example.com', from_)
244
244
self.assertEqual(sorted(['john@doe.com', 'jane@doe.com',
245
'pperez@ejemplo.com', 'user@localhost']), sorted(to))
245
'pperez@ejemplo.com', 'user@localhost']), sorted(to))
247
247
# now with breezy's EmailMessage
248
248
msg = email_message.EmailMessage(
249
249
'"J. Random Developer" <jrandom@example.com>',
250
250
['John Doe <john@doe.com>', 'Jane Doe <jane@doe.com>',
251
u'Pepe P\xe9rez <pperez@ejemplo.com>', 'user@localhost' ],
251
u'Pepe P\xe9rez <pperez@ejemplo.com>', 'user@localhost'],
254
254
from_, to = smtp_connection.SMTPConnection.get_message_addresses(msg)
255
255
self.assertEqual('jrandom@example.com', from_)
256
256
self.assertEqual(sorted(['john@doe.com', 'jane@doe.com',
257
'pperez@ejemplo.com', 'user@localhost']), sorted(to))
257
'pperez@ejemplo.com', 'user@localhost']), sorted(to))
259
259
def test_destination_address_required(self):
261
261
msg['From'] = '"J. Random Developer" <jrandom@example.com>'
262
262
self.assertRaises(
263
263
smtp_connection.NoDestinationAddress,
264
smtp_connection.SMTPConnection(config.MemoryStack("")
264
smtp_connection.SMTPConnection(config.MemoryStack(b"")
265
265
).send_email, msg)
267
267
msg = email_message.EmailMessage('from@from.com', '', 'subject')
268
268
self.assertRaises(
269
269
smtp_connection.NoDestinationAddress,
270
smtp_connection.SMTPConnection(config.MemoryStack("")
270
smtp_connection.SMTPConnection(config.MemoryStack(b"")
271
271
).send_email, msg)
273
273
msg = email_message.EmailMessage('from@from.com', [], 'subject')
274
274
self.assertRaises(
275
275
smtp_connection.NoDestinationAddress,
276
smtp_connection.SMTPConnection(config.MemoryStack("")
276
smtp_connection.SMTPConnection(config.MemoryStack(b"")
277
277
).send_email, msg)