通过Gmail API发送包含纯文本后备的HTML电子邮件

StackOverflow上一个已回答的问题表明,在电子邮件正文中添加html-markup就可以了。 这个解决方案是否正确

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

例如,当使用Apache commons电子邮件时 ,我会执行以下操作:

// set the html message email.setHtmlMsg("Our logo - "); // set the alternative message email.setTextMsg("Your email client does not support HTML messages"); 

如果收件人电子邮件服务器/客户端不支持HTML,有没有办法告诉Gmail API哪些电子邮件可以回复?

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

谢谢

要给出两个替代方案,您可以将Content-Type设置为mixed/alternative而不是text/plaintext/html

如果我们想在API资源管理器中尝试这一点,我们只需对邮件进行Base64编码,并通过将所有/_和全部+替换为-使其成为url-safe。

在开发者控制台中:

 btoa( "Subject: Example Subject\r\n" + "From: \r\n" + "To: \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" + "
Bold example message text
\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(); 

Throlle添加上述答案的更新。 上面和gmail api的更高版本可能存在一些差异

发送邮件并按照默认提供的标准发送标准电子邮件:

这是grails但你可以很容易地改变java,这个html的东西可以在这里找到控制器的东西。 也许当我完成我正在做的事情并获得机会将使用所有这些示例更新github网站:

在控制器中:

  def sendHTMLEmail() { String emailBox='me@gmail.com' String to ='someuser@domain.com' String html="
aabb

html content

" MimeMessage content = gmailService.createHTMLEmail(to,emailBox,'gmail test','testing gmail via app',html) def message = gmailService.sendMessage(gmail,'me',content) render "=== ${message.id}" }

在服务中:

 public static MimeMessage createHTMLEmail(String to, String from, String subject, String text, String html) { Properties props = new Properties() Session session = Session.getDefaultInstance(props, null) MimeMessage email = new MimeMessage(session) Multipart multiPart = new MimeMultipart("alternative") email.setFrom(new InternetAddress(from)) email.addRecipient(javax.mail.Message.RecipientType.TO, new InternetAddress(to)) email.setSubject(subject) 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) email.setContent(multiPart) return email } 

然后他们的标准提供了sendMessage(在github链接下面可以找到以下位):

 public static Message sendMessage(Gmail service,String userId,MimeMessage emailContent) throws MessagingException, IOException { try { Message message = createMessageWithEmail(emailContent) message = service.users().messages().send(userId, message).execute() return message } catch (Exception e) { //log.error "${e}" } } 

和createMessageWithEmail

 public static Message createMessageWithEmail(MimeMessage emailContent) throws MessagingException, IOException { ByteArrayOutputStream buffer = new ByteArrayOutputStream() emailContent.writeTo(buffer) byte[] bytes = buffer.toByteArray() String encodedEmail = Base64.encodeBase64URLSafeString(bytes) Message message = new Message() message.setRaw(encodedEmail) return message }