Je souhaite envoyer un e-mail à mes clients en utilisant différents "rôles" (par exemple info @, support-client @, support-tech @, no-reply @).Gmail (pour les entreprises) API ne permet pas d'envoyer des e-mails à partir d'Alias?
J'ai essayé 2 approches:
- multiples "utilisateurs"/comptes dans mon application Gmail pour les entreprises.
- Compte unique gmail avec plusieurs alias.
J'ai commencé par configurer un compte de service avec une délégation globale pour mon application Gmail for Business.
Pour tester que cela fonctionne, j'ai mis en place 2 utilisateurs: [email protected] et [email protected] En effet, je peux envoyer avec succès des courriels de lev @ et de root @. Cependant, quand j'ai essayé d'ajouter 5 comptes utilisateur distincts pour mon application, Gmail est devenu paranoïaque des bots/abus et m'a demandé de prouver que tous les comptes sont "humains" y compris la configuration des mots de passe, la connexion et la validation du texte. par téléphone. En outre, ils exigent des téléphones différents pour différents comptes pour prouver que c'est une personne différente. La configuration des comptes devient donc un problème majeur. Je veux aussi éviter de créer plusieurs comptes puisque je paye pour chacun d'entre eux, et puisque sémantiquement, tous les rôles ne sont qu'un seul compte. Donc, les alias semblent être une meilleure idée.
Le problème est que quand je suis en train d'envoyer des e-mail et définir le champ « de » à l'alias (par exemple à partir de: [email protected]), je reçois l'exception suivante:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Delegation denied for [email protected]",
"reason" : "forbidden"
} ],
"message" : "Delegation denied for [email protected]"
}
Quelqu'un a-t-il été confronté et résolu ce problème?
Le code d'authentification/informations d'identification est la suivante:
/*
* Set up a hashmap HashMap<String, Gmail> gmailServiceByAccount where
* gmailServiceByAccount.get(emailAccount) contains an authorized Gmail service
*/
private void prepareService(String emailAccount) throws Exception {
if (gmailServiceByAccount.containsKey(emailAccount)) {
return;
}
HttpTransport httpTransport = GoogleNetHttpTransport.newTrustedTransport();
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.setServiceAccountId(Config.getInstance().getProperty(Config.gmail_service_account))
.setServiceAccountPrivateKeyFromP12File(new File(Config.getInstance().getPathToGmailCredential()))
.setServiceAccountScopes(Arrays.asList(GmailScopes.GMAIL_COMPOSE))
.setServiceAccountUser(emailAccount)
.build();
gmailServiceByAccount.put(
emailAccount,
new Gmail.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(Config.getInstance().getProperty(Config.google_client_api_application_name))
.build());
}
Et le code qui envoie l'e-mail est la suivante:
/**
* Send an email using the parameters provided.
*
* @param fromPersonalName : the free text description of the "from" address (e.g. "Customer Suppport" or "No Reply").
* @param fromAddress : the email address of the sender, the mailbox account (e.g. [email protected]).
* @param to : the email address of the recepient.
* @param subject : Subject of the email.
* @param htmlContent : (may be null) The HTML-styled body text of the email.
* @param plainTextContent : (may be null) The plain text body of the email (e.g if the customer email client does not support or disables html email).
*/
public void sendMail(String fromPersonalName, String fromAddress, String to, String subject, String htmlContent, String plainTextContent)
throws Exception {
prepareService(fromAddress);
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
MimeMessage email = new MimeMessage(session);
InternetAddress tAddress = new InternetAddress(to);
InternetAddress fAddress = new InternetAddress(fromAddress);
fAddress.setPersonal(fromPersonalName);
email.setFrom(fAddress);
email.addRecipient(javax.mail.Message.RecipientType.TO, tAddress);
email.setSubject(subject);
Multipart multiPart = new MimeMultipart("alternative");
if (!StringValidation.isEmpty(plainTextContent)) {
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent(plainTextContent, "text/plain");
textPart.setHeader("Content-Type", "text/plain; charset=\"UTF-8\"");
multiPart.addBodyPart(textPart);
}
if (!StringValidation.isEmpty(htmlContent)) {
MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(htmlContent, "text/html; charset=\"UTF-8\"");
multiPart.addBodyPart(htmlPart);
}
email.setContent(multiPart);
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
email.writeTo(bytes);
String encodedEmail = Base64.encodeBase64URLSafeString(bytes.toByteArray());
Message message = new Message();
message.setRaw(encodedEmail);
gmailServiceByAccount.get(fromAddress).users().messages().send(fromAddress, message).execute();
}
Pourriez-vous montrer le code? Ce que vous dites devrait fonctionner. – Tholle
Merci @Tholle, j'ai ajouté le code à mon corps de la question. C'est un peu impliqué, mais j'espère que c'est facile à lire. Laissez-moi savoir ce que vous pensez. –
Désolé de ne pas vous revenir Lev. Je ne vois rien de mal. Heureusement, un pro peut entrer. :) – Tholle