Microsoft graph api 使用Graph API发送包含多个附件的电子邮件(>;4 MB)

Microsoft graph api 使用Graph API发送包含多个附件的电子邮件(>;4 MB),microsoft-graph-api,microsoft-graph-mail,Microsoft Graph Api,Microsoft Graph Mail,我正在使用Microsoft Graph API 1.4版,并尝试使用以下代码发送包含多个附件(大小大于4MB)的邮件 val address = EmailAddress() address.address = "vivek@domain.com" val recipient = Recipient() recipient.emailAddress = address val message = MyMessage() message.subject = "Te

我正在使用Microsoft Graph API 1.4版,并尝试使用以下代码发送包含多个附件(大小大于4MB)的邮件

val address = EmailAddress()
address.address = "vivek@domain.com"
val recipient = Recipient()
recipient.emailAddress = address

val message = MyMessage()
message.subject = "Test E-Mail"
message.body = getItemBody()
message.toRecipients = Collections.singletonList(recipient)

val att = FileAttachment()
att.contentBytes = File("/home/user/file.pdf").readBytes()
att.contentType = "text/pdf"
att.name = "file.pdf"
att.oDataType = "#microsoft.graph.fileAttachment"

val att2 = FileAttachment()
att2.contentBytes = "hello there! from second file".toByteArray(StandardCharsets.UTF_8)
att2.contentType = "text/plain"
att2.name = "hi2.txt"
att2.oDataType = "#microsoft.graph.fileAttachment"

message.addAttachment(att)
message.addAttachment(att2)

graphClient.me()
.sendMail(message,false)
.buildRequest()
.post();
作为回应,我得到以下错误

{
    "status": "INTERNAL_SERVER_ERROR",
    "exception": "GraphServiceException",
    "message": "Error code: BadRequest\nError message: The maximum request length supported is 4MB.\n\nPOST https://graph.microsoft.com/v1.0/me/microsoft.graph.sendMail\nSdkVersion : graph-java-v1.4.0\nAuthorization : Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI[...]\n{\"message\":{\"attachments\":[{\"contentBytes\":\"JVBERi[...]\n\n413 : Request Entity Too Large\n[...]\n\n[Some information was truncated for brevity, enable debug logging for more details]",
    "existing": null,
    "errorData": null,
    "tenant": null
}
谁能帮我发送一封多附件的邮件,其大小大于4MB


谢谢

