实现javaEmail邮件发送功能并带有生成的pdf附件

来源:互联网 发布:淘宝会员名怎么取不了 编辑:程序博客网 时间:2024/06/05 10:37

      上一篇博文是生成pdf文档, 这篇文档跟大家分享一下怎么发送邮件,并且实现pdf作为附件的功能。

     javaEmail的maven形式的jar包:

<dependency>    <groupId>javax.mail</groupId>    <artifactId>mail</artifactId>    <version>1.4</version></dependency>

首先是实现邮件发送功能的代码:

 

public void sendEmailAndPDF(SendEmailAndPDFReuqest sendEmailAndPDFReuqest, String fileLocalName) throws Exception {logger.error("sendEmailAndPDF is keep on.....and fileLocalName is "+fileLocalName+"request is "+JsonUtils.objectToJson(sendEmailAndPDFReuqest));EmailMessage emailMessage = new EmailMessage();StringBuffer sb = new StringBuffer();String orderNo = sendEmailAndPDFReuqest.getResp().getMainOrderNo();sb.append(orderNo);emailMessage.setSubject(String.format("订单号:%s预订确认", sb)); //邮箱标题emailMessage.setContext(sendOrderDeatilAndPDFContext.buildContext(sendEmailAndPDFReuqest));//邮箱正文,我这个正文很简单,就不上代码了,就是一些html标签+文字描述emailMessage.setBodyHtml(true);Vector<String> file = new Vector<String>();//保存多个需上传附件的文件名file.add(fileLocalName);emailMessage.setFile(file);emailProvider.sendEmailAndPDF(emailMessage, sendEmailAndPDFReuqest.getResp().getSupplier(),sendEmailAndPDFReuqest.getProviderEmail());}email.setEmailReceiver(); //设置邮箱接收者sendEmail(email);      //下面是主要的发送代码:private String host = "smtp.****.com.cn"; //这是smtp协议的邮箱服务器主机,每个公司都不一样 private int port = 27; private String auth = "true";private String userName = "frank.***@****.com"; //公司哟向服务器主机的账号private String password = ""; //密码private String sendMailAddress = "****"; //发送的邮件名,一般的用公司名义去申请的邮箱    Logger logger = LoggerFactory.getLogger(this.getClass());public void sendEmail(EmailMessage email) throws Exception{logger.error("createSendEmail is starting........email is "+JsonUtils.objectToJson(email));System.setProperty("mail.mime.charset","UTF-8");Properties props = new Properties();    props.put("mail.smtp.host", host);    props.put("mail.smtp.port", port);    props.put("mail.smtp.auth", auth);    Session s = Session.getInstance(props);    MimeMessage message = new MimeMessage(s);    InternetAddress from = new InternetAddress(sendMailAddress);    message.setFrom(from);    message.addRecipients(Message.RecipientType.TO, email.getAddress());//邮箱接收者    message.setSubject(email.getSubject());    message.setSentDate(new Date());    Multipart mp = new MimeMultipart();    if(!email.getFile().isEmpty()){//有附件              Enumeration<String> efile=email.getFile().elements();              while(efile.hasMoreElements()){               MimeBodyPart mbp=new MimeBodyPart();                  String filename=efile.nextElement(); //选择出每一个附件名                  FileDataSource fds= new FileDataSource(filename); //得到数据源                  mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart                  mbp.setFileName(MimeUtility.encodeText(fds.getName()));  //得到文件名同样至入BodyPart                  mp.addBodyPart(mbp);              }                email.getFile().removeAllElements();              }    if (email.isBodyHtml()) {    MimeBodyPart mbp = new MimeBodyPart();    mbp.setContent(email.getContext(), "text/html;charset=utf-8");    mp.addBodyPart(mbp);    message.setContent(mp);    } else{    MimeBodyPart mbp = new MimeBodyPart();    mbp.setContent(email.getContext(), "text/plain;charset=utf-8");    mp.addBodyPart(mbp);    message.setContent(mp);    }    message.saveChanges();    Transport transport = s.getTransport("smtp");//创建邮箱服务器通道的协议    transport.connect(host, port, userName, password);//设置连接的主机号端口号账号和密码    logger.error(" and  message.getAllRecipients is "+ message.getAllRecipients() != null ? JsonUtils.objectToJson(message.getAllRecipients()):"");    transport.sendMessage(message, message.getAllRecipients());    transport.close();    logger.info("email send tips: email from " + userName + " to " + email.getEmailReceiver());}

          这样就能完成一个邮箱发送的基础功能,下面就来看看怎么讲在代码中生成的pdf发到附件中?
          其实上面的代码已经实现了。
          因为之前已经生成了pdf文档,但是并没有在没有返回页面之前,还是在response中的输出流中,但是Email的的实体类只接受文件名的形式,

         之前想过将response中的输出流转换成输入流或者字节流来做, 转换成字节流的byteinputstream只能从高速缓存中读取, 而httpservletReponse中读取不到, 
          这边用的办法是将response先写到默认的文件路中 System.getProperty("java.io.tmpdir");

   就是在系统的C:\Users\mars\AppData\Local\Temp,这个地址是jvm默认的临时文件存放地址,

         上一篇文章有这一步,如下: 将pdfWrite写入文件输入流中输出到系统临时文件地址下,

FileOutputStream fos = new FileOutputStream(file);     if(type.equals(DOWNLOAD_PDF)){              PdfWriter.getInstance(document, response.getOutputStream());//用于返回页面下载          }else if(type.equals(SEND_PDF)){              PdfWriter.getInstance(document, fos);//用于邮件附件获取          }Vector<String> file = new Vector<String>();//保存多个需上传附件的文件名file.add(fileLocalName);emailMessage.setFile(file);    通过方法去获取对应文件名和地址的文件作为附件,实现了附件上传   if(!email.getFile().isEmpty()){//有附件      Enumeration<String> efile=email.getFile().elements();      while(efile.hasMoreElements()){            MimeBodyPart mbp=new MimeBodyPart();           String filename=efile.nextElement(); //选择出每一个附件名           FileDataSource fds= new FileDataSource(filename); //得到数据源           mbp.setDataHandler(new DataHandler(fds)); //得到附件本身并至入BodyPart           mbp.setFileName(MimeUtility.encodeText(fds.getName()));            mp.addBodyPart(mbp);         }        email.getFile().removeAllElements(); }
 
原创粉丝点击