我正在尝试发送带有附件的电子邮件。附件是在即时生成的,因此没有文件,我无法在文件系统上创建一个临时文件。
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立即将所有数据复制到字节阵列中。如果那是所有时间,您也许可以自己做得更有效地做到这一点。但是,如果所有时间都在发送方法中,则可能是您的邮件服务器很慢。