JavaMail API发送邮件和接收邮件

it2023-10-24  69

写在前面边角料:为了打个比赛,写了1个星期的论文,终于回到java的怀抱了,暴风哭泣,导致博客都没怎么写,血亏。


一开始我们发送邮件是使用telnet发送,需要创建Socket,连接TCP,发送相应的格式,很是繁琐,所以也就有了JavaMail API。JavaMail API来自Oracle,它简化了邮件客户程序的开发,它封装了按照各种邮件通信协议,如IMAP、POP3和SMTP等与邮件服务器通信的细节,为Java应用程序提供了收发电子邮件的公共接口,用于开发邮件收发客户端。

下面是jar包的下载 https://github.com/javaee/javamail/releases/download/JAVAMAIL-1_6_2/javax.mail.jar 但在项目开发中一般使用maven来进行配置JavaMail,使其添加到项目中。

封装JavaMailAPIClient类方便进行使用

import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import java.util.Properties; public class JavaMailAPIClient { /* Session类表示邮件会话,是JavaMail API的最高层入口类。 Session对象从java.util.Properties对象中获取配置信息, 如邮件发送服务器的主机名或IP地址、接收邮件的协议、发送邮件的协议、 用户名、口令及在整个应用程序中共享的其他信息。 * */ protected Session session; /* Store类表示接收邮件服务器上的注册账号的存储空间, 通过Store类的getFolder()方法,可以访问用户的特定邮件夹。 */ protected Store store; /* Transport类根据指定的邮件发送协议(通常是 SMTP), 通过指定的邮件发送服务器来发送邮件。 Transport类是抽象类,它的静态方法send(Message)负责发送邮件 * */ protected Transport transport; //定义接收邮件服务器 private String receiveHost = "pop.qq.com"; //定义发送邮件服务器 private String sendHost = "smtp.qq.com"; //接收邮件协议 private String receiveProtocol = "pop3"; public void init() throws Exception { //设置邮箱属性 Properties props = new Properties(); props.put("mail.transport.protocol", "smtp"); props.put("mail.store.protocol", receiveProtocol); props.put("mail.imap.class", "com.sun.mail.imap.IMAPStore"); props.put("mail.smtp.class", "com.sun.mail.smtp.SMTPTransport"); props.put("mail.smtp.host", sendHost);//设置发送邮件服务器 //创建session对象 session = Session.getDefaultInstance(props); //创建Store对象 store = session.getStore(receiveProtocol); //连接到接收邮件服务器 store.connect(receiveHost, "接收邮箱的完整地址", "该邮箱的授权码"); } public void close() throws Exception { store.close(); } /** * 发送邮件 * @param fromAddr 发送邮件的邮箱地址 * @param toAddr 接收邮件的邮箱地址 */ public void sendMail(String fromAddr, String toAddr) throws MessagingException { //发送邮件时,我们需要构造一个Message对象, // 然后调用Transport.send(Message)即可完成发送 MimeMessage message = new MimeMessage(session); // 设置发送方地址 message.setFrom(new InternetAddress(fromAddr)); // 设置接收方地址 message.setRecipient(Message.RecipientType.TO, new InternetAddress(toAddr)); // 设置邮件主题 message.setSubject("你好", "UTF-8"); // 设置邮件正文 message.setText("开心的一天!", "UTF-8"); //发送 Transport.send(message,fromAddr,"该发送邮箱的授权码"); } /** * 接收邮件 * @throws Exception */ public void receiveMail() throws Exception { //inbox邮件夹是邮件账号的保留邮件夹(IMAP不允许用户删除该邮件夹), // 邮件服务器把所有接收到的新邮件都存在该邮件夹中 browseMessagesFromFolder("inbox"); } public void browseMessagesFromFolder(String folderName) throws Exception { Folder folder = store.getFolder(folderName); if (folder == null) { throw new Exception(folderName + "邮件夹不存在"); } browseMessagesFromFolder(folder); } public void browseMessagesFromFolder(Folder folder) throws Exception { //Folder类代表邮件夹,邮件都放在邮件夹中 folder.open(Folder.READ_ONLY); System.out.println("你的邮箱里有: " + folder.getMessageCount() + "封邮件"); System.out.println("你的邮箱里有: " + folder.getUnreadMessageCount() + "封未读邮件"); //读邮件,Message类代表电子邮件。Message类提供了读取和设置邮件内容的方法 for (int i = 1; i <= folder.getMessages().length; i++) { System.out.println("-------第" + i + "封邮件--------"); System.out.print("其发送者是:"); //Address类代表邮件地址,和Message 类一样,Address类也是个抽象类。 // 常用的具体子类为javax.mail.internet.InternetAddress类 InternetAddress[] addr = (InternetAddress[]) folder.getMessage(i).getFrom(); //发送者地址 System.out.println(addr[0].getAddress()); System.out.print("发送的标题为:"); String subject = folder.getMessage(i).getSubject(); System.out.println(subject); System.out.print("发送日期为:"); System.out.println(" 邮件内容为: "); System.out.println(folder.getMessage(i).getContent().toString()); } folder.close(false);//关闭邮件夹,但是不要删除邮件夹中标记为"deleted"的邮件 } public static void main(String[] args) throws Exception{ JavaMailAPIClient mailClient = new JavaMailAPIClient(); mailClient.init(); mailClient.sendMail("your-test@qq.com","your-test@qq.com"); // mailClient.receiveMail(); mailClient.close(); } }

首先成员变量有session,store,transport,receiveHost ,sendHost ,receiveProtocol ,后三个没什么好说的,主要是前三个

Session类表示邮件会话,是JavaMail API的最高层入口类。Session对象从java.util.Properties对象中获取配置信息,如邮件发送服务器的主机名或IP地址、接收邮件的协议、发送邮件的协议、用户名、口令及在整个应用程序中共享的其他信息。Store类表示接收邮件服务器上的注册账号的存储空间,通过Store类的getFolder()方法,可以访问用户的特定邮件夹。Transport类根据指定的邮件发送协议(通常是 SMTP),通过指定的邮件发送服务器来发送邮件。Transport类是抽象类,它的静态方法send(Message)负责发送邮件

使用方法

首先用init()配置信息,实例化Session类对象和Store类对象 一般是读取properties文件完成实例化Session,但这里配置信息就写在函数体里了发送邮件sendMail函数,我们需要构造一个Message对象, 然后调用Transport.send(Message)即可完成发送接收邮件browseMessagesFromFolder,Folder folder = store.getFolder(folderName); Folder类代表邮件夹,邮件都放在邮件夹中,使用Folder类下的方法即可读取邮件信息
最新回复(0)