E-mail com vários anexos usando Graph API (> 4 MB)
Oct 08 2020
Estou usando a API do Microsoft Graph versão 1.4 e tentando enviar e-mail com vários anexos (com tamanho maior que 4 MB) usando o seguinte código.
val address = EmailAddress()
address.address = "[email protected]"
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();
Em resposta, estou recebendo o seguinte erro ..
{
"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
}
Alguém pode me ajudar a enviar um e-mail com vários anexos com tamanho superior a 4 MB.
obrigado
Respostas
2 baywet Oct 08 2020 at 13:07
Para adicionar vários anexos de uma vez quando seu tamanho total ultrapassar 4 MB, você precisa:
- criar a mensagem (como um rascunho)
- crie o anexo com uma sessão de upload
- carregue o anexo usando a sessão que você acabou de criar (repita para cada anexo)
- enviar o e-mail de rascunho
Aqui está um exemplo de código que faz algo nesse sentido
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();
Aqui está um exemplo de implementação para o retorno de chamada.
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
}
};
O que significa um erro “Não é possível encontrar o símbolo” ou “Não é possível resolver o símbolo”?
George Harrison ficou chateado por suas letras de 'Hurdy Gurdy Man' de Donovan não terem sido usadas