2017-06-26 80 views
1

我們在使用Java MimeMessage發送電子郵件時手動設置自定義Message-ID標頭。 Message-ID格式遵循RFC822標準。但是,在通過Gmail API發送郵件時,Message-ID頭將被gmail中的新郵件覆蓋。Gmail API在發送電子郵件時覆蓋自定義Message-ID標頭

相反,如果我們我們通過SMTP發送郵件並通過SMTP發送電子郵件,則自定義郵件ID將由Gmail保留。

有沒有辦法在通過Gmail API發送電子郵件時擁有自定義消息ID?

我檢查了以下問題,但我不確定它是否仍然如此。 (RFC822 Message-Id in new Gmail API

[UPDATE]

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.sendGmailService作爲(與Message-ID如下:「< 1495728783999.123 .456.local @ examplegmail.com>「),在發送的電子郵件中,Message-ID被GMail覆蓋,例如」YYfdasCA [email protected]「:

val emailToBeSent = EmailToBeSent(
    to_email = "[email protected]", 
    from_email = "[email protected]", 
    from_name = "John Doe", 
    reply_to_email = "[email protected]", 
    subject = "How are you ?", 
    textBody = "Hey, how are you ?", 
    htmlBody = "<strong>Hey, how are you ?</strong>", 
    message_id ="<[email protected]>", 
    in_reply_to_id = None, 
    sender_email_settings_id = 0 
) 

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

尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現問題所需的最短代碼。沒有明確問題陳述的問題對其他讀者無益。請參閱:如何創建最小,完整和可驗證示例。 – DaImTo

+0

@DaImTo謝謝您,添加了我用來測試發送電子郵件的代碼,以及一個示例 –

回答