Servlet 3.1 JavaMail 发送带附件电子邮件
Java Servlet 使用 JavaMail API 可以发送带附件的电子邮件
环境配置
Servlet 发送带附件的电子邮件需要在计算机上安装 Sun Java Mail 、JavaMail API 和 Java Activation Framework)JAF)
-
可以从 Github 载最新版本的 JavaMail
-
可以从 Java 网站下载最新版本的 JAF(版本 1.1.1)
-
可以从 下载最新版的 SUN JAVA MAIL 1.6.0
下载并解压缩这些文件,找到 mail.jar 和 activation.jar 文件,然后添加到 CLASSPATH 中
你也可以点击以下链接直接下载
下载完成后直接把它们添加到 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");