|
28 | 28 | import com.flowcrypt.email.security.SecurityStorageConnector; |
29 | 29 | import com.google.api.client.util.Base64; |
30 | 30 | import com.google.api.services.gmail.Gmail; |
| 31 | +import com.google.api.services.gmail.model.ListMessagesResponse; |
31 | 32 | import com.sun.mail.imap.IMAPFolder; |
32 | 33 |
|
33 | 34 | import org.apache.commons.io.FileUtils; |
34 | 35 | import org.apache.commons.io.IOUtils; |
35 | 36 |
|
36 | 37 | import java.io.BufferedInputStream; |
| 38 | +import java.io.ByteArrayInputStream; |
37 | 39 | import java.io.ByteArrayOutputStream; |
38 | 40 | import java.io.File; |
39 | 41 | import java.io.IOException; |
40 | 42 | import java.io.InputStream; |
41 | 43 | import java.io.OutputStream; |
42 | 44 | import java.nio.charset.StandardCharsets; |
43 | 45 | import java.util.ArrayList; |
| 46 | +import java.util.List; |
44 | 47 |
|
45 | 48 | import javax.activation.DataHandler; |
46 | 49 | import javax.activation.DataSource; |
@@ -120,9 +123,18 @@ public void runSMTPAction(AccountDao accountDao, Session session, Store store, S |
120 | 123 | ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); |
121 | 124 | mimeMessage.writeTo(byteArrayOutputStream); |
122 | 125 |
|
| 126 | + MimeMessage originalMimeMessage = new MimeMessage(session, |
| 127 | + new ByteArrayInputStream(outgoingMessageInfo.getRawReplyMessage().getBytes())); |
| 128 | + |
| 129 | + String threadId = getGmailMessageThreadID(gmailApiService, originalMimeMessage.getMessageID()); |
123 | 130 | com.google.api.services.gmail.model.Message sentMessage |
124 | 131 | = new com.google.api.services.gmail.model.Message(); |
125 | 132 | sentMessage.setRaw(Base64.encodeBase64URLSafeString(byteArrayOutputStream.toByteArray())); |
| 133 | + |
| 134 | + if (!TextUtils.isEmpty(threadId)) { |
| 135 | + sentMessage.setThreadId(threadId); |
| 136 | + } |
| 137 | + |
126 | 138 | sentMessage = gmailApiService.users().messages().send("me", sentMessage).execute(); |
127 | 139 | isMessageSent = sentMessage.getId() != null; |
128 | 140 | } |
@@ -364,6 +376,26 @@ private String getAccountPublicKey(Context context, Js js, AccountDao accountDao |
364 | 376 | throw new IllegalArgumentException("The sender doesn't have a public key"); |
365 | 377 | } |
366 | 378 |
|
| 379 | + /** |
| 380 | + * Retrive a Gmail message thread id. |
| 381 | + * |
| 382 | + * @param service A {@link Gmail} reference. |
| 383 | + * @param rfc822msgidValue An rfc822 Message-Id value of the input message. |
| 384 | + * @return The input message thread id. |
| 385 | + * @throws IOException |
| 386 | + */ |
| 387 | + private String getGmailMessageThreadID(Gmail service, String rfc822msgidValue) throws IOException { |
| 388 | + ListMessagesResponse response = service.users().messages().list("me").setQ( |
| 389 | + "rfc822msgid:" + rfc822msgidValue).execute(); |
| 390 | + |
| 391 | + if (response.getMessages() != null && response.getMessages().size() == 1) { |
| 392 | + List<com.google.api.services.gmail.model.Message> messages = response.getMessages(); |
| 393 | + return messages.get(0).getThreadId(); |
| 394 | + } |
| 395 | + |
| 396 | + return null; |
| 397 | + } |
| 398 | + |
367 | 399 | /** |
368 | 400 | * The {@link DataSource} realization for a file which received from {@link Uri} |
369 | 401 | */ |
|
0 commit comments