Send HTML email with plain text fallback via Gmail API

前端 未结 2 554
予麋鹿
予麋鹿 2021-01-12 14:24

An answered question at StackOverflow suggests that adding html-markup to the body of the email will do the trick. Is that solution correct?

But what if the recipien

2条回答
  •  北荒
    北荒 (楼主)
    2021-01-12 15:03

    To give two alternatives, you can set the Content-Type to mixed/alternative instead of either text/plain or text/html:

    If we want to try this out in the API explorer, we just Base64-encode the mail, and make it url-safe by replacing all / with _ and all + with -.

    In the Developer Console:

    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==" }

    To do the equivalent in Java, you could do:

    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();
    

提交回复
热议问题