【问题标题】:Cant send email with itext pdf file attachment无法发送带有 itext pdf 文件附件的电子邮件
【发布时间】:2014-07-11 09:13:05
【问题描述】:

我制作了一个 jsp 程序,当提交表单时,会使用 itext 库创建一个 pdf,并以该 pdf 作为附件发送一封电子邮件,它会创建 pdf 但不附加文件,我当我摆脱多部分代码时,可以让它发送电子邮件并创建pdf而不附加它,但我不能让它同时做这两件事。

现在我已经尝试附加电子邮件根本不会发送的文件,但我猜这可能是因为找不到我想要附加的文件,因此没有像我在删除时相信的那样发送电子邮件所有用于附加文件的代码发送的电子邮件没有任何问题。以前有没有人遇到过这个问题,或者任何人都可以提供任何建议,因为我一直在寻找答案,我一直在一遍又一遍地找到相同的帖子,事情变得如此绝望,我已经超越了前 2 页谷歌搜索。

<%@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(); 
 %>

【问题讨论】:

    标签: jsp pdf itext jakarta-mail attachment


    【解决方案1】:

    您正在创建一个发送到浏览器的 PDF:

    PdfWriter.getInstance(document, response.getOutputStream());
    

    那么您抱怨此 PDF 未附加到邮件中。

    这……很奇怪。发送到ServletOutputStream 的字节可以被回收以将它们发送到邮件,这违反了基本逻辑。

    在您的邮件中,您尝试附加fileStr,这似乎只不过是带有文件名的String

    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());
    

    您还可以通过 PDF 获得byte[],如下所示:

    byte[] pdf = baos.toByteArray();
    

    您可以根据需要多次使用这些pdf,例如:将 PDF 作为附件添加到邮件中。

    补充说明: 我同意 san krish 的评论,即为此目的使用 JSP 并不理想。您应该改用 Servlet。我很惊讶您的 JSP 文件确实有效。我很惊讶您没有收到以下错误:

    java.lang.IllegalStateException: Already using output stream
    

    【讨论】:

      【解决方案2】:

      使用您提到的示例,一切正常。

      感谢下面是我为任何好奇如何做到这一点的人使用的代码,对不起,我再次使用了 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();
                  }
      
      %>
      

      感谢布鲁诺·洛瓦吉

      【讨论】:

        猜你喜欢
        • 2011-10-09
        • 1970-01-01
        • 2020-11-20
        • 2014-02-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多