Servlet 3.1 JavaMail 发送带附件电子邮件

Java Servlet 使用 JavaMail API 可以发送带附件的电子邮件

环境配置

Servlet 发送带附件的电子邮件需要在计算机上安装 Sun Java MailJavaMail APIJava Activation Framework)JAF)

  1. 可以从 Github 载最新版本的 JavaMail

  2. 可以从 Java 网站下载最新版本的 JAF(版本 1.1.1)

  3. 可以从 下载最新版的 SUN JAVA MAIL 1.6.0

下载并解压缩这些文件,找到 mail.jaractivation.jar 文件,然后添加到 CLASSPATH 中

你也可以点击以下链接直接下载

  1. JavaMail mail.jar 1.6.0

  2. JAF activation-1.1.1.jar

  3. SUN JavaMail 1.6.0

下载完成后直接把它们添加到 CLASSPATH

范例

下面的范例将从我们的计算机上发送一封带有附件的电子邮件

我们假设你的 本地主机 已连接到互联网,并支持发送电子邮件

同时确保 Java Email API 包和 JAF 包的所有的 jar 文件在 CLASSPATH 中都是可用的

// author: 简单教程(www.twle.cn)
// Copyright © 2015-2065 www.twle.cn. All rights reserved.

package cn.twle.demo;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.security.GeneralSecurityException;
import javax.servlet.annotation.WebServlet;
import com.sun.mail.util.MailSSLSocketFactory;

@WebServlet(name = "SendEmailAttachmentServlet", urlPatterns = {"send_mail_attachment"}) 
public class SendEmailAttachmentServlet extends HttpServlet{

   private String username = null;
   private String password = null;

  public void doGet(HttpServletRequest request,
                    HttpServletResponse response)
            throws ServletException, IOException
  {
      // 收件人的电子邮件 ID
      String to = "no-reply@example.com";

      // 发件人的电子邮件 ID
      String from = "no-reply@example.cn";

      // 假设您是从本地主机发送电子邮件
      String host = "smtp.qq.com";





      // 获取系统的属性
      Properties props = System.getProperties();

      // 开启debug调试
      props.setProperty("mail.debug", "true");
      // 发送服务器需要身份验证
      props.setProperty("mail.smtp.auth", "true");
      // 设置邮件服务器主机名
      props.setProperty("mail.host", "smtp.qq.com");
      // 发送邮件协议名称
      props.setProperty("mail.transport.protocol", "smtp");
      props.setProperty("mail.smtp.port", "465");
      props.setProperty("mail.smtp.socketFactory.port", "465");


      username = "xxx";
      password = "xxx";

      //使用SSL,企业邮箱必需!
      //开启安全协议
      MailSSLSocketFactory sf = null;
      try {
         sf = new MailSSLSocketFactory();
         sf.setTrustAllHosts(true);
      } catch (GeneralSecurityException e1) {
         e1.printStackTrace();
      }

      props.put("mail.smtp.ssl.enable", "true");
      props.put("mail.smtp.ssl.socketFactory", sf);


      EmailAutherticator auth = new EmailAutherticator();

      // 获取默认的 Session 对象
      Session session = Session.getDefaultInstance(props,auth);

      // 设置响应内容类型
      response.setContentType("text/html;charset=UTF-8");
      PrintWriter out = response.getWriter();

       try{
         // 创建一个默认的 MimeMessage 对象
         MimeMessage message = new MimeMessage(session);

         // 设置 From: header field of the header.
         message.setFrom(new InternetAddress(from));

         // 设置 To: header field of the header.
         message.addRecipient(Message.RecipientType.TO,
                                  new InternetAddress(to));

         // 设置 Subject: header field
         message.setSubject("你好,这是一份带附件的邮件!,来自简单教程(www.twle.cn)");

         // 创建消息部分 
         BodyPart messageBodyPart = new MimeBodyPart();

         // 填写消息
         messageBodyPart.setText("这是邮件的正文,来自简单教程(www.twle.cn)");

         // 创建一个多部分消息
         Multipart multipart = new MimeMultipart();

         // 设置文本消息部分
         multipart.addBodyPart(messageBodyPart);

         // 第二部分是附件
         messageBodyPart = new MimeBodyPart();
         String filename = "demo.txt";
         File file = new File(filename);
         if(!file.exists())
         {
            throw new IOException("文件不存在!请确定文件路径是否正确");
         }

         DataSource source = new FileDataSource(file);
         messageBodyPart.setDataHandler(new DataHandler(source));
         messageBodyPart.setFileName(filename);
         multipart.addBodyPart(messageBodyPart);

         // 发送完整的消息部分
         message.setContent(multipart );

         // 发送消息
         Transport.send(message);

         String title = "发送带附件电子邮件 | 简单教程(www.twle.cn)";
         String res = "成功发送电子邮件...";
         String docType = "<!DOCTYPE html> \n";
         out.println(docType +
         "<title>" + title + "</title>\n" +
         "<body bgcolor=\"#f0f0f0\">\n" +
         "<p>" + title + "</p>\n" +
         "<p>" + res + "</p>\n" +
         "</body>");
      }catch (MessagingException mex) {
         mex.printStackTrace();
      }
   }

   /**
    * 验证账号密码
    * 发送邮件必须的步骤
    * @author Administrator
    *
    */
    public class EmailAutherticator extends Authenticator
    {
        public PasswordAuthentication getPasswordAuthentication()
        {
            return new PasswordAuthentication(username, password);
        }
    }
}

在浏览器上输入 http://localhost:8080/servlet/send_mail_attachment 显示结果如下

然后就可以在邮件箱就能看到我们刚刚发送的邮件

用户身份认证

如果需要向电子邮件服务器提供用户 ID 和密码进行身份认证,可以设置如下属性:

props.setProperty("mail.user", "my_email_user");
props.setProperty("mail.password", "my_email_mypwd");
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2018 简单教程 twle.cn All Rights Reserved.