为了在总大小超过4MB时一次添加多个附件,您需要:

  • 创建消息(作为草稿)
  • 使用上载会话创建附件
  • 使用刚刚创建的会话上载附件(对每个附件重复)
  • 发送草稿电子邮件
  • 下面是一个代码示例,它可以按照这些思路进行操作

        String draftSubject = "Draft Test Message " + Double.toString(Math.random()*1000);
        User me = graphClient.me().buildRequest().get();
        Recipient r = new Recipient();
        EmailAddress address = new EmailAddress();
        address.address = me.mail;
        r.emailAddress = address;
        Message message = new Message();
        message.subject = draftSubject;
        ArrayList<Recipient> recipients = new ArrayList<Recipient>();
        recipients.add(r);
        message.toRecipients = recipients;
        message.isDraft = true;
        
        //Save the message as a draft
        Message newMessage = graphClient.me().messages().buildRequest().post(message);
    
        File file = new File("src/test/resources/largefile10M.blob");
    
        AttachmentItem attachmentItem = new AttachmentItem();
        attachmentItem.attachmentType = AttachmentType.FILE;
        attachmentItem.name = file.getName();
        attachmentItem.size = file.length();
        attachmentItem.contentType = "application/octet-stream";
    
        InputStream fileStream = OutlookTests.class.getClassLoader().getResourceAsStream("largefile10M.blob");
    
        long streamSize = attachmentItem.size;
    
        UploadSession uploadSession = graphClient.me()
                                    .messages(newMessage.id)
                                    .attachments()
                                    .createUploadSession(attachmentItem)
                                    .buildRequest()
                                    .post();
    
        ChunkedUploadProvider<AttachmentItem> chunkedUploadProvider = new ChunkedUploadProvider<>(uploadSession, testBase.graphClient, fileStream,
                streamSize, AttachmentItem.class);
        
        // Do the upload
        chunkedUploadProvider.upload(callback);
    
        //Send the drafted message
        graphClient.me().mailFolders("Drafts").messages(newMessage.id).send().buildRequest().post();
    
    String draftSubject=“Draft测试消息”+Double.toString(Math.random()*1000);
    User me=graphClient.me().buildRequest().get();
    收件人r=新收件人();
    EmailAddress=新的EmailAddress();
    address.address=me.mail;
    r、 emailAddress=地址;
    消息消息=新消息();
    message.subject=draftSubject;
    ArrayList recipients=新的ArrayList();
    收件人。添加(r);
    message.toRecipients=收件人;
    message.isDraft=true;
    //将邮件另存为草稿
    Message newMessage=graphClient.me().messages().buildRequest().post(Message);
    File File=新文件(“src/test/resources/largefile10M.blob”);
    AttachmentItem AttachmentItem=新的AttachmentItem();
    attachmentItem.attachmentType=attachmentType.FILE;
    attachmentItem.name=file.getName();
    attachmentItem.size=file.length();
    attachmentItem.contentType=“应用程序/八位字节流”;
    InputStream fileStream=OutlookTests.class.getClassLoader().getResourceAsStream(“largefile10M.blob”);
    long streamSize=attachmentItem.size;
    UploadSession UploadSession=graphClient.me()
    .messages(newMessage.id)
    .附件(
    .createUploadSession(附件项)
    .buildRequest()
    .post();
    ChunkedUploadProvider ChunkedUploadProvider=新的ChunkedUploadProvider(上传会话、testBase.graphClient、fileStream、,
    streamSize,AttachmentItem.class);
    //上传
    chunkedUploadProvider.upload(回调);
    //发送草拟的信息
    graphClient.me().mailFolders(“草稿”).messages(newMessage.id).send().buildRequest().post();
    
    下面是回调的示例实现

        IProgressCallback<AttachmentItem> callback = new IProgressCallback<AttachmentItem> () {
            @Override
            public void progress(final long current, final long max) {
                //Check progress
            }
            @Override
            public void success(final AttachmentItem result) {
                //Handle the successful response
            }
            
            @Override
            public void failure(final ClientException ex) {
                //Handle the failed upload
            }
        };
    
    IProgressCallback callback=新的IProgressCallback(){
    @凌驾
    公共无效进度(最终长电流、最终长最大值){
    //检查进度
    }
    @凌驾
    公共作废成功(最终附件项结果){
    //处理成功的响应
    }
    @凌驾
    公共无效失败(最终客户例外){
    //处理失败的上载
    }
    };
    
    为了执行给定的示例,我已将graph版本从1.4升级到2.3。现在你能告诉我chunkedUploadProvider.upload(回调)中的回调是什么吗?谢谢更新。现在,我尝试了与您提供的代码完全相同的代码。刚刚用我的blob文件更新了文件路径。邮件已成功发送和接收,但没有附件。我们遗漏了什么吗?我已经在failure函数中打印了异常日志。看起来是这样的。。com.microsoft.graph.core.ClientException:上载会话失败。com.microsoft.graph.requests.extensions.ChunkedUploadRequest.upload(ChunkedUploadRequest.java:115)com.microsoft.graph.concurrency.ChunkedUploadProvider.upload(ChunkedUploadProvider.java:186)com.microsoft.graph.concurrency.ChunkedUploadProvider.upload(ChunkedUploadProvider.java:214)当前有一种服务行为导致SDK失败。我们已经实施了修复,它将与我最近使用的2.3.1版的下一个版本2.3.1一起发布。但问题仍然是一样的。重新检查版本升级。我已刷新依赖项并验证应用程序是否使用2.3.1版本。它使用相同的2.3.1版本。