質問編集履歴

1

コードの修正

2021/12/12 08:55

投稿

t-hiroki
t-hiroki

スコア1

test CHANGED
File without changes
test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
  def create_message(sender, to, subject, message_text,
44
44
 
45
- thread_id="xxxxxxxxxxxxxx", reply_to=None, past_message=None):
45
+ thread_id=None, reply_to=None, past_message=None):
46
46
 
47
47
  if past_message:
48
48
 
@@ -98,6 +98,22 @@
98
98
 
99
99
 
100
100
 
101
+ ### Thread IDを取得する
102
+
103
+ def get_thread_list(service, user_id, query):
104
+
105
+ return service.users().threads().list(userId=user_id, q=query).execute()
106
+
107
+
108
+
109
+ ### メッセージの中身を取得する
110
+
111
+ def get_thread(service, user_id, thread_id):
112
+
113
+ return service.users().threads().get(userId=user_id, id=thread_id).execute()
114
+
115
+
116
+
101
117
  def main():
102
118
 
103
119
  creds = None
@@ -134,15 +150,57 @@
134
150
 
135
151
  service = build('gmail','v1',credentials=creds)
136
152
 
153
+
154
+
155
+ ##### 一発目(threadが立っていない)のときにコメントアウト #####
156
+
157
+ query = 'in:sent' # 自分が送信したThreadを検索
158
+
159
+ thread_list = get_thread_list(service,'me',query) # jsonをdictionaryにdumpしたものが帰ってくる
160
+
161
+ thread_id = thread_list['threads'][0]['id']
162
+
163
+ print(thread_id) # 検索の最初のThreadのthreadIdが出力される
164
+
165
+ thread = get_thread(service,'me',thread_id)
166
+
167
+ latest_message = thread['messages'][-1]['payload'] # threadの一番最後のメッセージオブジェクトを取得
168
+
169
+ latest_msg_body = base64.urlsafe_b64decode(latest_message['body']['data']).decode() # base64形式なのでstringにdecodeする
170
+
171
+
172
+
173
+ ###ついでに、ここからReplyするメッセージIDをHeaderから取得しておく
174
+
175
+ for att in latest_message['headers']:
176
+
177
+ if att['name'] == 'Message-Id':
178
+
179
+ message_id = att['value']
180
+
181
+ break
182
+
183
+ ##### コメントアウトおわり ######
184
+
185
+
186
+
137
- sender = '*xxxxxxxxxxx@gmail.com'
187
+ sender = '******@******'
138
-
188
+
139
- to = 'xxxxxxxxxxxxxxx@gmail.com'
189
+ to = '######@######'
140
190
 
141
191
  subject = 'Gmail API test'
142
192
 
193
+ # message_text = 'This mail is sent via the Gmail API' # 1回目(reply_toとthread_idは定義しない)
194
+
143
- message_text = 'This mail is test for sending to the same thread'
195
+ message_text = 'This mail is test for sending to the same thread' # 2回目
196
+
144
-
197
+ # message_text = 'This mail is test for sending to the same thread (2nd)' #3回目
198
+
199
+
200
+
145
- message = create_message(sender, to, subject, message_text)
201
+ # message = create_message(sender, to, subject, message_text) # 一発目のみ
202
+
203
+ message = create_message(sender, to, subject, message_text, thread_id, message_id, latest_msg_body)
146
204
 
147
205
  send_message(service, 'me', message)
148
206
 
@@ -156,21 +214,11 @@
156
214
 
157
215
 
158
216
 
159
- こちらのリンクを参考にしてみたのですが、threadIdを指定する、エラーが返ってしまいます。
160
-
161
- ```
162
-
163
- $ python send_mail.py
164
-
165
- An error ocurred: <HttpError 404 when requesting https://gmail.googleapis.com/gmail/v1/users/me/messages/send?alt=json returned "Requested entity was not found.". Details: "[{'message': 'Requested entity was not found.', 'domain': 'global', 'reason': 'notFound'}]">
166
-
167
- ```
168
-
169
-
170
-
171
- 今回の目的『任意のメール内のスレッドIDに返信メールを送る』を達成するためには、どのようにしたらいいのでしょうか。
172
-
173
- 自分の書いたコードに不足している情報やエラーの解決方法などが分かる方がいたら教えていただきたいです。
217
+ こちらのリンクを参考にしてみたのですが、メッセージIDを指定して実行しても新着メール届いてしまいます。
218
+
219
+ メッセージIDで検索し、その中の最新のスレッドIDに返信をするには何か設定が足りないのでしょうか。
220
+
221
+ もしわかる方いたら教えてください。
174
222
 
175
223
 
176
224