官方文档没有提供任何SDK(包括Java SDK)的示例:https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=java#example-4-send-a-new-message-using-mime-format。由于没有示例,我徒劳地尝试使用SDK (microsoft-graph 5.0.0
)发送MIME内容:
Message sending = new Message();
ItemBody body = new ItemBody();
final String mimeMessageRFC822 = input.getMimeMessageRFC822();
body.content = Base64.getMimeEncoder().encodeToString(mimeMessageRFC822.getBytes());
sending.body = body;
GraphServiceClient service = getService(acHost, configuration);
service
.me()
.sendMail(UserSendMailParameterSet.newBuilder().withMessage(sending).withSaveToSentItems(true).build())
.buildRequest(new HeaderOption("Content-Type", "text/plain"))
.post();
上面的代码将请求的content-type
设置为text/plain
,但是正在发送的请求体是JSON(下面的xxxxxx
是一个有效的Base64编码的MIME内容字符串的占位符)。
{
"message":
{
"body":
{
"content": xxxxxx
}
},
"saveToSentItems": true
}
响应是404,声明:
GraphServiceException: Error code: ErrorMimeContentInvalidBase64String错误消息:MIME内容的base64字符串无效。
我可以理解为什么它响应这个错误,因为图形端点正在解析文本/纯文本内容为base64编码的MIME,而是找到JSON结构。我一直在与Microsoft Graph支持代理进行视频通话,他们已经看到我的MIME内容是有效的。遗憾的是,他们不能帮助微软图形Java SDK,即使它是由微软开发的!
这表明我们根本不应该使用Java SDK来发送MIME格式的电子邮件。这是正确的吗?当然不可能,否则一个库可以接收MIME格式的电子邮件,但不能发送它们,这有什么意义呢?有人有解决办法吗?
至少目前的解决方案是发送带有MIME内容的CustomRequest,而不是使用Graph客户端提供的流畅API。
final String encodedContent = Base64.getMimeEncoder().encodeToString(mimeMessageRFC822.getBytes());
CustomRequest<String> request = new CustomRequest<>(requestUrl, service, List.of(new HeaderOption("Content-Type", "text/plain")), String.class);
request.post(encodedContent);