【问题标题】:Is there any way to send an email in the same thread?有没有办法在同一个线程中发送电子邮件?
【发布时间】:2020-03-07 09:23:24
【问题描述】:

我正在尝试将电子邮件发送到一个线程中,因此它看起来尽可能类似于通过 Gmail 网络用户界面发送。

根据 Gmail documentation,我在 Kotlin 上编写了下一个可以正常工作但不完全工作的代码

val DEFAULT_CHARSET: String = Charsets.UTF_8.name()

// get headers from original email
val messageId = originalMessage.payload.headers.find { it.name.equals("Message-ID", true) }?.value
val subject = originalMessage.payload.headers.find { it.name.equals("Subject", true) }?.value

// creating message
val message = MimeMessage(Session.getDefaultInstance(Properties()))

message.setFrom(InternetAddress(emailFrom, senderNameFrom, DEFAULT_CHARSET))
message.addRecipient(javax.mail.Message.RecipientType.TO, InternetAddress(emailTo))

message.setSubject(subject, DEFAULT_CHARSET)

// this headers are required accoring to [RFC 2822][1] standard
message.setHeader("In-Reply-To", messageId)
message.setHeader("References", messageId)
message.setHeader("Subject", "Re:$subject")

// creates message part
val messageBodyPart = MimeBodyPart()
messageBodyPart.setContent(content, "text/html; charset=UTF-8")

// creates multi-part
val multipart = MimeMultipart()
multipart.addBodyPart(messageBodyPart)


// sets the multi-part as e-mail's content
message.setContent(multipart)

val buffer = ByteArrayOutputStream()
emailMessage.writeTo(buffer)
val requestMessage = Message()
requestMessage.raw = Base64.encodeBase64URLSafeString(buffer.toByteArray())

// this thread ID you should collect from the original message
requestMessage.threadId = threadId

// from the result variable you can collect id, threadId, labels, etc.
val result = gmail.users().messages().send("me", requestMessage).execute()

因此,电子邮件发送到一个线程(收件箱看起来像这样),但没有隐藏先前邮件内容的三个点“显示修剪内容”:

有可能让它看起来像吗? 其他语言和库也适合我。

附:我也尝试将电子邮件作为 Gmail 草稿发送,但这也不起作用。

使用 java-libraries 完成测试:

  • javax.mail:mail:1.5.0-b01
  • com.sun.mail:javax.mail:1.6.2

【问题讨论】:

  • 哦,所以当你说“线程”时,你的意思不是java.lang.Thread
  • 请参阅Threading changes in Gmail conversation view 了解将消息串接在一起所需的条件。
  • 网上也有人说你要把回复References:字段设置为消息ID和In-Reply-To:
  • @Andreas 感谢这篇文章,现在我确定代码是正确的,但它仍然无法按我的意愿工作。 @markspace,谢谢,我又检查了一次,在当前示例中,message.setHeader("References", references ?: messageId) 引用总是等于 null 线程中的第二封电子邮件(第一次回复)
  • 试试这个库:github.com/mimecast/robin/blob/master/doc/client.md(披露:我是作者)

标签: java email gmail jakarta-mail gmail-api


【解决方案1】:

我知道这个帖子有点老了,但我在同样的问题中偶然发现并设法让它工作。

首先,您需要在 MimeMessage 对象中设置 Message-ID 标头,格式与 Gmail 期望的完全相同(“”,包括尖括号)。如果您没有将此标头设置为正确的格式,Gmail 将用新的值覆盖其值并将原始值存储在 X-Google-Original-Message-ID 标头中。

话虽如此,我还遇到了一个小问题,即 MimeMessage 类在发送消息时会覆盖 Message-ID 标头值,这需要我实现自己的扩展类,如 here 所述。

这就是我的 Java 实现的样子:

public class MyMessage extends MimeMessage {

    public MyMessage(Session session) { 
        super(session);
    }

    protected void updateMessageID() throws MessagingException {
        setHeader("Message-ID", "<exampleid-myemail@gmail.com>");
    }
}

【讨论】:

    猜你喜欢
    • 2013-10-19
    • 2021-06-12
    • 1970-01-01
    • 2017-03-24
    • 2021-11-28
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多