发送和接收qq邮件
项目中经常使用电子邮件让用户找回密码,注册,以及发送活动信息。电子邮件的在网络中传输和网页一样需要遵从特定的协议,常用的电子邮件协议包括 SMTP,POP3,IMAP。
相关依赖:
<!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api --> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
1.发送邮件
邮件的创建和发送只需要用到 SMTP协议。邮件发送,涉及本地代码端、邮件发送服务器端、邮件接收服务器端,代码没问题但发送的服务器可以给你拒绝服务(比如认为发送的内容是垃圾广告,或者你频繁请求发送),这不是代码端能管的事情,但都有错误码返回,明确告诉你为什么错误。
就算你发送成功了,对方也有可能接收不到,成功发送到对方的邮件接收服务器后,对方的服务器可以根据你的内容拒绝收你的邮件(比如认为你的内容是广告诈骗等信息,或者发送过于频繁),对方的服务器可能直接把你的邮件扔垃圾箱,或者直接忽略。
1.1创建邮件
首先,创建连接服务器的配置,创建会话,创建邮件对象。
Properties props = new Properties(); Session session= Session.getInstance(props); MimeMessage message = new MimeMessage(session);
1.2添加邮件信息
设置收件人(可以添加多个),抄送,密送,邮件主题,邮件正文,设置发送时间。
其中抄送就是把你所要发送的邮件copy一份,同时发给别的人,但这样收件人是能够看出来你在发给他的同时还发给谁了,还有一个“密送”,是指在发给收件人的同时,还悄悄地抄送给别的人,收件人是看不出来的。
message.setFrom(new InternetAddress("1436199880@qq.com", "jingke", "UTF-8")); message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("liyongfei@ancun.com", "这是昵称", "UTF-8")); message.addRecipient(MimeMessage.RecipientType.TO, new InternetAddress("1436199880@qq.com", "这是昵称", "UTF-8")); message.setRecipient(MimeMessage.RecipientType.CC, new InternetAddress("liyongfei@ancun.com", "这是昵称", "UTF-8")); message.setRecipient(MimeMessage.RecipientType.BCC, new InternetAddress("liyongfei@ancun.com", "这是昵称", "UTF-8")); message.setSubject("主题", "UTF-8"); message.setContent("正文。。。", "text/html;charset=UTF-8"); message.setSentDate(new Date());
1.3保存邮件
message.saveChanges();
这样一封邮件就配置好了。配置内容如下:
Date: Fri, 10 Nov 2017 14:10:48 +0800 (CST)
From: jingke <1436199880@qq.com>
To: =?UTF-8?B?6L+Z5piv5pi156ew?= <liyongfei@ancun.com>,
=?UTF-8?B?6L+Z5piv5pi156ew?= <1436199880@qq.com>
Cc: =?UTF-8?B?6L+Z5piv5pi156ew?= <liyongfei@ancun.com>
Bcc: =?UTF-8?B?6L+Z5piv5pi156ew?= <liyongfei@ancun.com>
Message-ID: <374029903.0.1510294248995.JavaMail.jingke@AC-HDJRZ42>
Subject: =?UTF-8?B?5Li76aKY?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base64
5q2j5paH44CC44CC44CC
1.4邮件开启SMTP服务
以QQ邮箱为例
开启POP3/SMTP/IMAP功能必须先设置独立密码,这样能够保障你在第三方客户端登陆时的帐户安全。如果你已经开启了POP3/SMTP/IMAP功能,撤销独立密码会同时关闭你的POP3/SMTP/IMAP功能,这会导致你无法在第三方客户端登陆QQ邮箱。解决方法:重新设置独立密码。
qq邮箱SMTP服务器:
获取qq邮箱授权码:
在设置完成的时候会给你一个授权码,这个授权码就是以后发送邮件的密码。
1.5发送邮件
某些邮箱服务器为了增加邮箱本身密码的安全性,给 SMTP 客户端设置授权码,对于开启了授权码的邮箱, 这里的邮箱密码必需使用这个授权码。
public static String myEmailAccount = "1436199880@qq.com"; public static String myEmailPassword = "授权码,保密"; public static String myEmailSMTPHost = "smtp.qq.com";
创建参数配置, 用于连接邮件服务器的参数配置,使用的协议(JavaMail规范要求),发件人的邮箱的 SMTP 服务器地址,是否需要请求认证。
Properties props = new Properties(); props.setProperty("mail.transport.protocol", "smtp"); props.setProperty("mail.smtp.host", myEmailSMTPHost); props.setProperty("mail.smtp.auth", "true");
SMTP 服务器的端口,非 SSL 连接的端口一般默认为25, 可以不添加, 如果开启了 SSL 连接, 需要改为对应邮箱的 SMTP 服务器的端口。
final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort);
根据配置创建会话对象, 用于和邮件服务器交互,创建一封邮件,根据 Session 获取邮件传输对象,最后关闭连接
Session session = Session.getInstance(props); session.setDebug(true); CreateMail createMail = new CreateMail(); MimeMessage message = createMail.createAmail(); Transport transport = session.getTransport(); transport.connect(myEmailAccount, myEmailPassword); transport.sendMessage(message, message.getAllRecipients()); transport.close();
1.6发送结果
2.接受邮件
JavaMail API中定义了一个javax.mail.Store类,它用于执行邮件接收任务,这个类的实例对象封装了某种邮件接收协议的底层实施细节,应用程序调用这个类中的方法就可以获得用户邮箱中的各个邮件夹的信息。JavaMail使用Folder对象表示邮件夹,通过Folder对象的方法应用程序进而又可以获得该邮件夹中的所有邮件信息,而每封邮件信息,JavaMail又分别使用了一个Message对象进行封装。
使用SSL的通用配置如下:
接收邮件服务器:pop.qq.com,使用SSL,端口号995
参数:
public static String myEmailAccount = "1436199880@qq.com"; public static String myEmailPassword = "授权码,保密"; public static String server = "pop.qq.com";
配置协议,主机和ssl:
Properties props = new Properties(); props.setProperty("mail.store.protocol","pop3"); props.setProperty("mail.pop3.host", server); props.setProperty("mail.pop3.ssl.enable", "true");
根据属性新建一个邮件会话:
Session session=Session.getDefaultInstance(props,null);
从会话对象中获得POP3协议的Store对象,连接qq邮箱服务器:
Store store = session.getStore("pop3"); session.setDebug(true); store.connect("pop.qq.com", myEmailAccount, myEmailPassword);
获取邮件服务器的收件箱:
Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY);
读取邮件:
Message message[] = folder.getMessages(); for (int i=0; i< message.length; i++) { Message message1 = message[i]; String from = message1.getFrom()[0].toString(); String subject = message1.getSubject(); Date date = message1.getSentDate(); System.out.println("From: " + from); System.out.println("Subject: " + subject); System.out.println("Date: " + date); }
关闭连接:
folder.close(false); store.close();
接收结果:
3.完整代码
public class CreateMail { public MimeMessage createAmail() throws Exception { Properties props = new Properties(); Session session= Session.getInstance(props); MimeMessage message = new MimeMessage(session); message.setFrom(new InternetAddress("1436199880@qq.com", "jingke", "UTF-8")); message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("15068710662@qq.com", "这是昵称", "UTF-8")); message.setSubject("主题", "UTF-8"); message.setContent("正文。。。", "text/html;charset=UTF-8"); message.setSentDate(new Date()); message.saveChanges(); return message; } }
public class SendMail { public static String myEmailAccount = "1436199880@qq.com"; public static String myEmailPassword = "授权码"; public static String myEmailSMTPHost = "smtp.qq.com"; public static void main(String[] args) throws Exception { // 1. 创建参数配置, 用于连接邮件服务器的参数配置,使用的协议(JavaMail规范要求),发件人的邮箱的 SMTP 服务器地址,是否需要请求认证 Properties props = new Properties(); // 参数配置 props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求) props.setProperty("mail.smtp.host", myEmailSMTPHost); // 发件人的邮箱的 SMTP 服务器地址 props.setProperty("mail.smtp.auth", "true"); // 需要请求认证 // 某些邮箱服务器要求 SMTP 连接需要使用 SSL 安全认证 (为了提高安全性, 邮箱支持SSL连接, 也可以自己开启), final String smtpPort = "465"; props.setProperty("mail.smtp.port", smtpPort); props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.socketFactory.port", smtpPort); // 2. 根据配置创建会话对象, 用于和邮件服务器交互,创建一封邮件,根据 Session 获取邮件传输对象,最后关闭连接 Session session = Session.getInstance(props); session.setDebug(true); CreateMail createMail = new CreateMail(); MimeMessage message = createMail.createAmail(); Transport transport = session.getTransport(); transport.connect(myEmailAccount, myEmailPassword); transport.sendMessage(message, message.getAllRecipients()); transport.close(); } }
public class GetMail { public static String myEmailAccount = "1436199880@qq.com"; public static String myEmailPassword = "授权码"; public static String server = "pop.qq.com"; public static void main(String[] args) throws MessagingException { Properties props = new Properties(); props.setProperty("mail.store.protocol","pop3"); props.setProperty("mail.pop3.host", server); props.setProperty("mail.pop3.ssl.enable", "true"); //根据属性新建一个邮件会话. Session session=Session.getDefaultInstance(props,null); //从会话对象中获得POP3协议的Store对象 Store store = session.getStore("pop3"); session.setDebug(true); store.connect("pop.qq.com", myEmailAccount, myEmailPassword); //获取邮件服务器的收件箱 Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); for (int i=0; i< message.length; i++) { Message message1 = message[i]; String from = message1.getFrom()[0].toString(); String subject = message1.getSubject(); Date date = message1.getSentDate(); System.out.println("From: " + from); System.out.println("Subject: " + subject); System.out.println("Date: " + date); } //关闭连接 folder.close(false); store.close(); } }