Javamail Inputstream附件永远需要



我正在尝试发送带有附件的电子邮件。附件是在即时生成的,因此没有文件,我无法在文件系统上创建一个临时文件。

InputStream attachment

我尝试直接使用Javamail和apache.commons.mail。两者都有相同的结果。浏览器停留为"等待Localhost",需要6分钟。我怀疑问题是邮件库真的不知道输入流有多大(或者他们不正确处理输入式),因此他们等到暂停,然后发送邮件。我已经对文件进行了测试(通过filedatasource等)进行了测试,但效果很好,但不能与InputStream ...

一起使用。

有没有任何方法可以使其正常工作而不让用户永远等待?另一方面,我不想让快速用户等待发送200kb电子邮件。

 // Create the email message
    MultiPartEmail email2 = new MultiPartEmail();
    email2.setHostName(host);
    email2.setAuthenticator(new DefaultAuthenticator(username, password));
    email2.setSSLOnConnect(true);
    email2.setFrom(username);
    email2.setSmtpPort( Integer.parseInt(port) );
    email2.addTo(to);
    email2.setSubject("MAIL");
    email2.setMsg("Text");
    DataSource source = new ByteArrayDataSource(attachment, "application/pdf");  
    // add the attachment
    email2.attach(source, "somefile.pdf", "Description of some file");
    email2.send();

此代码将正确发送邮件...但是在6分钟或更多后。

编辑

我在代码中放置了一些痕迹:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date date = new Date();
System.out.println("Start: " + dateFormat.format(date));
 // Create the email message
    MultiPartEmail email2 = new MultiPartEmail();
    email2.setHostName(host);
    email2.setAuthenticator(new DefaultAuthenticator(username, password));
    email2.setSSLOnConnect(true);
    email2.setFrom(username);
    email2.setSmtpPort( Integer.parseInt(port) );
    email2.addTo(emailTO);
    email2.setSubject("MAIL");
    email2.setMsg("Text");
date = new Date();
System.out.println("Before DataSource: " + dateFormat.format(date));
    DataSource source = new ByteArrayDataSource(attachment, "application/pdf");  
date = new Date();
System.out.println("After DataSource: " + dateFormat.format(date));
    // add the attachment
    email2.attach(source, "somefile.pdf", "Description of some file");
date = new Date();
System.out.println("Before send(): " + dateFormat.format(date));
    email2.send();
date = new Date();
System.out.println("After send(): " + dateFormat.format(date));

的结果是:

Start: 2014/02/24 16:18:01
Before DataSource: 2014/02/24 16:18:01
After DataSource: 2014/02/24 16:18:01
Before send(): 2014/02/24 16:18:01
Feb 24, 2014 4:18:01 PM org.apache.pdfbox.pdmodel.graphics.xobject.PDXObjectImage getColorSpace
INFO: About to return NULL from unhandled branch. filter = COSName{DCTDecode}
After send(): 2014/02/24 16:26:35

如果我评论email2.attach(...),我会得到:

Start: 2014/02/24 16:28:56
Before DataSource: 2014/02/24 16:28:56
After DataSource: 2014/02/24 16:28:56
Before send(): 2014/02/24 16:28:56
After send(): 2014/02/24 16:29:27

当然需要很长时间,但这是可以接受的....

现在,显然问题与附件有关。不过,我不确定我会收到pdfbox警告...

编辑2

我现在正在不附件进行测试,仅需5秒即可发送电子邮件...因此,它确实看起来与输入流的方式有关。

编辑3

我启用了调试,似乎时间是在附件中消耗的。我看到send()做什么并打印:

------=_Part_0_2141791733.1395266799862
Content-Type: application/pdf; name="my.pdf"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="my.pdf"
Content-Description: 
JVBERi0xLjQKJfbk/N8KMSAwIG9iago8PAovTWFya0luZm8gMiAwIFIKL01ldGFkYXRhIDMgMCBS

...然后send()在这样的块中略微打印附件内容:

MhKxjVRnwA6I8BisAX1VTXc0hw1DXO0lBcQJDQpWFZPU3oX2YogU3Y0SbgFxKBCJWzUEqfJIQ5Bh
GrYDx1o3JOIYHZPnVRZHa4EA0FqGxiZk6MdkEfYakPO4MW1jXIjeKFMxdL1XY84nrGDMwoyCkC3N
TJOAJITplbIewNEXv6u8AIf64hiZIm+x4jyFOxzk5DzfSONJiDiKbtozF+Yz+g90lJOCLiRFneuV
3AYDQAD1gnW+odwoSVBAUezLL5Zwue1yttDySw5zVsaE9j7kv9mHpOlnTephlZR5fiu/f+XEOb/O
qQ6suP2zOl/3KRw+OMiXC5hNGlAca7d2XWDMLIiQs45yUsCnljRLVdYFKz7Zg6zcsiH9kaupwOe4
ifPEiXe/8LEok2So8o3Bp5XysDadYxsllfVLlNdLXlQc+2R+kdFHam5ydBm5HkYl5ZCwF2vPKpvU

然后需要几秒钟..并打印了另一个大块。这个过程持续约6分钟。直到完成:

MjRDODdCODVGMEEyQjBBMzVDQj4gPEM5MjBBRjU5Q0MxOEM2NDI5MDM4REIzMEI2OUE0REQ5Pl0K
L1Jvb3QgMSAwIFIKL0luZm8gNyAwIFIKL1hSZWZTdG0gMTYxOAo+PgpzdGFydHhyZWYKNDEzNjI5
CiUlRU9GCg==
------=_Part_0_690515382.1395264718480--
.
250 OK id=4WQO3h-0004D1-VQ
QUIT
221 mail2.... closing connection

我想InputStream有问题。没有附件或从文件中获取附件,它可以正常工作。附件仅为〜0.4mb

也许有一种创建InputStream的方式。但是,这似乎很奇怪,因为我使用完全相同的方法下载PDF,并且下载效果很好。

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    pd.save(os);
    return new ByteArrayInputStream( os.toByteArray() );

到底哪个语句一直在花?它是在创建bytearraydatasource吗?还是发送方法?BytearrayDataSource立即将所有数据复制到字节阵列中。如果那是所有时间,您也许可以自己做得更有效地做到这一点。但是,如果所有时间都在发送方法中,则可能是您的邮件服务器很慢。

相关内容

  • 没有找到相关文章

最新更新