Skip to content

Commit 61632ae

Browse files
Merge pull request #14 from loadsmart/useReplyTo
Add support to replying messages using reply-to header
2 parents 036d991 + 1486792 commit 61632ae

File tree

3 files changed

+56
-31
lines changed

3 files changed

+56
-31
lines changed

gmail_wrapper/entities.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,10 @@ def subject(self):
8585
def from_address(self):
8686
return self.headers.get("From")
8787

88+
@property
89+
def reply_to(self):
90+
return self.headers.get("Reply-To")
91+
8892
@property
8993
def message_id(self):
9094
"""
@@ -130,11 +134,13 @@ def modify(self, add_labels=None, remove_labels=None):
130134
self.id, add_labels=add_labels, remove_labels=remove_labels
131135
)
132136

133-
def reply(self, html_content):
137+
def reply(self, html_content, use_reply_to=True):
138+
to = self.reply_to if (self.reply_to and use_reply_to) else self.from_address
139+
134140
return self._client.send(
135141
subject=f"Re:{self.subject}",
136142
html_content=html_content,
137-
to=self.from_address,
143+
to=to,
138144
references=[self.message_id],
139145
in_reply_to=[self.message_id],
140146
thread_id=self.thread_id,

tests/test_client.py

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -291,32 +291,3 @@ def test_it_returns_the_sent_message(self, client, mocker, raw_complete_message)
291291
)
292292
assert isinstance(sent_message, Message)
293293
assert sent_message.id == raw_complete_message["id"]
294-
295-
296-
class TestReply:
297-
def test_it_returns_the_sent_message(self, client, mocker, raw_complete_message):
298-
message_to_reply = Message(client, raw_complete_message)
299-
expected_message_to_be_sent = {"id": "114ADC", "internalDate": "1566398665"}
300-
mocked_send_raw_message = mocker.patch(
301-
"gmail_wrapper.client.GmailClient.send_raw",
302-
return_value=expected_message_to_be_sent,
303-
)
304-
sent_message = message_to_reply.reply(
305-
"The quick brown fox jumps over the lazy dog"
306-
)
307-
mocked_send_raw_message.assert_called_once_with(
308-
"Re:Urgent errand",
309-
"The quick brown fox jumps over the lazy dog",
310-
311-
None,
312-
None,
313-
[
314-
"<BY5PR15MB353717D866FC27FEE4DB4EC7F77E0@BY5PR15MB3537.namprd15.prod.outlook.com>"
315-
],
316-
[
317-
"<BY5PR15MB353717D866FC27FEE4DB4EC7F77E0@BY5PR15MB3537.namprd15.prod.outlook.com>"
318-
],
319-
"AA121212",
320-
)
321-
assert isinstance(sent_message, Message)
322-
assert sent_message.id == expected_message_to_be_sent["id"]

tests/test_entities.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,14 @@ def test_it_archives_a_message(self, mocker, client, raw_complete_message):
117117
raw_complete_message["id"], add_labels=None, remove_labels=["INBOX"]
118118
)
119119

120+
def test_reply_to_property(self, client, raw_complete_message):
121+
message = Message(client, raw_complete_message)
122+
assert message.reply_to is None
123+
raw_complete_message["payload"]["headers"].append(
124+
{"name": "Reply-To", "value": "[email protected]"}
125+
)
126+
assert message.reply_to == "[email protected]"
127+
120128
def test_message_id_property(self, client, raw_complete_message):
121129
message = Message(client, raw_complete_message)
122130
assert (
@@ -131,6 +139,46 @@ def test_message_id_property(self, client, raw_complete_message):
131139
raw_complete_message["payload"]["headers"][3]["name"] = "Invalid"
132140
assert message.message_id is None
133141

142+
def test_reply(self, client, mocker, raw_complete_message):
143+
message = Message(client, raw_complete_message)
144+
expected_message_to_be_sent = {"id": "114ADC", "internalDate": "1566398665"}
145+
mocked_send_raw_message = mocker.patch(
146+
"gmail_wrapper.client.GmailClient.send_raw",
147+
return_value=expected_message_to_be_sent,
148+
)
149+
sent_message = message.reply("The quick brown fox jumps over the lazy dog")
150+
mocked_send_raw_message.assert_called_once_with(
151+
"Re:Urgent errand",
152+
"The quick brown fox jumps over the lazy dog",
153+
154+
None,
155+
None,
156+
[
157+
"<BY5PR15MB353717D866FC27FEE4DB4EC7F77E0@BY5PR15MB3537.namprd15.prod.outlook.com>"
158+
],
159+
[
160+
"<BY5PR15MB353717D866FC27FEE4DB4EC7F77E0@BY5PR15MB3537.namprd15.prod.outlook.com>"
161+
],
162+
"AA121212",
163+
)
164+
assert isinstance(sent_message, Message)
165+
assert sent_message.id == expected_message_to_be_sent["id"]
166+
167+
def test_reply_uses_reply_to_if_set(self, client, raw_complete_message, mocker):
168+
message = Message(client, raw_complete_message)
169+
mocked_send_raw_message = mocker.patch(
170+
"gmail_wrapper.client.GmailClient.send_raw"
171+
)
172+
message.reply("Any content")
173+
assert mocked_send_raw_message.call_args[0][2] == "[email protected]"
174+
raw_complete_message["payload"]["headers"].append(
175+
{"name": "Reply-To", "value": "[email protected]"}
176+
)
177+
message.reply("Any content, again")
178+
assert mocked_send_raw_message.call_args[0][2] == "[email protected]"
179+
message.reply("Any content, again and again", use_reply_to=False)
180+
assert mocked_send_raw_message.call_args[0][2] == "[email protected]"
181+
134182

135183
class TestAttachment:
136184
def test_it_has_basic_properties_without_additional_fetch(

0 commit comments

Comments
 (0)