API Gmail (для бизнеса) не позволяет отправлять электронные письма от Alias?
Я хочу по электронной почте своим клиентам использовать разные "роли" (например, info@, support-support@, tech-support@, no-reply@).
Я пробовал 2 подхода:
- Несколько "пользователей"/ учетных записей в моем приложении Gmail для бизнеса.
- Одна учетная запись Gmail с несколькими псевдонимами.
Я начал с настройки служебной учетной записи с глобальным делегированием для своего приложения Gmail для бизнеса.
Чтобы проверить, что это работает, я настроил двух пользователей: lev@mydomain.com и root@mydomain.com. Действительно, я могу успешно отправлять электронную почту как от lev @, так и от root @.
Однако, когда я попытался добавить 5 отдельных учетных записей пользователей для своего приложения, Gmail стал параноидальным из-за ботов / злоупотреблений и попросил меня доказать, что все учетные записи являются "человеческими", включая настройку паролей, вход в систему и проверку SMS-текста по телефону. Более того, им нужны разные телефоны для разных аккаунтов, чтобы доказать, что это другой человек. Таким образом, настройка учетных записей становится серьезной проблемой.
Я также хочу избежать создания нескольких учетных записей, так как я плачу за каждую, и, с семантической точки зрения, все роли являются одной учетной записью. Так что псевдонимы кажутся лучшей идеей.
Проблема заключается в том, что когда я пытаюсь отправить электронное письмо и установить поле "from" для псевдонима (например, from:no-reply@mydomain.com), я получаю следующее исключение:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Delegation denied for root@mydomain.com",
"reason" : "forbidden"
} ],
"message" : "Delegation denied for root@mydomain.com"
}
Кто-нибудь сталкивался и решил эту проблему?
Код аутентификации / учетных данных выглядит следующим образом:
/*
* 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());
}
И код, который отправляет электронное письмо, выглядит следующим образом:
/**
* 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. customer-support@mydomain.com).
* @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();
}
3 ответа
Похоже, что после дополнительных исследований единственным вариантом является наличие нескольких пользователей.
Код, который я разместил, действительно работает для нескольких пользователей, но не для чего-либо еще.
Я пробовал несколько вариантов, включая псевдонимы и групповые учетные записи электронной почты. Я либо получаю ошибки "делегирование отклонено", либо "недействительное разрешение".
Я пытался связаться с клиентом и технической поддержкой Google для бизнеса, но они не поддерживают API.
Существует отличный обходной путь для создания нескольких пользователей без необходимости проверки телефона. Просто укажите этих пользователей как "существующих пользователей" при первоначальном входе в Google For Business и активируйте их еще до того, как вы перенесете домен.
Для учетной записи, которую я создал без ранее существующих пользователей, мне пришлось попросить телефоны моего друга для проверки телефона.
Теперь вы можете отправлять электронные письма, используя псевдонимы, если эти псевдонимы определены для пользователя, чьи учетные данные для входа вы используете.
Это работает для Gmail только для бизнеса.
Настройка псевдонимов для несуществующего адреса может быть сложной, поэтому посмотрите, как настроить универсальную маршрутизацию:
Просто в дополнение к сообщению Леди, теперь кажется, что это проще настроить. Создайте учетную запись псевдонима и настройте ее так, чтобы вы могли отправлять электронные письма ( https://support.google.com/domains/answer/9437157?hl=en&ref_topic=6293345) и установите в поле «от» в сообщении псевдоним (но все еще используйте "я" при вызове API)