javamail主要是通过STMP、POP协议和邮件服务器交换数据,从而达到发送、接受邮件的。javamail的核心由两大类:1、发送:连接会话、服务器验证、发送地址、邮件信息、发送类。2、接受:服务器连接、消息。
a)STMP和POP3是网络协议中应用层部分,和HTTP是同层。
b)SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰
c)POP3,全名为“Post Office Protocol - Version 3”,即“邮局协议版本3”。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。提供了SSL加密的POP3协议被称为POP3S。POP 协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。这种离线访问模式是一种存储转发服务,将邮件从邮件服务器端送到个人终端机器上,一般是PC机或 MAC。一旦邮件发送到 PC 机或MAC上,邮件服务器上的邮件将会被删除。但目前的POP3邮件服务器大都可以“只下载邮件,服务器端并不删除”,也就是改进的POP3协议。
a)通用类
javax.mail.Session:会话类是JavaMail API的主要类,它不创建子类。 Session 对象充当连接工厂的JavaMail API,它可以同时处理配置设置和身份验证。会话类是JavaMail API的主要类,它不创建子类。 Session 对象充当连接工厂的JavaMail API,它可以同时处理配置设置和身份验证。有点像socket,无论是发送还是接受都需要这个类
java.util.Properties:设置通信协议、主机地址、端口、身份认证等.
javax.mail.Authenticator:邮件服务器分配的账户信息。是抽象了,需要继承实现getPasswordAuthentication()获得PasswordAuthentication。
a)发送相关类
javax.mail.Address:发送地址(邮件服务器账户)、接受者地址。
javax.mail.internet.MimeMessage:邮件内容、包括邮件的所有信息.
javax.mail.Transport:发送器
b)接受相关类
javax.mail.Store:pop3对象,相当于邮箱。
javax.mail.Folder:邮箱里面的文件夹对象。
javax.mail.Message:邮件。
public void TestSend() throws Exception { // 一.邮件服务器网络设置 Properties props = new Properties(); this.setPropertis(props); // 二.连接session Session session = Session.getInstance(props, new Authenticator() { // 三.由于authenticator是抽象了 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "123"); } }); // 四、地址: // 4.1.发送地址:这里是邮件服务器地址 // Address addressfrom = new InternetAddress("[email protected]"); // Address addressFrom=new InternetAddress("[email protected]","sender");//名字和邮件显示在一起 Address addressFrom = new InternetAddress("[email protected]", MimeUtility.encodeText("发送者"));// 格式化中文信息 // 4.2.接受者 Address addressToOne = new InternetAddress("[email protected]", MimeUtility.encodeText("发送者1")); Address[] addressToCopy = { new InternetAddress("[email protected]", MimeUtility.encodeText("发送者2")), new InternetAddress("[email protected]", MimeUtility.encodeText("发送者3")), new InternetAddress("[email protected]", MimeUtility.encodeText("发送者4")) }; // 五、消息:<邮件消息格式> Message message = new MimeMessage(session);// 创建消息 // 5.1发送者 message.setFrom(addressFrom); // 5.2 接受者 /** * @See 发送设置 Message.RecipientType.TO:收信人 Message.RecipientType.CC:抄送人 * <复制一份> Message.RecipientType.BCC:暗发人<复制一份> */ message.setRecipient(Message.RecipientType.TO, addressToOne); // message.setRecipients(Message.RecipientType.CC, addressToCopy);//重复发送 message.setSubject("你好啊");// 主题 // 内容 this.setMessageContent(message); // 发送: Transport.send(message); } /** * @see 设置网络信息 * @param props */ private void setPropertis(Properties props) { props.put("mail.stmp.host", "smtp.163.com");// 邮件地址 props.put("mail.smtp.port", 25); // 邮件端口 props.put("mail.stmp.auth", true);// 开启认证(需要服务器账户密码) props.put("mail.smtp.starttls.enable", true);// 开启ssl认证 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");// 启用ssl的socket服务 props.put("mail.smtp.socketFactory.fallback", true);// 开启回滚 props.put("mail.stmp.timeout", 0);// 超时设置 } public void setMessageContent(Message message) throws MessagingException { // 1.普通 // message.setText("我是普通内容内容"); // 2.带html内容 //message.setContent("<h1>我是html<h2>", "text/html"); // 3.带附件:如果带附件、则正文和附件都降以 MimeBodyPart形式存在 MimeMultipart mmt = new MimeMultipart();// 附件 // 普通附件 MimeBodyPart mbp1 = new MimeBodyPart(); mbp1.setText("我是正文"); mmt.addBodyPart(mbp1); // 文本附件<文件、图片> MimeBodyPart mbp2 = new MimeBodyPart(); String filename = "/home/manisha/file.txt"; FileDataSource fds = new FileDataSource(filename);//附件的数据源 mbp2.setDataHandler(new DataHandler(fds));//将附件添加到bodypart mbp2.setFileName(filename);//设置附件名称 mmt.addBodyPart(mbp2);//将附件内容添加到附件 message.setContent(mmt); }
public void TestSend() throws Exception { // 一.邮件服务器网络设置 Properties props = new Properties(); this.setPropertis(props); // 二.连接session Session session = Session.getInstance(props, new Authenticator() { // 三.由于authenticator是抽象了 protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "123"); } }); // 四、 接受者 Store store = session.getStore("pop3s"); store.connect();//连接 // 五、邮件消息文件夹 Folder emailFolder = store.getFolder("INBOX"); /** * @see 文件夹的处理方式 * Folder.READ_ONLY:只读 * Folder.READ_WRITE:读写 * Folder.HOLDS_FOLDERS:包涵其它的文件夹 * Folder.HOLDS_MESSAGES:包涵其它的邮件 */ emailFolder.open(Folder.HOLDS_MESSAGES); // 六、邮件消息 Message[] messages = emailFolder.getMessages(); System.out.println("messages.length---" + messages.length); for (int i = 0, n = messages.length; i < n; i++) { Message message = messages[i]; System.out.println("---------------------------------"); System.out.println("Email Number " + (i + 1)); System.out.println("Subject: " + message.getSubject()); System.out.println("From: " + message.getFrom()[0]); System.out.println("Text: " + message.getContent().toString()); } // 关闭文件夹 emailFolder.close(false); //关闭连接 store.close(); } /** * @see 设置网络信息 * @param props */ private void setPropertis(Properties props) { props.put("mail.stmp.host", "smtp.163.com");// 邮件地址 props.put("mail.smtp.port", 25); // 邮件端口 props.put("mail.stmp.auth", true);// 开启认证(需要服务器账户密码) props.put("mail.smtp.starttls.enable", true);// 开启ssl认证 props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");// 启用ssl的socket服务 props.put("mail.smtp.socketFactory.fallback", true);// 开启回滚 props.put("mail.stmp.timeout", 0);// 超时设置 }