Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 14 additions & 10 deletions redmail/email/sender.py
Original file line number Diff line number Diff line change
Expand Up @@ -504,16 +504,20 @@ def close(self):

def get_server(self) -> smtplib.SMTP:
"Connect and get the SMTP Server"
user = self.username
password = self.password

server = self.cls_smtp(self.host, self.port, **self.kws_smtp)
if self.use_starttls:
server.starttls()

if user is not None or password is not None:
server.login(user, password)
return server
try:
user = self.username
password = self.password

server = self.cls_smtp(self.host, self.port, **self.kws_smtp)
if self.use_starttls:
server.starttls()

if user is not None or password is not None:
server.login(user, password)
return server
except smtplib.SMTPResponseException as e:
server.quit()
raise

@property
def is_alive(self):
Expand Down
41 changes: 40 additions & 1 deletion redmail/test/email/test_send.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,16 @@

from redmail import EmailSender, send_email

from smtplib import SMTPResponseException

class MockServer:

def __init__(self, host, port):
self.host = host
self.port = port
self.is_login = False

self.quit_was_called = False

def starttls(self):
return
Expand All @@ -24,6 +28,7 @@ def send_message(self, msg):
return

def quit(self):
self.quit_was_called = True
return

def test_send():
Expand Down Expand Up @@ -78,4 +83,38 @@ def test_send_multi():
def test_send_function():
# This should fail but we test everything else goes through
with pytest.raises(ConnectionRefusedError):
send_email(host="localhost", port=0, subject="An example")
send_email(host="localhost", port=0, subject="An example")


class MockServerWithStartTLSError(MockServer):

def starttls(self):
raise SMTPResponseException(500, "error")

def test_send_starttls_error():
server = MockServerWithStartTLSError(host="localhost", port=0)
email = EmailSender(host="localhost", port=0, cls_smtp=lambda *args, **kwargs: server)

with pytest.raises(SMTPResponseException):
msg = email.send(
subject="An example",
receivers=['me@example.com']
)
assert server.quit_was_called


class MockServerWithLoginError(MockServer):

def starttls(self):
raise SMTPResponseException(500, "error")

def test_send_login_error():
server = MockServerWithLoginError(host="localhost", port=0)
email = EmailSender(host="localhost", port=0, cls_smtp=lambda *args, **kwargs: server)

with pytest.raises(SMTPResponseException):
msg = email.send(
subject="An example",
receivers=['me@example.com']
)
assert server.quit_was_called