1

Wir stellen manuell einen benutzerdefinierten Nachrichten-ID-Header ein, während Sie E-Mails mit Java MimeMessage senden. Das Nachrichten-ID-Format folgt dem RFC822-Standard. Beim Senden der E-Mail über die Google Mail-API wird der Kopf der Nachrichten-ID jedoch durch einen neuen aus Gmail überschrieben.Gmail-API überschreibt den benutzerdefinierten Nachrichten-ID-Header beim Senden von E-Mails

Wenn wir also Java Mail senden und die E-Mail über SMTP senden, wird die benutzerdefinierte Nachrichten-ID von Google Mail beibehalten.

Gibt es eine Möglichkeit, beim Senden von E-Mails über die Google Mail-API eine benutzerdefinierte Nachrichten-ID zu erhalten?

Ich habe die folgende Frage überprüft, aber ich bin mir nicht sicher, ob es immer noch der Fall ist. (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 
    } 



} 

Auf GmailApiService.sendGmailService Aufruf wie folgt (mit Message-ID: "< 1495728783999,123 .456.local @ examplegmail.com> "), in der gesendeten E-Mail wird die Nachrichten-ID von GMail mit etwas wie" 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

Fragen zur Fehlersuche ("Warum funktioniert dieser Code nicht?") Müssen das gewünschte Verhalten, ein bestimmtes Problem oder einen Fehler und den kürzesten Code enthalten, der für die Reproduktion in der Frage erforderlich ist. Fragen ohne eine klare Problemstellung sind für andere Leser nicht nützlich. Siehe: Erstellen eines minimalen, vollständigen und überprüfbaren Beispiels. – DaImTo

+0

@DaImTo Danke, habe Code hinzugefügt, den ich benutze, um das Versenden der E-Mails zu testen, zusammen mit einem Beispiel –

Antwort

Verwandte Themen