1

Nous définissons manuellement un en-tête Message-ID personnalisé lors de l'envoi d'e-mails à l'aide de Java MimeMessage. Le format Message-ID suit la norme RFC822. Toutefois, lors de l'envoi du courrier via l'API Gmail, l'en-tête Message-ID est remplacé par un nouveau de Gmail. A la place, si nous recevons Java Mail et envoyons l'e-mail via SMTP, l'ID de message personnalisé est conservé par Gmail.L'API Gmail remplace l'en-tête Message-ID personnalisé lors de l'envoi d'e-mails

Existe-t-il un moyen d'avoir un message-ID personnalisé lors de l'envoi d'e-mails via l'API Gmail?

J'ai vérifié la question suivante, mais je ne suis pas sûr si c'est toujours le cas. (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 
    } 



} 

En appelant GmailApiService.sendGmailService comme suit (Message-ID: "< 1.495.728.783.999,123 .456.local @ examplegmail.com> "), dans l'e-mail envoyé, le message-ID est remplacé par GMail avec quelque chose comme" 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

Les questions qui cherchent une aide au débogage («pourquoi ce code ne fonctionne-t-il pas?») Doivent inclure le comportement souhaité, un problème ou une erreur spécifique et le code le plus court nécessaire pour le reproduire dans la question. Les questions sans énoncé de problème clair ne sont pas utiles aux autres lecteurs. Voir: Comment créer un exemple minimal, complet et vérifiable. – DaImTo

+0

@DaImTo Merci, ajout du code que j'utilise pour tester l'envoi des emails, avec un exemple –

Répondre