JavaMail-API简介:
邮件客户端的主要任务是向邮件服务器发送邮件,以及接收来自邮件服务器的邮件。
Sun公司制定了一套API,它封装了邮件通信的各种协议。为Java开发者提供了收发电子邮件的公共接口。
需要的jar包
mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail
Javax.mail.Session:
Session -用于设置服务器,协议类型和密码等
表示会话,是JavaMailApi的最高层入口类。Session对像从Properties中获取信息,如IP、协议、用户名密码等。
Javax.mail.Message类,它的一个重要子类为MimeMessage.
Message类表示电子邮件的正文部分。
一封电子邮件包含以下内容:
地址信息、标题、日期、正文。
Java.mail.Address:收件人地址
表示邮件的地址。常用的子类为:javax.mail.internet.InternetAddress.
Javax.mail.Transport:负责发送邮件
指定邮件发送的协议。通常为SMTP.
它的静态方法send(Message)负责发送邮件。
MailSSLSocketFactory-负责SSL加密(如果有邮箱是用ssl加密传输的,就需要用到这个类,否则不需要-以前的老版本jar包中没有此类)
演示用QQ邮箱给网易126邮箱发邮件:
为什么要用QQ邮箱,那是因为QQ邮箱的发送用到了ssl加密,而且这里原本需要的密码,也需要用授权码才可以。
JavaMail发送邮件:前提是QQ邮箱里帐号设置要开启POP3/SMTP协议
发送没有附件的邮件
第一种方式:
@Test//发送没有附件的邮件 public void send1() throws Exception{ //跟smtp服务器建立一个连接 Properties p = new Properties(); // 设置邮件服务器主机名 p.setProperty("mail.host", "smtp.qq.com");//指定邮件服务器,默认端口 25 // 发送服务器需要身份验证 p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证 // 发送邮件协议名称 p.setProperty("mail.transport.protocol", "smtp"); // 开启SSL加密,否则会失败 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); p.put("mail.smtp.ssl.enable", "true"); p.put("mail.smtp.ssl.socketFactory", sf); // 开启debug调试,以便在控制台查看 //session.setDebug(true);也可以这样设置 //p.setProperty("mail.debug", "true"); // 创建session Session session = Session.getDefaultInstance(p, new Authenticator() { @Override protected PasswordAuthentication getPasswordAuthentication() { //用户名可以用QQ账号也可以用邮箱的别名 PasswordAuthentication pa = new PasswordAuthentication("chenhaoxiang0117", "jnj*********dab"); // 后面的字符是授权码,用qq密码不行!! return pa; } }); session.setDebug(true);//设置打开调试状态 for (int i = 0; i <1; i++) {//发送几封邮件 //声明一个Message对象(代表一封邮件),从session中创建 MimeMessage msg = new MimeMessage(session); //邮件信息封装 //1发件人 msg.setFrom(new InternetAddress("*****@qq.com")); //2收件人 msg.setRecipient(RecipientType.TO, new InternetAddress( "******@126.com")); //3邮件内容:主题、内容 msg.setSubject("这是我用Java发来的邮件QQ...."); //msg.setContent("Hello, 今天没下雨!!!", "text/plain;charset=utf-8");//纯文本 msg.setContent( "Hello <a href='http://www.baidu.com?id=ddd'>你好,快乐吗?<a/>", "text/html;charset=utf-8");//发html格式的文本 //发送动作 Transport.send(msg); } }
第二种方式:
public class sendqqMail { public static void main(String[] args) throws Exception { Properties prop = new Properties(); // 开启debug调试,以便在控制台查看 prop.setProperty("mail.debug", "true"); // 设置邮件服务器主机名 prop.setProperty("mail.host", "smtp.qq.com"); // 发送服务器需要身份验证 prop.setProperty("mail.smtp.auth", "true"); // 发送邮件协议名称 prop.setProperty("mail.transport.protocol", "smtp"); // 开启SSL加密,否则会失败 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); // 创建session Session session = Session.getInstance(prop); // 通过session得到transport对象 Transport ts = session.getTransport(); // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全) ts.connect("smtp.qq.com", "619***629", "jnjt***bdab"); // 后面的字符是授权码,用qq密码失败了 // 创建邮件 Message message = createSimpleMail(session); // 发送邮件 ts.sendMessage(message, message.getAllRecipients()); ts.close(); } /** * @Method: createSimpleMail * @Description: 创建一封只包含文本的邮件 */ public static MimeMessage createSimpleMail(Session session) throws Exception { // 创建邮件对象 MimeMessage message = new MimeMessage(session); // 指明邮件的发件人 message.setFrom(new InternetAddress("61*****29@qq.com")); // 指明邮件的收件人 message.setRecipient(Message.RecipientType.TO, new InternetAddress( "*****@126.com")); // 邮件的标题 message.setSubject("QQ邮件测试"); // 邮件的文本内容 message.setContent("发送邮件成功!", "text/html;charset=UTF-8"); // 返回创建好的邮件对象 return message; } }
QQ邮箱生成授权码的位置:
126邮箱接收结果:
发送有附件的邮件
相对于没带附件的:用MimeBodyPart来构建体,向体中添加内容,附件。最后利用MimeMultipart —addBodyPart(body); 把体加入。
这里需要一个activation包。
@Test//发送含附件的邮件 public void send2() throws Exception{ //跟smtp服务器建立一个连接 Properties p = new Properties(); // 开启debug调试,以便在控制台查看 p.setProperty("mail.debug", "true"); p.setProperty("mail.host", "smtp.sina.com");//指定邮件服务器,默认端口 25 p.setProperty("mail.smtp.auth", "true");//要采用指定用户名密码的方式去认证 // 发送邮件协议名称 p.setProperty("mail.transport.protocol", "smtp"); // 开启SSL加密,否则会失败 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); p.put("mail.smtp.ssl.enable", "true"); p.put("mail.smtp.ssl.socketFactory", sf); // 创建session Session session = Session.getInstance(p); // 通过session得到transport对象 Transport ts = session.getTransport(); // 连接邮件服务器:邮箱类型,帐号,授权码代替密码(更安全) ts.connect("smtp.qq.com", "61*****29", "jnjt*******bdab"); // 后面的字符是授权码,不能用qq密码 //声明一个Message对象(代表一封邮件),从session中创建 MimeMessage msg = new MimeMessage(session); //邮件信息封装 //1发件人 msg.setFrom( new InternetAddress("61******29@qq.com") ); //2收件人 msg.setRecipient(RecipientType.TO, new InternetAddress("ch*****ox@126.com") ); //3邮件内容:主题、内容 msg.setSubject("这是我用Java发来的邮件--带附件的...."); //添加附件部分 //邮件内容部分1---文本内容 MimeBodyPart body0 = new MimeBodyPart(); //邮件中的文字部分 body0.setContent("这是两张<font color='red'>图片</font>....","text/html;charset=utf-8"); //邮件内容部分2---附件1 MimeBodyPart body1 = new MimeBodyPart(); //附件1 body1.setDataHandler( new DataHandler( new FileDataSource("./imgs/1.jpg")) );//./代表项目根目录下 body1.setFileName( MimeUtility.encodeText("中文1.jpg") );//中文附件名,解决乱码 //邮件内容部分3---附件2 MimeBodyPart body2 = new MimeBodyPart(); //附件2 body2.setDataHandler( new DataHandler( new FileDataSource("./imgs/2.jpg")) ); body2.setFileName("2.jpg"); //把上面的3部分组装在一起,设置到msg中 MimeMultipart mm = new MimeMultipart(); mm.addBodyPart(body0); mm.addBodyPart(body1); mm.addBodyPart(body2); msg.setContent(mm); // 发送邮件 ts.sendMessage(msg,msg.getAllRecipients()); ts.close(); }
接收结果:
小知识点:
1.必须先启用QQ邮箱里POP3/STMP服务;然后生成授权码
2.导入mail.jar包和activation包
mail.jar和activation-1.1.0.jar链接:
https://github.com/chenhaoxiang/Java/tree/master/JavaMail
3.要在代码里加上开启SSL加密的代码(老版本的mail中没有MailSSLSocketFactory类)
4.密码不是QQ密码,而是授权码!