Skip to content

Commit 4ba5dae

Browse files
author
lecovi
authored
Fix/issue 322 (#324)
* fix: issue #317 * fix: issue #318 * fix: issue #319 * fix: issue #320 * fix: updates Python email API at send_mail.py example * fix: updates Python email API at create_draft.py example * fix: updates Python email API at send_message_with_attachment.py example * fix: updates Python email API at create_draft_with_attachment.py example
1 parent 94a976e commit 4ba5dae

4 files changed

Lines changed: 59 additions & 64 deletions

File tree

gmail/snippet/send mail/create_draft.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from __future__ import print_function
2020

2121
import base64
22-
from email.mime.text import MIMEText
22+
from email.message import EmailMessage
2323

2424
import google.auth
2525
from googleapiclient.discovery import build
@@ -41,16 +41,19 @@ def gmail_create_draft():
4141
# create gmail api client
4242
service = build('gmail', 'v1', credentials=creds)
4343

44-
message = MIMEText('This is automated draft mail')
44+
message = EmailMessage()
45+
46+
message.set_content('This is automated draft mail')
47+
4548
message['To'] = 'gduser1@workspacesamples.dev'
4649
message['From'] = 'gduser2@workspacesamples.dev'
4750
message['Subject'] = 'Automated draft'
51+
52+
# encoded message
4853
encoded_message = base64.urlsafe_b64encode(message.as_bytes()).decode()
4954

5055
create_message = {
51-
'message': {
5256
'raw': encoded_message
53-
}
5457
}
5558
# pylint: disable=E1101
5659
draft = service.users().drafts().create(userId="me",

gmail/snippet/send mail/create_draft_with_attachment.py

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
from email.mime.image import MIMEImage
2525
from email.mime.multipart import MIMEMultipart
2626
from email.mime.text import MIMEText
27+
from email.message import EmailMessage
2728

2829
import google.auth
2930
from googleapiclient.discovery import build
@@ -44,21 +45,33 @@ def gmail_create_draft_with_attachment():
4445
try:
4546
# create gmail api client
4647
service = build('gmail', 'v1', credentials=creds)
47-
mime_message = MIMEMultipart()
48+
mime_message = EmailMessage()
49+
50+
# headers
4851
mime_message['To'] = 'gduser1@workspacesamples.dev'
4952
mime_message['From'] = 'gduser2@workspacesamples.dev'
5053
mime_message['Subject'] = 'sample with attachment'
51-
text_part = MIMEText('Hi, this is automated mail with attachment.'
52-
'Please do not reply.')
53-
mime_message.attach(text_part)
54-
image_attachment = build_file_part(file='photo.jpg')
55-
mime_message.attach(image_attachment)
54+
55+
# text
56+
mime_message.set_content(
57+
'Hi, this is automated mail with attachment.'
58+
'Please do not reply.'
59+
)
60+
61+
# attachment
62+
attachment_filename = 'photo.jpg'
63+
# guessing the MIME type
64+
type_subtype, _ = mimetypes.guess_type(attachment_filename)
65+
maintype, subtype = type_subtype.split('/')
66+
67+
with open(attachment_filename, 'rb') as fp:
68+
attachment_data = fp.read()
69+
mime_message.add_attachment(attachment_data, maintype, subtype)
70+
5671
encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()).decode()
5772

5873
create_draft_request_body = {
59-
'message': {
60-
'raw': encoded_message
61-
}
74+
'raw': encoded_message
6275
}
6376
# pylint: disable=E1101
6477
draft = service.users().drafts().create(userId="me",

gmail/snippet/send mail/send_message.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
from __future__ import print_function
1616

1717
import base64
18-
from email.mime.text import MIMEText
18+
from email.message import EmailMessage
1919

2020
import google.auth
2121
from googleapiclient.discovery import build
@@ -35,19 +35,20 @@ def gmail_send_message():
3535

3636
try:
3737
service = build('gmail', 'v1', credentials=creds)
38-
message = MIMEText('This is automated draft mail')
38+
message = EmailMessage()
39+
40+
message.set_content('This is automated draft mail')
41+
3942
message['To'] = 'gduser1@workspacesamples.dev'
4043
message['From'] = 'gduser2@workspacesamples.dev'
4144
message['Subject'] = 'Automated draft'
45+
4246
# encoded message
4347
encoded_message = base64.urlsafe_b64encode(message.as_bytes()) \
4448
.decode()
4549

4650
create_message = {
47-
'message': {
48-
49-
'raw': encoded_message
50-
}
51+
'raw': encoded_message
5152
}
5253
# pylint: disable=E1101
5354
send_message = (service.users().messages().send

gmail/snippet/send mail/send_message_with_attachment.py

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@
1515

1616
import base64
1717
import mimetypes
18-
import os
19-
from email.mime.audio import MIMEAudio
20-
from email.mime.base import MIMEBase
21-
from email.mime.image import MIMEImage
22-
from email.mime.multipart import MIMEMultipart
23-
from email.mime.text import MIMEText
18+
from email.message import EmailMessage
2419

2520
import google.auth
2621
from googleapiclient.discovery import build
@@ -39,25 +34,37 @@ def gmail_send_message_with_attachment():
3934
creds, _ = google.auth.default()
4035

4136
try:
37+
# create gmail api client
4238
service = build('gmail', 'v1', credentials=creds)
43-
mime_message = MIMEMultipart()
39+
mime_message = EmailMessage()
40+
41+
# headers
4442
mime_message['to'] = 'gduser1@workspacesamples.dev'
4543
mime_message['from'] = 'gduser2@workspacesamples.dev'
4644
mime_message['subject'] = 'sample with attachment'
47-
text_part = MIMEText('Hi, this is automated mail with attachment.'
48-
'Please do not reply.')
49-
mime_message.attach(text_part)
50-
image_attachment = build_file_part(file='photo.jpg')
51-
mime_message.attach(image_attachment)
45+
46+
# text
47+
mime_message.set_content(
48+
'Hi, this is automated mail with attachment.'
49+
'Please do not reply.'
50+
)
51+
52+
# attachment
53+
attachment_filename = 'photo.jpg'
54+
# guessing the MIME type
55+
type_subtype, _ = mimetypes.guess_type(attachment_filename)
56+
maintype, subtype = type_subtype.split('/')
57+
58+
with open(attachment_filename, 'rb') as fp:
59+
attachment_data = fp.read()
60+
mime_message.add_attachment(attachment_data, maintype, subtype)
61+
5262
# encoded message
5363
encoded_message = base64.urlsafe_b64encode(mime_message.as_bytes()) \
5464
.decode()
5565

5666
send_message_request_body = {
57-
'message': {
58-
59-
'raw': encoded_message
60-
}
67+
'raw': encoded_message
6168
}
6269
# pylint: disable=E1101
6370
send_message = (service.users().messages().send
@@ -69,35 +76,6 @@ def gmail_send_message_with_attachment():
6976
return send_message
7077

7178

72-
def build_file_part(file):
73-
"""Creates a MIME part for a file.
74-
Args:
75-
file: The path to the file to be attached.
76-
Returns:
77-
A MIME part that can be attached to a message.
78-
"""
79-
content_type, encoding = mimetypes.guess_type(file)
80-
if content_type is None or encoding is not None:
81-
content_type = 'application/octet-stream'
82-
main_type, sub_type = content_type.split('/', 1)
83-
if main_type == 'text':
84-
with open(file, 'rb'):
85-
msg = MIMEText('r', _subtype=sub_type)
86-
elif main_type == 'image':
87-
with open(file, 'rb'):
88-
msg = MIMEImage('r', _subtype=sub_type)
89-
elif main_type == 'audio':
90-
with open(file, 'rb'):
91-
msg = MIMEAudio('r', _subtype=sub_type)
92-
else:
93-
with open(file, 'rb'):
94-
msg = MIMEBase(main_type, sub_type)
95-
msg.set_payload(file.read())
96-
filename = os.path.basename(file)
97-
msg.add_header('Content-Disposition', 'attachment', filename=filename)
98-
return msg
99-
100-
10179
if __name__ == '__main__':
10280
gmail_send_message_with_attachment()
10381
# [END gmail_send_message_with_attachment]

0 commit comments

Comments
 (0)