java - 通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件

标签 java email gmail gmail-api

An answered question在 StackOverflow 上,建议将 html 标记添加到电子邮件正文中即可。该解决方案是否正确?

但是如果收件人的电子邮件服务器/客户端不支持 HTML 电子邮件怎么办?

例如使用 Apache commons email 时,我执行以下操作:

// set the html message
email.setHtmlMsg("<html>Our logo - <img src=\"cid:"+cid+"\"></html>");
// set the alternative message
email.setTextMsg("Your email client does not support HTML messages");

如果收件人电子邮件服务器/客户端不支持 HTML,有什么方法可以告诉 Gmail API 回退到哪封电子邮件?

附言 我对 Java 代码示例特别感兴趣。

谢谢

最佳答案

要提供两种选择,您可以将 Content-Type 设置为 mixed/alternative 而不是 text/plain文本/html:

如果我们想在 API explorer 中尝试这个,我们只是对邮件进行 Base64 编码,并通过将所有 / 替换为 _ 并将所有 + 替换为 - 使其成为 url 安全的

在开发者控制台中:

btoa(
  "Subject: Example Subject\r\n" +
  "From: <example@gmail.com>\r\n" +
  "To: <example@gmail.com>\r\n" +
  "Content-Type: multipart/alternative; boundary=\"foo_bar\"\r\n\r\n" +

  "--foo_bar\r\n" +
  "Content-Type: text/plain; charset=UTF-8\r\n\r\n" +

  "*Bold example message text*\r\n\r\n" +

  "--foo_bar\r\n" +
  "Content-Type: text/html; charset=UTF-8\r\n\r\n" +

  "<div dir=\"ltr\"><b>Bold example message text</b></div>\r\n\r\n" +

  "--foo_bar--" 
).replace(/\+/g, '-').replace(/\//g, '_');

POST https://www.googleapis.com/gmail/v1/users/me/messages/send?access_token={YOUR_API_KEY}

{
 "raw": "U3ViamVjdDogRXhhbXBsZSBTdWJqZWN0DQpGcm9tOiA8ZXhhbXBsZUBnbWFpbC5jb20-DQpUbzogPGV4YW1wbGVAZ21haWwuY29tPg0KQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7IGJvdW5kYXJ5PSJmb29fYmFyIg0KDQotLWZvb19iYXINCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOA0KDQoqQm9sZCBleGFtcGxlIG1lc3NhZ2UgdGV4dCoNCg0KLS1mb29fYmFyDQpDb250ZW50LVR5cGU6IHRleHQvaHRtbDsgY2hhcnNldD1VVEYtOA0KDQo8ZGl2IGRpcj0ibHRyIj48Yj5Cb2xkIGV4YW1wbGUgbWVzc2FnZSB0ZXh0PC9iPjwvZGl2Pg0KDQotLWZvb19iYXItLQ=="
}

要在 Java 中做同样的事情,你可以这样做:

Message message = new MimeMessage(session);
Multipart multiPart = new MimeMultipart("alternative");

MimeBodyPart textPart = new MimeBodyPart();
textPart.setText(text, "utf-8");

MimeBodyPart htmlPart = new MimeBodyPart();
htmlPart.setContent(html, "text/html; charset=utf-8");

multiPart.addBodyPart(textPart); 
multiPart.addBodyPart(htmlPart);
message.setContent(multiPart);

ByteArrayOutputStream output = new ByteArrayOutputStream();
message.writeTo(output);
String rawEmail = Base64.encodeBase64URLSafeString(output.toByteArray());

Message message = new Message();
message.setRaw(rawEmail);
message = service.users().messages().send(userId, message).execute();

关于java - 通过 Gmail API 发送带有纯文本回退的 HTML 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34165219/

相关文章:

java - 获取我手机中所有 Gmail 中的主要 Gmail ID

Android 可浏览 Intent 在 gmail 链接上失败,但适用于默认邮件客户端

java - 处理巨大的 JSON 响应

Windows 上的 JAVA IPC

java - Android Studio错误: java version not found

php - 你会如何在多语言 Laravel 应用程序中组织邮件

php - 我将如何组织数据以向用户发送许多电子邮件?

css - 在 gmail 电子邮件消息中将图像显示在另一个图像之上

Java,swing,面板和文本区域,不会改变颜色,可能引用错误

java - Hybris 自定义电子邮件设置自定义属性