Google api Gmail API在发送电子邮件时覆盖了自定义消息ID头

Google api Gmail API在发送电子邮件时覆盖了自定义消息ID头,google-api,gmail,jakarta-mail,gmail-api,google-api-java-client,Google Api,Gmail,Jakarta Mail,Gmail Api,Google Api Java Client,我们在使用Java MIMessage发送电子邮件时手动设置自定义消息ID头。消息ID格式遵循RFC822标准。然而,在通过Gmail API发送邮件时,邮件ID标题会被Gmail的新标题覆盖 相反,如果我们使用Java Mail并通过SMTP发送电子邮件,Gmail会保留自定义邮件ID 在通过Gmail API发送电子邮件时,有没有一种方法可以自定义邮件ID 我已经检查了以下问题,但我不确定是否仍然是这样。() [更新] EmailMimeMessage.scala package utils

我们在使用Java MIMessage发送电子邮件时手动设置自定义消息ID头。消息ID格式遵循RFC822标准。然而,在通过Gmail API发送邮件时,邮件ID标题会被Gmail的新标题覆盖

相反,如果我们使用Java Mail并通过SMTP发送电子邮件,Gmail会保留自定义邮件ID

在通过Gmail API发送电子邮件时,有没有一种方法可以自定义邮件ID

我已经检查了以下问题,但我不确定是否仍然是这样。()

[更新]

EmailMimeMessage.scala

package utils.email

import javax.mail._
import javax.mail.internet._

import play.api.Logger

class EmailMimeMessage(session: Session, messageId: String) extends MimeMessage(session) {

  @throws(classOf[MessagingException])
  override def updateMessageID(): Unit = {
    Logger.info(s"[EmailMimeMessage] before sending add message id: $messageId")
    setHeader("Message-ID", messageId)
  }

}
GmailApiService.scala

package utils.email

import java.io.ByteArrayOutputStream
import java.util.Properties
import javax.mail.Session
import javax.mail.internet.{InternetAddress, MimeMessage}

import com.google.api.client.auth.oauth2.{BearerToken, Credential}
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport
import com.google.api.client.http.HttpTransport
import com.google.api.client.json.JsonFactory
import com.google.api.client.json.jackson2.JacksonFactory
import com.google.api.client.repackaged.org.apache.commons.codec.binary.Base64
import com.google.api.services.gmail.Gmail

import scala.util.Try

case class EmailToBeSent(

  to_email: String,
  from_email: String,
  from_name: String,
  reply_to_email: String,
  subject: String,
  textBody: String,
  htmlBody: String,
  message_id: String    
)


object GmailApiService {

  private val APPLICATION_NAME: String = "Gmail API Java Quickstart"

  private val JSON_FACTORY: JsonFactory = JacksonFactory.getDefaultInstance

  private val HTTP_TRANSPORT: HttpTransport = GoogleNetHttpTransport.newTrustedTransport()


  def createEmail(emailToBeSent: EmailToBeSent): Try[MimeMessage] = Try {
    val props = new Properties()
    val session = Session.getDefaultInstance(props, null)
    val email = new EmailMimeMessage(session, emailToBeSent.message_id)

    email.setFrom(new InternetAddress(emailToBeSent.from_email))

    email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(emailToBeSent.to_email))

    email.setSubject(emailToBeSent.subject)

    email.setText(emailToBeSent.textBody)

    email
  }

  def createMessageWithEmail(email: MimeMessage) = Try {

    val baos = new ByteArrayOutputStream
    email.writeTo(baos)

    val encodedEmail = Base64.encodeBase64URLSafeString(baos.toByteArray)
    val message = new com.google.api.services.gmail.model.Message()

    message.setRaw(encodedEmail)

    message
  }

  def sendGmailService(emailToBeSent: EmailToBeSent, accessToken: String) = Try {

    val credential = new Credential(BearerToken.authorizationHeaderAccessMethod)
  .setAccessToken(accessToken)

    val service = new Gmail.Builder(HTTP_TRANSPORT, JSON_FACTORY, credential).setApplicationName(APPLICATION_NAME).build

    val user = "me"
    val message = createEmail(emailToBeSent) flatMap { email => createMessageWithEmail(email) }

    val sentMessage = service.users().messages().send(user, message.get).execute()

    sentMessage
  }



}
按如下方式调用GmailApiService.SendGmail服务时(邮件ID:),在发送的电子邮件中,邮件ID会被GMail覆盖,类似于“YYfdasCAN=-fdas432HFD43FD”_THD@mail.gmail.com“:

val emailToBeSent=emailToBeSent(
发送电子邮件给玛丽_to@gmail.com",
from_email=“john_from@examplegmail.com",
来自_name=“John Doe”,
回复电子邮件=“john”_from@gmail.com",
主题=“你好吗?”,
textBody=“嘿,你好吗?”,
htmlBody=“嘿,你好吗?”,
消息_id=“”,
在_reply _to _id=None中,
发件人\电子邮件\设置\ id=0
)
val sentMsg=GmailApiService.sendGmailService(emailToBeSent,GOOGLE\u OAUTH\u ACCESS\u TOKEN)。获取

我2014年的答案仍然正确:


Gmail总是在发送电子邮件时设置RFC822消息Id标题。

我2014年的回答仍然正确:


Gmail总是在发送的电子邮件上设置RFC822消息Id标题。

寻求调试帮助的问题(“此代码为什么不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现该问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小的、完整的、可验证的示例。@DaImTo Thank you,添加了我用来测试发送电子邮件的代码,以及一个示例Questions Seek debugging help(“此代码为什么不工作?”)必须包含所需的行为,一个特定的问题或错误,以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建一个最小的、完整的和可验证的示例。@DaImTo感谢您,添加了我用来测试发送电子邮件的代码,以及一个示例
val emailToBeSent = EmailToBeSent(
  to_email = "mary_to@gmail.com",
  from_email = "john_from@examplegmail.com",
  from_name = "John Doe",
  reply_to_email = "john_from@gmail.com",
  subject = "How are you ?",
  textBody = "Hey, how are you ?",
  htmlBody = "<strong>Hey, how are you ?</strong>",
  message_id ="<1495728783999.123.456.local@examplegmail.com>",
  in_reply_to_id = None,
  sender_email_settings_id = 0
)

val sentMsg = GmailApiService.sendGmailService(emailToBeSent, GOOGLE_OAUTH_ACCESS_TOKEN).get