0

我正在使用 Google OAuth 2.0 代表使用 Gmail 的用户发送电子邮件。它使用 SMTP 协议。这是我的代码:

            Properties props = new Properties();
            props.put("mail.smtp.starttls.enable", "true");
            props.put("mail.smtp.starttls.required", "true");
            props.put("mail.smtp.sasl.enable", "false");
            Session session = Session.getInstance(props);
            session.setDebug(false);

            final URLName unusedUrlName = null;
            SMTPTransport transport = new SMTPTransport(session, unusedUrlName);
            transport.connect("smtp.gmail.com", 587, fromAddress, null);

     byte[] response = String.format("user=%s\1auth=Bearer %s\1\1", lFrom, oauthToken).getBytes();
            response = BASE64EncoderStream.encode(response);

            transport.issueCommand("AUTH XOAUTH2 " + new String(response),
                    235);

            MimeMessage msg = new MimeMessage( session );

            msg.setFrom( new InternetAddress( fromAddress , fromName ) );
            msg.setRecipients( Message.RecipientType.TO , InternetAddress.parse( toAddress , false ) );

            msg.setSubject( emailSubject );
            MimeBodyPart htmlPart = new MimeBodyPart();
            Multipart multiPart = new MimeMultipart();

            htmlPart.setContent( "<html>email content</html>" , "text/html; charset=UTF-8" );
            multiPart.addBodyPart( htmlPart );
            msg.setContent( multiPart );
            msg.saveChanges();

            transport.sendMessage(msg, msg.getAllRecipients());

我们的软件托管在 Google App Engine 平台上。使用上述方法发送的电子邮件始终具有值为“base64”的 Content-Transfer-Encoding 标头。

使用 gmail.com 发送的普通电子邮件不是这样编码的。有办法吗?还是这是人们一直期望的?是否所有电子邮件服务提供商(包括私人服务器)都支持它?我对此知之甚少。谢谢。

4

1 回答 1

1

首先,您可以通过使用JavaMail 1.5.2内置的 OAuth2 支持来简化 OAuth2 的使用。

身份验证方法不会对 JavaMail 选择的 Content-Transfer-Encoding 产生任何影响;它完全基于消息的实际内容。如果您的内容包含大量非 ASCII 字符,它将使用 base64。

于 2014-12-08T20:41:17.207 回答