用Java代码凭借邮箱及账号获取邮箱内容,这个需要不是很常见,笔者是突然有一需求要把邮件内容展示在网页端上,然后不断的百度,遇到了很多坑或者一些资料不全的文档,最终终终于找到了一个质量非常高的代码,这篇文章也是想把这个demo进行收录,防止源文档被删掉。
代码展示
原文作者:一曲破东风@CSDN
代码的注释相对来说是完善的,我就暂时不做完善啦😁,如果有需要欢迎在评论区评论。🤔
import java.io.*;import java.text.*;import java.util.*;import javax.mail.*;import javax.mail.internet.*;/*** 有一封邮件就需要建立一个ReciveMail对象*/public class ReciveOneMail {private MimeMessage mimeMessage = null;private String saveAttachPath = ""; //附件下载后的存放目录private StringBuffer bodytext = new StringBuffer();//存放邮件内容private String dateformat = "yy-MM-dd HH:mm"; //默认的日前显示格式public ReciveOneMail(MimeMessage mimeMessage) {this.mimeMessage = mimeMessage;}public void setMimeMessage(MimeMessage mimeMessage) {this.mimeMessage = mimeMessage;}/*** 获得发件人的地址和姓名*/public String getFrom() throws Exception {InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();String from = address[0].getAddress();if (from == null)from = "";String personal = address[0].getPersonal();if (personal == null)personal = "";String fromaddr = personal + "<" + from + ">";return fromaddr;}/*** 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址*/public String getMailAddress(String type) throws Exception {String mailaddr = "";String addtype = type.toUpperCase();InternetAddress[] address = null;if (addtype.equals("TO") || addtype.equals("CC")|| addtype.equals("BCC")) {if (addtype.equals("TO")) {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.TO);} else if (addtype.equals("CC")) {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.CC);} else {address = (InternetAddress[]) mimeMessage.getRecipients(Message.RecipientType.BCC);}if (address != null) {for (int i = 0; i < address.length; i++) {String email = address[i].getAddress();if (email == null)email = "";else {email = MimeUtility.decodeText(email);}String personal = address[i].getPersonal();if (personal == null)personal = "";else {personal = MimeUtility.decodeText(personal);}String compositeto = personal + "<" + email + ">";mailaddr += "," + compositeto;}mailaddr = mailaddr.substring(1);}} else {throw new Exception("Error emailaddr type!");}return mailaddr;}/*** 获得邮件主题*/public String getSubject() throws MessagingException {String subject = "";try {subject = MimeUtility.decodeText(mimeMessage.getSubject());if (subject == null)subject = "";} catch (Exception exce) {}return subject;}/*** 获得邮件发送日期*/public String getSentDate() throws Exception {Date sentdate = mimeMessage.getSentDate();SimpleDateFormat format = new SimpleDateFormat(dateformat);return format.format(sentdate);}/*** 获得邮件正文内容*/public String getBodyText() {return bodytext.toString();}/*** 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析*/public void getMailContent(Part part) throws Exception {String contenttype = part.getContentType();int nameindex = contenttype.indexOf("name");boolean conname = false;if (nameindex != -1)conname = true;System.out.println("CONTENTTYPE: " + contenttype);if (part.isMimeType("text/plain") && !conname) {bodytext.append((String) part.getContent());} else if (part.isMimeType("text/html") && !conname) {bodytext.append((String) part.getContent());} else if (part.isMimeType("multipart/*")) {Multipart multipart = (Multipart) part.getContent();int counts = multipart.getCount();for (int i = 0; i < counts; i++) {getMailContent(multipart.getBodyPart(i));}} else if (part.isMimeType("message/rfc822")) {getMailContent((Part) part.getContent());} else {}}/*** 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"*/public boolean getReplySign() throws MessagingException {boolean replysign = false;String needreply[] = mimeMessage.getHeader("Disposition-Notification-To");if (needreply != null) {replysign = true;}return replysign;}/*** 获得此邮件的Message-ID*/public String getMessageId() throws MessagingException {return mimeMessage.getMessageID();}/*** 【判断此邮件是否已读,如果未读返回返回false,反之返回true】*/public boolean isNew() throws MessagingException {boolean isnew = false;Flags flags = ((Message) mimeMessage).getFlags();Flags.Flag[] flag = flags.getSystemFlags();System.out.println("flags's length: " + flag.length);for (int i = 0; i < flag.length; i++) {if (flag[i] == Flags.Flag.SEEN) {isnew = true;System.out.println("seen Message.......");break;}}return isnew;}/*** 判断此邮件是否包含附件*/public boolean isContainAttach(Part part) throws Exception {boolean attachflag = false;String contentType = part.getContentType();if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();for (int i = 0; i < mp.getCount(); i++) {BodyPart mpart = mp.getBodyPart(i);String disposition = mpart.getDisposition();if ((disposition != null)&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE))))attachflag = true;else if (mpart.isMimeType("multipart/*")) {attachflag = isContainAttach((Part) mpart);} else {String contype = mpart.getContentType();if (contype.toLowerCase().indexOf("application") != -1)attachflag = true;if (contype.toLowerCase().indexOf("name") != -1)attachflag = true;}}} else if (part.isMimeType("message/rfc822")) {attachflag = isContainAttach((Part) part.getContent());}return attachflag;}/*** 【保存附件】*/public void saveAttachMent(Part part) throws Exception {String fileName = "";if (part.isMimeType("multipart/*")) {Multipart mp = (Multipart) part.getContent();for (int i = 0; i < mp.getCount(); i++) {BodyPart mpart = mp.getBodyPart(i);String disposition = mpart.getDisposition();if ((disposition != null)&& ((disposition.equals(Part.ATTACHMENT)) || (disposition.equals(Part.INLINE)))) {fileName = mpart.getFileName();if (fileName.toLowerCase().indexOf("gb2312") != -1) {fileName = MimeUtility.decodeText(fileName);}saveFile(fileName, mpart.getInputStream());} else if (mpart.isMimeType("multipart/*")) {saveAttachMent(mpart);} else {fileName = mpart.getFileName();if ((fileName != null)&& (fileName.toLowerCase().indexOf("GB2312") != -1)) {fileName = MimeUtility.decodeText(fileName);saveFile(fileName, mpart.getInputStream());}}}} else if (part.isMimeType("message/rfc822")) {saveAttachMent((Part) part.getContent());}}/*** 【设置附件存放路径】*/public void setAttachPath(String attachpath) {this.saveAttachPath = attachpath;}/*** 【设置日期显示格式】*/public void setDateFormat(String format) throws Exception {this.dateformat = format;}/*** 【获得附件存放路径】*/public String getAttachPath() {return saveAttachPath;}/*** 【真正的保存附件到指定目录里】*/private void saveFile(String fileName, InputStream in) throws Exception {String osName = System.getProperty("os.name");String storedir = getAttachPath();String separator = "";if (osName == null)osName = "";if (osName.toLowerCase().indexOf("win") != -1) {separator = "\\";if (storedir == null || storedir.equals(""))storedir = "c:\\tmp";} else {separator = "/";storedir = "/tmp";}File storefile = new File(storedir + separator + fileName);System.out.println("storefile's path: " + storefile.toString());// for(int i=0;storefile.exists();i++){// storefile = new File(storedir+separator+fileName+i);// }BufferedOutputStream bos = null;BufferedInputStream bis = null;try {bos = new BufferedOutputStream(new FileOutputStream(storefile));bis = new BufferedInputStream(in);int c;while ((c = bis.read()) != -1) {bos.write(c);bos.flush();}} catch (Exception exception) {exception.printStackTrace();throw new Exception("文件保存失败!");} finally {bos.close();bis.close();}}/*** PraseMimeMessage类测试*/public static void main(String args[]) throws Exception {Properties props = System.getProperties();props.put("mail.smtp.host", "smtp.163.com");props.put("mail.smtp.auth", "true");Session session = Session.getDefaultInstance(props, null);URLName urln = new URLName("pop3", "pop3.163.com", 110, null,"xiangzhengyan", "pass");Store store = session.getStore(urln);store.connect();Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();System.out.println("Messages's length: " + message.length);ReciveOneMail pmm = null;for (int i = 0; i < message.length; i++) {System.out.println("======================");pmm = new ReciveOneMail((MimeMessage) message[i]);System.out.println("Message " + i + " subject: " + pmm.getSubject());System.out.println("Message " + i + " sentdate: "+ pmm.getSentDate());System.out.println("Message " + i + " replysign: "+ pmm.getReplySign());System.out.println("Message " + i + " hasRead: " + pmm.isNew());System.out.println("Message " + i + " containAttachment: "+ pmm.isContainAttach((Part) message[i]));System.out.println("Message " + i + " form: " + pmm.getFrom());System.out.println("Message " + i + " to: "+ pmm.getMailAddress("to"));System.out.println("Message " + i + " cc: "+ pmm.getMailAddress("cc"));System.out.println("Message " + i + " bcc: "+ pmm.getMailAddress("bcc"));pmm.setDateFormat("yy年MM月dd日 HH:mm");System.out.println("Message " + i + " sentdate: "+ pmm.getSentDate());System.out.println("Message " + i + " Message-ID: "+ pmm.getMessageId());// 获得邮件内容===============pmm.getMailContent((Part) message[i]);System.out.println("Message " + i + " bodycontent: \r\n"+ pmm.getBodyText());pmm.setAttachPath("c:\\");pmm.saveAttachMent((Part) message[i]);}}}
