Jsp 无法发送带有itext pdf文件附件的电子邮件
我制作了一个jsp程序,当表单提交时,会使用itext库创建一个pdf,并将该pdf作为附件发送电子邮件,它会创建pdf,但不会附加文件,我可以让它发送电子邮件和创建pdf,而不附加它,当我摆脱了多部分代码,但我不能让它同时做这两件事 现在我已经尝试附加文件的电子邮件将不会发送,但我猜这可能是由于无法找到我想附加的文件,因此没有发送电子邮件,因为我相信当我删除所有代码附加文件的电子邮件发送没有任何问题。以前有没有人遇到过这个问题,或者有人能给我提些建议,因为我到处都在寻找答案,我不断地在同一篇文章中寻找答案,事情变得非常绝望,我已经超出了谷歌搜索的前两页Jsp 无法发送带有itext pdf文件附件的电子邮件,jsp,pdf,itext,jakarta-mail,attachment,Jsp,Pdf,Itext,Jakarta Mail,Attachment,我制作了一个jsp程序,当表单提交时,会使用itext库创建一个pdf,并将该pdf作为附件发送电子邮件,它会创建pdf,但不会附加文件,我可以让它发送电子邮件和创建pdf,而不附加它,当我摆脱了多部分代码,但我不能让它同时做这两件事 现在我已经尝试附加文件的电子邮件将不会发送,但我猜这可能是由于无法找到我想附加的文件,因此没有发送电子邮件,因为我相信当我删除所有代码附加文件的电子邮件发送没有任何问题。以前有没有人遇到过这个问题,或者有人能给我提些建议,因为我到处都在寻找答案,我不断地在同一篇文
<%@page import="javax.activation.DataHandler"%>
<%@page import="javax.activation.FileDataSource"%>
<%@page import="javax.mail.Multipart"%>
<%@page import="javax.mail.internet.MimeMultipart"%>
<%@page import="javax.mail.internet.MimeBodyPart"%>
<%@page import="javax.mail.Address"%>
<%@page import="com.sun.mail.smtp.SMTPTransport"%>
<%@page import="javax.mail.URLName"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="javax.mail.internet.MimeMessage"%>
<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.Session"%>
<%@ page import="java.io.*, com.itextpdf.text.*, com.itextpdf.text.pdf.*" %>
<%
String fileStr = request.getParameter("employeeid") + " Daily Briefing Sheet " + request.getParameter("date") + ".pdf";
response.setHeader("Content-Disposition", "attachment; filename=\"" + fileStr + "\"");
Document document=new Document();
PdfWriter.getInstance(document, response.getOutputStream());
document.open();
document.add(new Paragraph("Daily Briefing Sheet"));
// Employee Data the ID and the dates they entered
document.add(new Paragraph(request.getParameter("employeeid")));
document.add(new Paragraph(request.getParameter("date")));
document.add(new Paragraph(request.getParameter("date2")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Employee Overview of Yesterdays Performance"));
// The Overview of yesterday and today
document.add(new Paragraph(request.getParameter("overview")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Todays Work Plan"));
document.add(new Paragraph(request.getParameter("overviewtoday")));
document.add( Chunk.NEWLINE );
// Measures Table Data
document.add(new Paragraph("Daily Briefing Sheet"));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure1")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay1")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt1")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt1")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma1")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg1")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt1")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya1")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg1")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure2")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay2")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt2")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt2")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma2")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg2")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt2")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya2")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg2")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure3")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay3")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt3")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt3")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma3")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg3")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt3")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya3")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg3")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure4")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay4")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt4")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt4")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma4")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg4")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt4")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya4")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg4")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure5")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay5")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt5")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt5")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma5")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg5")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt5")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya5")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg5")));
// Narratives
document.add( Chunk.NEWLINE );
document.add(new Paragraph("What got left behind yesterday which needs to be rescheduled? When is it to be planned?"));
document.add(new Paragraph(request.getParameter("leftbehind")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any critical issues which need to be discussed or passed on?"));
document.add(new Paragraph(request.getParameter("criticalissues")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("What progress has been made on Projects/Tasks?"));
document.add(new Paragraph(request.getParameter("progress")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any improvement suggestions to be tabled or action sheets to be handed over?"));
document.add(new Paragraph(request.getParameter("improvements")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any quality matters which needs discussed or passed on?"));
document.add(new Paragraph(request.getParameter("qualitymatters")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any internal or external customer complaints which need to be discussed or handed over?"));
document.add(new Paragraph(request.getParameter("complaints")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Is there any information which needs to be shared or handed over?"));
document.add(new Paragraph(request.getParameter("information")));
document.add( Chunk.NEWLINE );
try{
Session mailSession = Session.getInstance(System.getProperties());
Transport transport = new SMTPTransport(mailSession,new URLName("smtp.gmail.com"));
transport = mailSession.getTransport("smtps");
transport.connect("smtp.gmail.com", 465 ,"foobar@gmail.com","mypass");
MimeMessage m = new MimeMessage(mailSession);
m.setFrom(new InternetAddress("foobar1@gmail.com"));
Address[] toAddr = new InternetAddress[] {
new InternetAddress("foobar2@gmail.com")
};
m.setRecipients(javax.mail.Message.RecipientType.TO, toAddr );
m.setHeader("Content-Type", "multipart/mixed");
m.setSubject("Performance Portal Figures");
m.setSentDate(new java.util.Date());
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("See attached");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
javax.activation.DataSource source = new FileDataSource(fileStr);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileStr);
multipart.addBodyPart(messageBodyPart);
m.setContent(multipart);
transport.sendMessage(m,m.getAllRecipients());
transport.close();
out.println("Thanks for sending mail!");
}
catch(Exception e){
out.println(e.getMessage());
e.printStackTrace();
}
document.close();
%>
您正在创建发送到浏览器的PDF:
PdfWriter.getInstance(document, response.getOutputStream());
然后您会抱怨此PDF未附加到邮件中
那是。。。奇怪的发送到ServletOutputStream
的字节可以重新处理以发送到邮件,这违反了基本逻辑
在您的邮件中,您尝试附加fileStr
,它似乎只是一个带有文件名的字符串:
String fileStr = request.getParameter("employeeid") + " Daily Briefing Sheet " + request.getParameter("date") + ".pdf";
如果要将PDF发送到浏览器并使用它将PDF附加到邮件,则需要在内存中创建PDF:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
完全创建PDF后,您可以将PDF发送到ServletOutputStream
,如下所示:
baos.writeTo(response.getOutputStream());
byte[] pdf = baos.toByteArray();
您还可以通过PDF获得字节[]
,如下所示:
baos.writeTo(response.getOutputStream());
byte[] pdf = baos.toByteArray();
您可以根据需要多次使用这些pdf
,例如:将pdf作为附件添加到邮件中
额外备注:我同意san krish的评论,即为此目的使用JSP是次优的。您应该改用Servlet。我很惊讶您的JSP文件居然可以工作。我很惊讶您没有得到以下错误:
java.lang.IllegalStateException: Already using output stream
使用你提到的例子,一切都很顺利
感谢下面的代码,这是我为好奇如何做的人使用的代码,很抱歉我再次使用jsp,但这个项目是一个非常紧迫的项目,我需要在优化它之前启动并运行它,因为对它的需求很高
<%@page import="javax.activation.DataSource"%>
<%@page import="javax.mail.util.ByteArrayDataSource"%>
<%@page import="javax.activation.DataHandler"%>
<%@page import="javax.activation.FileDataSource"%>
<%@page import="javax.mail.Multipart"%>
<%@page import="javax.mail.internet.MimeMultipart"%>
<%@page import="javax.mail.internet.MimeBodyPart"%>
<%@page import="javax.mail.Address"%>
<%@page import="com.sun.mail.smtp.SMTPTransport"%>
<%@page import="javax.mail.URLName"%>
<%@page import="javax.mail.internet.InternetAddress"%>
<%@page import="javax.mail.internet.MimeMessage"%>
<%@page import="javax.mail.Transport"%>
<%@page import="javax.mail.Session"%>
<%@ page import="java.io.*, com.itextpdf.text.*, com.itextpdf.text.pdf.*" %>
<%
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
// step 1
Document document = new Document();
// step 2
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfWriter.getInstance(document, baos);
// step 3
document.open();
// step 4
document.add(new Paragraph("Daily Briefing Sheet"));
// Employee Data the ID and the dates they entered
document.add(new Paragraph(request.getParameter("employeeid")));
document.add(new Paragraph(request.getParameter("date")));
document.add(new Paragraph(request.getParameter("date2")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Employee Overview of Yesterdays Performance"));
// The Overview of yesterday and today
document.add(new Paragraph(request.getParameter("overview")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Todays Work Plan"));
document.add(new Paragraph(request.getParameter("overviewtoday")));
document.add( Chunk.NEWLINE );
// Measures Table Data
document.add(new Paragraph("Daily Briefing Sheet"));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure1")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay1")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt1")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt1")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma1")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg1")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt1")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya1")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg1")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure2")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay2")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt2")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt2")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma2")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg2")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt2")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya2")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg2")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure3")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay3")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt3")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt3")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma3")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg3")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt3")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya3")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg3")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure4")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay4")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt4")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt4")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma4")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg4")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt4")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya4")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg4")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph(request.getParameter("measure5")));
document.add(new Paragraph("Achieved Yesterday: " + request.getParameter("ay5")));
document.add(new Paragraph("Plan Today: " + request.getParameter("pt5")));
document.add(new Paragraph("Monthly Target: " + request.getParameter("mmt5")));
document.add(new Paragraph("Monthly Achieved: " + request.getParameter("mma5")));
document.add(new Paragraph("Monthly Gap/Over: " + request.getParameter("mmg5")));
document.add(new Paragraph("Yearly Target: " + request.getParameter("myt5")));
document.add(new Paragraph("Yearly Achieved: " + request.getParameter("mya5")));
document.add(new Paragraph("Yearly Gap/Over: " + request.getParameter("myg5")));
// Narratives
document.add( Chunk.NEWLINE );
document.add(new Paragraph("What got left behind yesterday which needs to be rescheduled? When is it to be planned?"));
document.add(new Paragraph(request.getParameter("leftbehind")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any critical issues which need to be discussed or passed on?"));
document.add(new Paragraph(request.getParameter("criticalissues")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("What progress has been made on Projects/Tasks?"));
document.add(new Paragraph(request.getParameter("progress")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any improvement suggestions to be tabled or action sheets to be handed over?"));
document.add(new Paragraph(request.getParameter("improvements")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any quality matters which needs discussed or passed on?"));
document.add(new Paragraph(request.getParameter("qualitymatters")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Are there any internal or external customer complaints which need to be discussed or handed over?"));
document.add(new Paragraph(request.getParameter("complaints")));
document.add( Chunk.NEWLINE );
document.add(new Paragraph("Is there any information which needs to be shared or handed over?"));
document.add(new Paragraph(request.getParameter("information")));
document.add( Chunk.NEWLINE );
// step 5
document.close();
// setting some response headers
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
// setting the content type
response.setContentType("application/pdf");
// the contentlength
response.setContentLength(baos.size());
// write ByteArrayOutputStream to the ServletOutputStream
OutputStream os = response.getOutputStream();
baos.writeTo(os);
os.flush();
os.close();
try{
Session mailSession = Session.getInstance(System.getProperties());
Transport transport = new SMTPTransport(mailSession,new URLName("smtp.gmail.com"));
transport = mailSession.getTransport("smtps");
transport.connect("smtp.gmail.com", 465 ,"*******@gmail.com","*********");
MimeMessage m = new MimeMessage(mailSession);
m.setFrom(new InternetAddress("agilegroupforum@gmail.com"));
Address[] toAddr = new InternetAddress[] {
new InternetAddress("foobar@gmail.com")
};
m.setRecipients(javax.mail.Message.RecipientType.TO, toAddr );
m.setHeader("Content-Type", "multipart/mixed");
m.setSubject("Performance Portal Figures");
m.setSentDate(new java.util.Date());
MimeBodyPart messageBodyPart = new MimeBodyPart();
messageBodyPart.setText("See attached");
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(messageBodyPart);
messageBodyPart = new MimeBodyPart();
DataSource source = new ByteArrayDataSource(baos.toByteArray(), "application/pdf");
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName("test.pdf");
multipart.addBodyPart(messageBodyPart);
m.setContent(multipart);
transport.sendMessage(m,m.getAllRecipients());
transport.close();
out.println("Thanks for sending mail!");
}
catch(Exception e){
out.println(e.getMessage());
e.printStackTrace();
}
%>
感谢Bruno Lowagie首先,在jsp中使用java代码被认为是十多年来的一种糟糕做法。因此,将它们移动到servlet,在您的代码中,当您试图发送电子邮件时,pdf文件可能还没有准备好。我知道,但我没有使用servlet的经验。真的,我如何让servlet运行以及所有这些。除此之外,如果是这样的话,有没有办法解决这个问题呢?原因是servlet就是为了这个目的而设计的。你能确定当你试图将pdf作为附件发送时抛出的错误吗?我在netbeans中看到的一点错误都没有,这也是我来这里的另一个原因。我不确定错误是什么,我知道我可能做错了,但实际上我才刚刚开始使用这两个库,几乎没有接触过它,但是如果我在这里不尝试任何东西,我会被痛斥,所以我想我最好尝试一下,而不是放弃。然后如何实际设置数据源?另外,对于使用了次优技术,我深表歉意。我将采纳所有建议,以便在将来改进。我还发现,您提到的错误java.lang.IllegalStateException:getOutputStream()已被调用用于此响应。我刚刚仔细查看了日志,查看了IllegalStateException
,我很高兴世界上有确定的事情。如果你没有遇到这样的异常,我会非常惊讶的。关于编写用于创建PDF的Servlet,请从以下示例开始:一旦该示例生效,您就可以专注于发送邮件(这需要您从baos
获取byte[]
)。看起来您发布了您的Gmail密码。哎呀!