Skip to content

Commit 66b6587

Browse files
authored
Merge pull request #1079 from kundo/send-custom-headers
Add custom headers to email
2 parents 83bf62d + ae9b362 commit 66b6587

File tree

2 files changed

+67
-1
lines changed

2 files changed

+67
-1
lines changed

O365/message.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ def __init__(self, *, parent=None, con=None, **kwargs):
340340
self.web_link = cloud_data.get(cc('webLink'), '')
341341

342342
# Headers only retrieved when selecting 'internetMessageHeaders'
343-
self.message_headers = cloud_data.get(cc('internetMessageHeaders'), [])
343+
self.__message_headers = cloud_data.get(cc('internetMessageHeaders'), [])
344344

345345
def __str__(self):
346346
return self.__repr__()
@@ -622,6 +622,31 @@ def single_value_extended_properties(self):
622622
""" singleValueExtendedProperties """
623623
return self.__single_value_extended_properties
624624

625+
@property
626+
def message_headers(self):
627+
""" Custom message headers
628+
List of internetMessageHeaders, see definition: https://learn.microsoft.com/en-us/graph/api/resources/internetmessageheader?view=graph-rest-1.0
629+
:type: list[dict[str, str]]
630+
"""
631+
632+
return self.__message_headers
633+
634+
@message_headers.setter
635+
def message_headers(self, value):
636+
if not isinstance(value, list):
637+
raise ValueError('"message_header" must be a list')
638+
639+
self.__message_headers = value
640+
self._track_changes.add('message_headers')
641+
642+
def add_message_header(self, name, value):
643+
# Look if we already have the key. If we do, update it, otherwise write
644+
for header in self.__message_headers:
645+
if header["name"] == name:
646+
header["value"] = value
647+
return
648+
self.__message_headers.append({"name": name, "value": value})
649+
625650
def to_api_data(self, restrict_keys=None):
626651
""" Returns a dict representation of this message prepared to be sent
627652
to the cloud
@@ -686,6 +711,9 @@ def to_api_data(self, restrict_keys=None):
686711
# this property does not form part of the message itself
687712
message[cc('parentFolderId')] = self.folder_id
688713

714+
if self.message_headers:
715+
message[cc('internetMessageHeaders')] = self.message_headers
716+
689717
if restrict_keys:
690718
for key in list(message.keys()):
691719
if key not in restrict_keys:

tests/test_message.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,25 @@ def test_save_draft_with_with_large_attachment_when_object_id_is_set(self):
211211
assert msg.con.calls[2].payload == b"conte"
212212
assert msg.con.calls[3].payload == b"nt"
213213

214+
def test_save_draft_with_custom_header(self):
215+
msg = message()
216+
msg.subject = "Test"
217+
my_custom_header = [{"name": "x-my-custom-header", "value": "myHeaderValue"}]
218+
msg.message_headers = my_custom_header
219+
220+
assert msg.save_draft() is True
221+
[call] = msg.con.calls
222+
assert call.url == self.base_url + "me/mailFolders/Drafts/messages"
223+
assert call.payload == {
224+
"body": {"content": "", "contentType": "HTML"},
225+
"flag": {"flagStatus": "notFlagged"},
226+
"importance": "normal",
227+
"isDeliveryReceiptRequested": False,
228+
"isReadReceiptRequested": False,
229+
"subject": "Test",
230+
"internetMessageHeaders": my_custom_header,
231+
}
232+
214233
def test_save_message(self):
215234
msg = message(__cloud_data__={"id": "123", "isDraft": False})
216235
msg.subject = "Changed"
@@ -291,6 +310,25 @@ def test_send(self):
291310
"saveToSentItems": False,
292311
}
293312

313+
def test_send_with_headers(self):
314+
my_testheader = {"x-my-custom-header": "some_value"}
315+
msg = message(__cloud_data__={"internetMessageHeaders": [my_testheader]})
316+
assert msg.send(save_to_sent_folder=False)
317+
[call] = msg.con.calls
318+
assert call.url == self.base_url + "me/sendMail"
319+
assert call.payload == {
320+
"message": {
321+
"body": {"content": "", "contentType": "HTML"},
322+
"flag": {"flagStatus": "notFlagged"},
323+
"importance": "normal",
324+
"isDeliveryReceiptRequested": False,
325+
"isReadReceiptRequested": False,
326+
"subject": "",
327+
"internetMessageHeaders": [my_testheader],
328+
},
329+
"saveToSentItems": False,
330+
}
331+
294332
def test_send_existing_object(self):
295333
msg = message(__cloud_data__={"id": "123"})
296334
assert msg.send()

0 commit comments

Comments
 (0)