邮件管理(JavaMail)浅析
电子邮件(Email)
-
电子邮件的应用越来越广泛,比如测试报告的发送
-
一般发送的邮件主要分解为两大部分:(1)一部分是发信人、接信人、主题等邮件标头;(2)另外一部分是邮件内容,有可能带有附件。
-
邮件传输协议:
(1)SMTP:简单邮件传输协议,是一种TCP协议支持的提供可靠且有效电子邮件传输的
应用层协议
。SMTP服务器会中转消息给接收方SMTP服务器以便最终让用户经由POP或者IMAP获得邮件内容(发送邮件、邮件的传输
, 点对点的传输,可靠的连接)
(2)POP:邮局协议,目前版本为3,又称为POP3协议。是允许电子邮件客户端下载服务器上的邮件的协议。(电子邮件的接收
,使用的是TCP的110端口
)
(3)IMAP:因特网消息访问协议,又称IMAP4协议。更高级的用户接收邮件
的协议。
(4)MIME:多用途互联网邮件扩展类型,不是邮件传输协议,对于传输的内容的消息、附件以及其他的内容定义了格式。
可以理解成一个定义格式的标准。
POP中的邮件由客户端进行管理,IMAP中邮件则由服务器进行管理。
JavaMail
-
JavaMail由sun公司发布,在Java程序中处理Email的API。是开发人员在应用程序中实现邮件发送和接收功能的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP。
-
JavaMail目前没有被加在标准的JDK中,使用JavaMail必须另行下载。下载链接
-
JavaMail主要组件:
(1)Session类定义了一个基本邮件会话
,是Java Mail API最高层入口类。所有其它类都是经由这个session才得以生效。
(2)Message:定义邮件信息,比如内容、标题等,Message是抽象类
,更常用的是javax.mail.internet.MimeMessage
类。
(3)Address:用于设置邮件的发送人和收件人地址,常用其子类javax.mail.internet.InternetAddress
(4)Authenticator:授权者类,以用户名、密码的方式访问邮件服务器
(5)Transport类实现了发送邮件的协议(通常为SMTP) -
测试报告发送邮件三种方式:
(1)使用监听器进行test-output压缩,javamail发送压缩包
(2)使用监听器统计失败的方法名称,作为邮件的正文
(3)在2的基础上用freemarker进行美化测试报告。
发送邮件栗子:
package mail1;import java.io.File;import java.util.Date;import java.util.Properties;import jakarta.activation.DataHandler;import jakarta.activation.DataSource;import jakarta.activation.FileDataSource;import jakarta.mail.Authenticator;import jakarta.mail.Message.RecipientType;import jakarta.mail.MessagingException;import jakarta.mail.PasswordAuthentication;import jakarta.mail.Session;import jakarta.mail.Transport;import jakarta.mail.internet.AddressException;import jakarta.mail.internet.InternetAddress;import jakarta.mail.internet.MimeBodyPart;import jakarta.mail.internet.MimeMessage;import jakarta.mail.internet.MimeMultipart;public class SendMail {public static void sendMail(String to, String content) throws AddressException, MessagingException {String from = "";String auth_code = "";//授权码String server = "smtp.126.com";Properties pro = new Properties();pro.put("mail.transport.protocol", "smtp");pro.put("mail.smtp.host", server);pro.put("mail.smtp.auth", true);//1.创建sessionSession session = Session.getInstance(pro, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from, auth_code);}});//2.创建邮件MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from)); //发送人邮件地址message.addRecipient(RecipientType.TO, new InternetAddress(to));//收件人地址;add可以添加多个收件人//message.setRecipient();//ֻ只有最后一个set管用//邮件主题,正文内容message.setSubject("test");//message.setText(content);//发送HTML格式正文MimeBodyPart part1 = new MimeBodyPart();part1.setContent("<h1>测试</h1>", "text/html;charset=utf-8");//上传附件MimeBodyPart part2 = new MimeBodyPart();DataSource source = new FileDataSource(new File("D:\\QQ截图\\2.png"));part2.setDataHandler(new DataHandler(source));part2.setFileName("测试结果");MimeMultipart mp = new MimeMultipart();mp.addBodyPart(part1);mp.addBodyPart(part2);message.setContent(mp);//定时发送message.setSentDate(new Date());//3.发送邮件Transport.send(message);System.out.println("发送成功");}public static void main(String[] args) {try {sendMail("发送人@qq.com", "first");} catch (MessagingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
收件人:
package mail1;import java.util.Properties;import jakarta.mail.Address;import jakarta.mail.Authenticator;import jakarta.mail.Folder;import jakarta.mail.Message;import jakarta.mail.MessagingException;import jakarta.mail.NoSuchProviderException;import jakarta.mail.PasswordAuthentication;import jakarta.mail.Session;import jakarta.mail.Store;public class ReceiveMail {public static void main(String[] args) throws MessagingException {String popServer="pop.126.com"; //邮箱String user="";//发送人String auth_code=""; //授权码Properties props = new Properties();props.put("mail.store.protocol", "pop3");props.put("mail.pop3.host", popServer);props.put("mail.pop3.auth", true);//1创建session对象Session session=Session.getInstance(props, new Authenticator() {// 创建一个密码验证器@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(user, auth_code);}});session.setDebug(false);Store store=session.getStore("pop3");store.connect(popServer, user, auth_code);Folder folder= store.getFolder("INBOX");folder.open(Folder.READ_WRITE);Message[] messages=folder.getMessages();for(Message message:messages) {System.out.println(message.getSubject());Address address=message.getFrom()[0];System.out.println(address);}folder.close();store.close();}}