Mandrill / Java - 附件损坏

Posted

技术标签:

【中文标题】Mandrill / Java - 附件损坏【英文标题】:Mandrill / Java - Attached Files Corrupt 【发布时间】:2014-05-09 17:47:15 【问题描述】:

我试图使用 Mandrill Wrapper for Java 在电子邮件中附加文件。这是我处理附件文件的一段代码。

public byte[] attachmentContent(String filepath)

    Path path = Paths.get(filepath);
    byte[] data = null;
    try 
        data = Files.readAllBytes(path);
     catch (IOException e) 
        e.printStackTrace();
    
    return data;


    //adding attachment
    ArrayList<MandrillAttachment> attachedFiles = new ArrayList<MandrillAttachment>();
    //file 1
    String attType = "application/pdf";
    String attName = "Indian License.pdf";
    String attContent = Base64.encodeBase64URLSafeString(attachmentContent("C:\\LL Indian License.pdf"));
    System.out.println(attContent);
    //attach
    attachedFiles.add(new MandrillAttachment(attType, attName, attContent));
    message.setAttachments(attachedFiles);

但是,文件在发送过程中不断损坏。关于如何解决这个问题的任何想法?

【问题讨论】:

您如何知道文件已损坏?可以举个例子吗? 我使用的是 wokring pdf 文件(也就是说,我可以打开并阅读它)。但是,在我通过电子邮件发送后,使用我编写的代码,我无法打开 pdf 文件。当我尝试打开时,它说文件“已损坏” 是的,但它看起来怎么样?也许它用base64编码了两次......你能发布一个片段吗? 好吧,我刚刚在 Adob​​e Reader 上打开它并显示“打开此文档时出错。文件已损坏,无法修复” 然后在文本编辑器中打开它,比如记事本。 【参考方案1】:

(回答此问题可能为时已晚)使用 Base64 进行正确编码可避免此问题。我使用以下代码解决了这个问题。

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.codec.binary.Base64;

List<MessageContent> listofAttachments = new ArrayList<MessageContent>();
    MessageContent attachment = new MessageContent();
    attachment.setType("application/pdf");
    attachment.setName("Test.pdf");

    File file = new File("C:\\Users\\xxx\\PdfTesting\\Test.pdf");

    InputStream is = new FileInputStream(file);

    long length = file.length();
    if (length > Integer.MAX_VALUE) 
        // File is too large
    
    byte[] bytes = new byte[(int) length];

    int offset = 0;
    int numRead = 0;
    while (offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0) 
        offset += numRead;
    

    if (offset < bytes.length) 
        throw new IOException("Could not completely read file " + file.getName());
    

    is.close();
    byte[] encoded = Base64.encodeBase64(bytes);
    String encodedString = new String(encoded);
    attachment.setContent(encodedString);

【讨论】:

嗯,我无法解析 MessageContent 类。它从何而来?到处都找不到。 MessageContent 是 Mandrill 库中的一个类。

以上是关于Mandrill / Java - 附件损坏的主要内容,如果未能解决你的问题,请参考以下文章

从远程 url 加载 pdf 以作为 Mandrill 附件发送

使用 mandrill 发送邮件时附件的文件大小限制

Mandrill 在测试模式下如何处理附件?

Mailchimp 模板“发送到 Mandrill 选项”对于实际电子邮件已损坏

将 Mandrill JSON webhook 入站电子邮件附件映射到 C# 类

在 iOS 中使用 Mandrill API 的电子邮件无法正常使用图像附件