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编码了两次......你能发布一个片段吗? 好吧,我刚刚在 Adobe 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 附件发送
Mailchimp 模板“发送到 Mandrill 选项”对于实际电子邮件已损坏