2015-12-18 1 views
4

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:

  1. multiples "utilisateurs"/comptes dans mon application Gmail pour les entreprises.
  2. 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(); 

} 
+0

Pourriez-vous montrer le code? Ce que vous dites devrait fonctionner. – Tholle

+0

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. –

+0

Désolé de ne pas vous revenir Lev. Je ne vois rien de mal. Heureusement, un pro peut entrer. :) – Tholle

Répondre

1

Après recherches, il semble que la seule option est de avoir plusieurs utilisateurs.

Le code que j'ai posté fonctionne en effet pour plusieurs utilisateurs, mais pas pour autre chose.

J'ai essayé plusieurs options, y compris les alias et les comptes de messagerie de groupe. J'obtiendrais des erreurs de "délégation refusée" ou de "subvention invalide".

J'ai essayé de contacter l'assistance technique et le service clientèle de Google for Business, mais ils ne prennent pas en charge l'API.

Il existe une bonne solution pour créer plusieurs utilisateurs sans passer par la validation téléphonique. Il vous suffit de spécifier ces utilisateurs en tant que "utilisateurs existants" lorsque vous vous connectez à Google For Business initialement, puis de les activer avant même de transférer le domaine.

Pour le compte que j'ai créé sans utilisateurs préexistants, j'ai dû demander la validation du téléphone à mes amis.

+0

Je pense que sendgrid est une meilleure solution, et elle est gratuite pour 12 000 emails par mois /. Aussi Amazon, et je suis sûr que beaucoup d'autres, offrent ce genre de service. –

+0

Merci @BenBrahim, j'ai déjà implémenté la solution gmail et je l'utilise depuis un moment. Je garderai SendGrid à l'esprit. Amazon était une excellente option, mais je me souviens de l'avoir regardé et de préférer gMail. –

0

Vous pouvez désormais envoyer des e-mails en utilisant des alias, à condition que ces alias soient définis pour l'utilisateur dont vous utilisez les informations de connexion.

Cela fonctionne pour Gmail uniquement pour les entreprises.

Configurer les alias d'adresse inexistante peut être difficile, donc un coup d'oeil à ce comment mettre en place un fourre-tout routage:

catchall-for-domain-aliases-in-gsuite-gmail