1、java mail的两个JAR包html
一、mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5;java
下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-eeplat-419426.html服务器
二、activation.jar:JavaMail依赖JAF(JavaBeans Activation Framework),JAF在Java6以后已经合并到JDK中,而JDK5以前须要另外下载JAF的类库。session
最好单独下载加入到工程中。oracle
下载地址:http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-java-plat-419418.html测试
2、经常使用API介绍this
3、使用java mail 发送邮件编码
基本步骤:spa
1 利用Properties来设置Session,通常主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false.net
2 利用Session.getInstance(Properties)启动一个与邮件服务器的会话
3 根据获取的Session来传建一个消息Message
4 定义消息的发信人地址InternetAddress和消息的收信人地址。
5 设置消息发送的主题和内容
6 利用Message.saveChanges()来存储填写的邮件信息
7 根据Session.getTransport("smtp")获取邮件发送类
8 利用发送人的用户名和密码链接到指定的邮件服务器
9 将该消息发送
10 关闭链接
eg:
(1)发送一个纯文本邮件
package mail; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * 邮件发送服务 */ public class SendMailService { /** * 发送纯文本邮件 * @param smtpHost 邮件服务器 * @param to 收件人(能够是多个,使用逗号分隔) * @param cc 抄送人(能够是多个,使用逗号分隔) * @param bcc密送人(能够是多个,使用逗号分隔) * @param sender发件人 * @param title邮件标题 * @param content邮件内容 * @param username邮箱用户名(通常是去掉@以前的那一部分) * @param password(邮箱密码) * @throws MessagingException */ public static void sendPlainTextEmail(String smtpHost, String to, String cc, String bcc, String sender, String title, String content, String username, String password ) throws MessagingException { //第一步 利用Properties来设置Session,通常主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false Properties props = new Properties(); props.put("mail.host", smtpHost); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话 Session session = Session.getInstance(props); session.setDebug(true); //第三步 根据获取的Session来传建一个消息Message MimeMessage message = new MimeMessage(session); //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。 //发件人 InternetAddress sendaddr = new InternetAddress(sender); message.setFrom(sendaddr); //收件人 InternetAddress[] toaddrs = InternetAddress.parse(to); message.setRecipients(Message.RecipientType.TO, toaddrs); //抄送人 InternetAddress[] ccaddrs = InternetAddress.parse(cc); message.setRecipients(Message.RecipientType.CC, ccaddrs); //密送人 InternetAddress[] bccaddrs = InternetAddress.parse(bcc); message.setRecipients(Message.RecipientType.BCC, bccaddrs); //第五步 设置消息发送的主题、内容、时间 message.setSubject(title); message.setText(content); message.setSentDate(new Date()); //第六步 利用Message.saveChanges()来存储填写的邮件信息 message.saveChanges(); //第七步 根据Session.getTransport("smtp")获取邮件发送类 Transport ts = session.getTransport("smtp"); //第八步 利用发送人的用户名和密码链接到指定的邮件服务器 ts.connect(smtpHost, username, password); //第九步将该消息发送 ts.sendMessage(message, message.getAllRecipients()); //第十步 关闭链接 ts.close(); } }
(2)先建立已经过身份验证的会话链接 再发送邮件
package mail; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 用户身份认证 * @author Administrator * */ public class SmtpAuth extends Authenticator { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public void setUserinfo(String username,String password) { this.username = username; this.password = password; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username,password); } }
package mail; import java.util.Date; import java.util.Properties; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * 邮件发送服务 */ public class SendMailService { /** * 发送纯文本邮件 * @param smtpHost 邮件服务器 * @param to 收件人(能够是多个,使用逗号分隔) * @param cc 抄送人(能够是多个,使用逗号分隔) * @param bcc密送人(能够是多个,使用逗号分隔) * @param sender发件人 * @param title邮件标题 * @param content邮件内容 * @param username邮箱用户名(通常是去掉@以前的那一部分) * @param password(邮箱密码) * @throws MessagingException */ public static void sendPlainTextEmailByAuth(String smtpHost, String to, String cc, String bcc, String sender, String title, String content, String username, String password ) throws MessagingException { //第一步 利用Properties来设置Session,通常主要设置两个mail.smtp.host和mail.smtp.auth,第一个主要是设置邮件服务器名,第二个是设置口令true或者false Properties props = new Properties(); props.put("mail.host", smtpHost); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); //第二步 利用Session.getInstance(Properties)启动一个与邮件服务器的会话 SmtpAuth sa = new SmtpAuth(); sa.setUserinfo(username, password); //Session session = Session.getInstance(props, sa); Session session = Session.getDefaultInstance(props, sa); session.setPasswordAuthentication(new URLName(smtpHost), sa.getPasswordAuthentication()); session.setDebug(true); //第三步 根据获取的Session来传建一个消息Message MimeMessage message = new MimeMessage(session); //第四步 定义消息的发信人地址InternetAddress和消息的收信人地址。 //发件人 InternetAddress sendaddr = new InternetAddress(sender); message.setFrom(sendaddr); //收件人 InternetAddress[] toaddrs = InternetAddress.parse(to); message.setRecipients(Message.RecipientType.TO, toaddrs); //抄送人 InternetAddress[] ccaddrs = InternetAddress.parse(cc); message.setRecipients(Message.RecipientType.CC, ccaddrs); //密送人 InternetAddress[] bccaddrs = InternetAddress.parse(bcc); message.setRecipients(Message.RecipientType.BCC, bccaddrs); //第五步 设置消息发送的主题、内容、时间 message.setSubject(title); message.setText(content); message.setSentDate(new Date()); //第六步 利用Message.saveChanges()来存储填写的邮件信息 message.saveChanges(); //第七步将该消息发送 Transport.send(message); } public static void main(String[] args) { try { sendPlainTextEmailByAuth("smtp.163.com", "cac2020@163.com", "ssssss@qq.com", "", "cac2020@163.com", "测试一个纯文本邮件", "ssssss", "cac2020", "ffafasdfsdfsaf"); } catch (MessagingException e) { e.printStackTrace(); } } }
(3)发送一封含图片的邮件
package mail; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * 邮件发送服务 */ public class SendMailService { /** * 发送内嵌图片邮件 * @param smtpHost 邮件服务器 * @param to 收件人(能够是多个,使用逗号分隔) * @param cc 抄送人(能够是多个,使用逗号分隔) * @param bcc密送人(能够是多个,使用逗号分隔) * @param sender发件人 * @param title邮件标题 * @param username邮箱用户名(通常是去掉@以前的那一部分) * @param password(邮箱密码) * @throws MessagingException */ public static void sendImageEmail(String smtpHost, String to, String cc, String bcc, String sender, String title, String username, String password) throws MessagingException { Properties props = new Properties(); props.put("mail.host", smtpHost); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props); session.setDebug(true); Transport ts = session.getTransport(); ts.connect(smtpHost, username, password); //建立含图片邮件 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(sender)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc)); msg.setSubject(title); msg.setSentDate(new Date()); //邮件正文文本 MimeBodyPart text = new MimeBodyPart(); text.setContent("这是一封邮件正文带图片<img src='cid:576f707a5ba85.JPG'>的邮件", "text/html;charset=UTF-8"); //邮件正文中的图片 MimeBodyPart image = new MimeBodyPart(); image.setContentID("576f707a5ba85.JPG"); DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG")); image.setDataHandler(dh); MimeMultipart mmp = new MimeMultipart(); mmp.addBodyPart(text); mmp.addBodyPart(image); mmp.setSubType("related"); msg.setContent(mmp); msg.saveChanges();
ts.sendMessage(msg, msg.getAllRecipients()); ts.close(); } }
(4)发送包含附件的图片
package mail; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; /** * 邮件发送服务 */ public class SendMailService { /** * 发送含附件邮件 * @param smtpHost 邮件服务器 * @param to 收件人(能够是多个,使用逗号分隔) * @param cc 抄送人(能够是多个,使用逗号分隔) * @param bcc密送人(能够是多个,使用逗号分隔) * @param sender发件人 * @param title邮件标题 * @param username邮箱用户名(通常是去掉@以前的那一部分) * @param password(邮箱密码) * @throws MessagingException */ public static void sendAttachEmail(String smtpHost, String to, String cc, String bcc, String sender, String title, String username, String password) throws MessagingException { Properties props = new Properties(); props.put("mail.host", smtpHost); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props); session.setDebug(true); Transport ts = session.getTransport(); ts.connect(smtpHost, username, password); //建立含图片邮件 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(sender)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc)); msg.setSubject(title); msg.setSentDate(new Date()); //邮件正文文本 MimeBodyPart text = new MimeBodyPart(); text.setContent("使用JavaMail建立的带附件的邮件", "text/html;charset=UTF-8"); //邮件附件 MimeBodyPart attach = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("src\\576f707a5ba85.JPG")); attach.setDataHandler(dh); attach.setFileName(dh.getName()); //建立个区块之间关系 MimeMultipart mmp = new MimeMultipart(); mmp.addBodyPart(text); mmp.addBodyPart(attach); mmp.setSubType("mixed"); msg.setContent(mmp); msg.saveChanges(); ts.sendMessage(msg, msg.getAllRecipients()); ts.close(); } }
(5)发送包含内嵌图片和附件的复杂邮件
package mail; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Date; import java.util.Properties; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.URLName; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; /** * 邮件发送服务 */ public class SendMailService { /** * 发送含附件邮件 * @param smtpHost 邮件服务器 * @param to 收件人(能够是多个,使用逗号分隔) * @param cc 抄送人(能够是多个,使用逗号分隔) * @param bcc密送人(能够是多个,使用逗号分隔) * @param sender发件人 * @param title邮件标题 * @param username邮箱用户名(通常是去掉@以前的那一部分) * @param password(邮箱密码) * @throws MessagingException * @throws IOException * @throws FileNotFoundException */ public static void sendComplexEmail(String smtpHost, String to, String cc, String bcc, String sender, String title, String username, String password) throws MessagingException, FileNotFoundException, IOException { Properties props = new Properties(); props.put("mail.host", smtpHost); props.put("mail.transport.protocol", "smtp"); props.put("mail.smtp.auth", "true"); Session session = Session.getDefaultInstance(props); session.setDebug(true); Transport ts = session.getTransport(); ts.connect(smtpHost, username, password); //建立含图片邮件 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(sender)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setRecipients(Message.RecipientType.CC, InternetAddress.parse(cc)); msg.setRecipients(Message.RecipientType.BCC, InternetAddress.parse(bcc)); msg.setSubject(title); msg.setSentDate(new Date()); //邮件正文文本 MimeBodyPart text = new MimeBodyPart(); text.setContent("测试<br/><img src='cid:1.PNG'>","text/html;charset=UTF-8"); //图片 MimeBodyPart image = new MimeBodyPart(); image.setContentID("1.PNG"); image.setDataHandler(new DataHandler(new FileDataSource("src\\1.PNG"))); //附件1 MimeBodyPart attach1 = new MimeBodyPart(); DataHandler dh = new DataHandler(new FileDataSource("src\\1.rar")); attach1.setDataHandler(dh); attach1.setFileName(dh.getName()); //附件2 注意附件名是中文名 MimeBodyPart attach2 = new MimeBodyPart(); DataHandler dh2 = new DataHandler(new FileDataSource("src\\测试中文附件名.rar")); attach2.setDataHandler(dh2); attach2.setFileName(MimeUtility.encodeText(dh2.getName())); //描述关系:正文和图片 MimeMultipart mp1 = new MimeMultipart(); mp1.addBodyPart(text); mp1.addBodyPart(image); mp1.setSubType("related"); //将正文和图片组合做为一个总体 的正文内容 MimeBodyPart content = new MimeBodyPart(); content.setContent(mp1); //描述关系:正文和附件 MimeMultipart mp2 = new MimeMultipart(); mp2.addBodyPart(attach1); mp2.addBodyPart(attach2); mp2.addBodyPart(content); mp2.setSubType("mixed"); //message设置邮件内容 msg.setContent(mp2); msg.saveChanges(); msg.writeTo(new FileOutputStream("E:\\MixedMail.eml")); ts.sendMessage(msg, msg.getAllRecipients()); ts.close(); } }
4、使用java mail 接收邮件
基本步骤:
1 利用Properties建立一个属性,不须要设置任何属性,之间传递Session使用
2 Session.getDefaultInstance()获取一个邮件会话
3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3");获取一个Store
4 存储库向指定的邮件服务器创建链接
5 经过getFolder("INBOX"),获取该存储库中INBOX文件夹
6 打开INBOX文件夹
7 消息处理
8 关闭文件夹
9 关闭存储库
package mail; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Enumeration; import java.util.Properties; import javax.mail.Folder; import javax.mail.Header; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeUtility; public class ReceiveMailService { public static void receiveMail(String popHost, String username,String password) throws MessagingException, IOException { //1 利用Properties建立一个属性,不须要设置任何属性,之间传递Session使用 Properties props = new Properties(); //props.put("mail.host", smtpHost); //props.put("mail.smtp.auth", "true"); //props.put("mail.transport.protocol", "smtp"); //props.put("mail.transport.port", "25"); props.put("mail.store.port", "pop3"); //2 Session.getDefaultInstance()获取一个邮件会话 Session session = Session.getDefaultInstance(props); //3 使用该会话向某种提供者请求一个存储库,ss.getStore("pop3"); 也能够是IMAP 获取一个Store Store store = session.getStore("pop3"); //4 存储库向指定的邮件服务器创建链接 store.connect(popHost, username, password); //5 经过getFolder("INBOX"),获取该存储库中INBOX文件夹 Folder folder = store.getFolder("INBOX"); //6 打开INBOX文件夹 folder.open(Folder.READ_ONLY); //7 消息处理 Message[] messages = folder.getMessages(); for (int i = 0; i < messages.length; i++) { System.out.println("------------Message--" + (i + 1) + "------------"); // 解析地址为字符串 发件人 String from = InternetAddress.toString(messages[i].getFrom()); if (from != null) { String cin = getChineseFrom(from); System.out.println("From:" + cin); } //回复给发件人 String replyTo = InternetAddress.toString(messages[i].getReplyTo()); if (replyTo != null) { String rest = getChineseFrom(replyTo); System.out.println("Reply To:" + rest); } // String to = InternetAddress.toString(messages[i].getRecipients(Message.RecipientType.TO)); if (to != null) { String tos = getChineseFrom(to); System.out.println("To:" + tos); } //邮件主题 String subject = messages[i].getSubject(); if (subject != null) { System.out.println("Subject:" + subject); } //发送日期 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date sent = messages[i].getSentDate(); if (sent != null) { System.out.println("Sent Date:" + sdf.format(sent)); } //接收日期 Date ress = messages[i].getReceivedDate(); if (ress != null) { System.out.println("Receive Date:" + sdf.format(ress)); } // 显示消息的全部首部信息 Enumeration<Header> headers = messages[i].getAllHeaders(); while(headers.hasMoreElements()) { Header h=(Header)headers.nextElement(); String res=h.getName(); String val=h.getValue(); System.out.println(res+":"+val); } System.out.println(); //读取消息主题部分 Object content = messages[i].getContent(); System.out.println(content); //根据指定的编码格式读出内容 Reader read = new InputStreamReader(messages[i].getInputStream()); int a=0; while((a=read.read())!=-1) { System.out.print((char)a); } //获取该消息的类型 String type=messages[i].getContentType(); String sender=InternetAddress.toString(messages[i].getFrom()); System.out.println("Sender:"+sender); System.out.println("Content-type:"+type); } //8 关闭文件夹但不删除服务器上的消息 false表明不是删除 folder.close(false);//当为true时会删掉已经标记为删除的邮件 //9 关闭存储库 store.close(); } // 解决中文乱码问题 public static String getChineseFrom(String res) { String from = res; try { if (from.startsWith("=?GB") || from.startsWith("=?gb") || from.startsWith("=?UTF")) { from = MimeUtility.decodeText(from); } else { from = new String(from.getBytes("ISO8859_1"), "GBK"); } } catch (Exception e) { e.printStackTrace(); } return from; } public static void main(String[] args) { try { receiveMail("pop3.163.com", "cac2020", "fadgfjkssdfkasjg"); } catch (Exception e) { e.printStackTrace(); } } }
参考:
http://blog.csdn.net/ghsau/article/details/17839983
http://www.cnblogs.com/xdp-gacl/p/4216311.html
http://computerdragon.blog.51cto.com/6235984/1197390
http://blog.sina.com.cn/s/blog_67196ddc0101fdrn.html