1. 邮件发送简介
-
SMTP服务器:处理邮件发送的功能的服务器称之为SMTP服务器(邮件发送服务器)。一般是 smtp.xxx.com,企鹅邮箱是smtp.qq.com、网易邮箱是smtp.163.com。
-
POP3、IMAP服务器:处理用户邮件接收请求的服务器。pop3.163.com、imap.qq.com等
-
邮件发送需要准备一个邮箱,企鹅、网易、新浪、钉钉等等都可以使用,但是需要开启POP3/SMTP 或者 IMAP/SMTP协议。以企鹅为例。然后会生成一个授权码,之后第三方程序使用该邮箱发送邮件就需要这个授权码
-
引入mail.jar、activation.jar两个依赖
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency>
2. 邮件发送
-
纯文本邮件发送,直接将message中的文本内容设置为一个基础的页面就行,邮件中是可以设置字体颜色之类的东西,所以本质还是一个html页面。
只需要一个MimeMessage类表示一封邮件。
import com.sun.mail.util.MailSSLSocketFactory; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class emailqq { public static void main(String[] args) throws Exception { //1. 配置发送协议的参数 Properties pro = new Properties(); pro.setProperty("mail.host", "smtp.qq.com"); //设置发送方的采用什么服务器 pro.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议 pro.setProperty("mail.smtp.auth","true"); //需要验证用户名密码 //这一部分是可选项,进行使用安全连接 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); pro.setProperty("mail.smtp.ssl.enable","true"); pro.put("mail.smtp.ssl.socketFactory",sf); //2. 创建一个session对象,加载上述参数 Session session = Session.getDefaultInstance(pro, new Authenticator(){ public PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("发送方邮箱","授权码"); } }); //3.通过session获得transport对象 Transport ts = session.getTransport(); //4. 发送对象链接服务器进行验证 ts.connect("smtp.qq.com","发送方邮箱","授权码"); //5. 创建一个邮件对象 MimeMessage message = new MimeMessage(session); //6. 指明发送方 和 接收方 message.setFrom(new InternetAddress("发送方邮箱")); message.setRecipient(Message.RecipientType.TO,new InternetAddress("接收方邮箱")); //7. 设置邮件的主题,内容。 message.setSubject("Java邮件发送"); message.setContent("<h1 style='color: red'> hello</h1>","text/html;charset=utf-8"); //8. 发送邮件 ts.sendMessage(message, message.getAllRecipients()); //9. 关闭连接 ts.close(); } }
-
多媒体邮件发送,这里需要用到几个工具类。下面这些工具类从上往下看,每一层都包含上一层。
-
FileDataSource类:加载多媒体数据等一些文件的工具类,内部实现的是一个FileInputStream流
-
DataHandler类:文件数据处理类,处理FileDataSource类。
-
MimeBodyPart类:邮件内容主体类,通过MimeBodyPart来添加DataHandler类
-
MimeMultiPart类:用户封装处理所有的MimeBodyPart,它本身也可以被当做另外一个更大的MimeMultiPart类的MimeBodyPart部分。
-
MimeMessage类:邮件类表示一封邮件,添加MimeMultiPart作为邮件的内容。
仔细理解下面这张图,难以理解的就是multipart 和 bodypart之间相互添加,这是最恶心最难理解的地方。
import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; public class emailMedia { public static void main(String[] args) throws Exception { //1. 配置发送协议的参数 Properties pro = new Properties(); pro.setProperty("mail.host", "smtp.qq.com"); //设置发送方的采用什么服务器 pro.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议 pro.setProperty("mail.smtp.auth", "true"); //需要验证用户 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); pro.setProperty("mail.smtp.ssl.enable","true"); pro.put("mail.smtp.ssl.socketFactory",sf); //2. 创建一个session对象,加载上述参数 Session session = Session.getDefaultInstance(pro, new Authenticator(){ public PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication("发送方邮箱", "授权码"); } }); //3.通过session获得transport对象 Transport ts = session.getTransport(); //4. 发送对象链接服务器进行验证 ts.connect("smtp.qq.com", "发送方邮箱", "授权码"); //5. 创建一个邮件对象 MimeMessage message = new MimeMessage(session); //6. 指明发送方 和 接收方 message.setFrom(new InternetAddress("发送方邮箱")); message.setRecipient(Message.RecipientType.TO, new InternetAddress("接收方邮箱")); //7. 设置邮件的主题,内容。 message.setSubject("多媒体邮件"); /* 1. MimeBodyPart img, text 2. MimeMultiPart mul1中将img和text进行related组合 3. MimeBodyPart b1 将mul1封装到body1中 4. MimeBodyPart file 5. MimeMultiPart mul2 将 b1 和 file 进行mixed组合 6. MimeMessage message 添加mul2为整个邮件的核心, 7. 发送message */ //图片 DataHandler dhimg = new DataHandler(new FileDataSource("D:\\file\\1.jpg")); MimeBodyPart img = new MimeBodyPart(); img.setDataHandler(dhimg); img.setContentID("1.jgp"); //文本 MimeBodyPart text = new MimeBodyPart(); //这里引用图片标签将上述图片嵌入到文字中 text.setContent("这是一封带<img src='cid:1.jgp'>的邮件","text/html;charset=UTF-8"); //Mul1将 img + file添加为组成内容 MimeMultipart mul1 = new MimeMultipart(); mul1.addBodyPart(img); mul1.addBodyPart(text); mul1.setSubType("related"); //设置文本和图片的相对关系为内嵌 MimeBodyPart b1 = new MimeBodyPart(); //这是内容的一部分 b1.setContent(mul1); //文件 DataHandler dhFile = new DataHandler(new FileDataSource("D:\\file\\DocFile.doc")); MimeBodyPart file = new MimeBodyPart(); file.setDataHandler(dhFile); file.setFileName("file.doc"); MimeMultipart mul2 = new MimeMultipart(); mul2.addBodyPart(b1); //b1中包括图片 + 文本 mul2.addBodyPart(file); //单独的附件 mul2.setSubType("mixed"); message.setContent(mul2); message.saveChanges(); //保存邮件 //======================================================================================= //8. 发送邮件 ts.sendMessage(message, message.getAllRecipients()); //9. 关闭连接 ts.close(); } }
-