TestRe.java
上传用户:liangcc
上传日期:2019-05-24
资源大小:4412k
文件大小:11k
源码类别:

WEB邮件程序

开发平台:

Java

  1. package com.softeem.webmail.action.receivemail;
  2. import java.io.*;
  3. import java.text.*;
  4. import java.util.*;
  5. import javax.mail.*;
  6. import javax.mail.internet.*;
  7. /**
  8.  * @author Administrator
  9.  * 
  10.  */
  11. public class TestRe {
  12. private MimeMessage mimeMessage = null;
  13. private String saveAttachPath = "";// 附件下载后的存放目录
  14. private StringBuffer bodytext = new StringBuffer();
  15. // 存放邮件内容的StringBuffer对象
  16. private String dateformat = "yy-MM-dd HH:mm";// 默认的日前显示格式
  17. /**
  18.  * 构造函数,初始化一个MimeMessage对象
  19.  */
  20. public TestRe() {
  21. }
  22. public TestRe(MimeMessage mimeMessage) {
  23. this.mimeMessage = mimeMessage;
  24. System.out.println("create a PraseMimeMessage object........");
  25. }
  26. public void setMimeMessage(MimeMessage mimeMessage) {
  27. this.mimeMessage = mimeMessage;
  28. }
  29. /**
  30.  * 
  31.  * 获取发件人的姓名和密码
  32.  * 
  33.  * @return
  34.  */
  35. public String getFrom() throws Exception {
  36. InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
  37. String from = address[0].getAddress();
  38. if (from == null)
  39. from = "";
  40. String personal = address[0].getPersonal();
  41. if (personal == null)
  42. personal = "";
  43. String fromaddr = personal + "<" + from + ">";
  44. return fromaddr;
  45. }
  46. /**
  47.  * 获得邮件的收件人,抄送,和密送的地址和姓名,根据所传递的参数的不同 "to"----收件人 "cc"---抄送人地址 "bcc"---密送人地址
  48.  */
  49. public String getMailAddress(String type) throws Exception {
  50. String mailaddr = "";
  51. String addtype = type.toUpperCase();
  52. InternetAddress[] address = null;
  53. if (addtype.equals("TO") || addtype.equals("CC")
  54. || addtype.equals("BCC"))
  55. {
  56. if (addtype.equals("TO")) {
  57. address = (InternetAddress[]) mimeMessage
  58. .getRecipients(Message.RecipientType.TO);
  59. } else if (addtype.equals("CC")) {
  60. address = (InternetAddress[]) mimeMessage
  61. .getRecipients(Message.RecipientType.CC);
  62. } else {
  63. address = (InternetAddress[]) mimeMessage
  64. .getRecipients(Message.RecipientType.BCC);
  65. }
  66. if (address != null) {
  67. for (int i = 0; i < address.length; i++) {
  68. String email = address[i].getAddress();
  69. if (email == null)
  70. email = "";
  71. else {
  72. email = MimeUtility.decodeText(email);
  73. }
  74. String personal = address[i].getPersonal();
  75. if (personal == null)
  76. personal = "";
  77. else {
  78. personal = MimeUtility.decodeText(personal);
  79. }
  80. String compositeto = personal + "<" + email + ">";
  81. mailaddr += "," + compositeto;
  82. }
  83. mailaddr = mailaddr.substring(1);
  84. }
  85. } else {
  86. throw new Exception("Error emailaddr type!");
  87. }
  88. return mailaddr;
  89. }
  90. /**
  91.  * 
  92.  * 获取邮件主题
  93.  */
  94. public String getSubject() throws MessagingException {
  95. String subject = "";
  96. try {
  97. subject = MimeUtility.decodeText(mimeMessage.getSubject());
  98. if (subject == null)
  99. subject = "";
  100. } catch (Exception exce) {
  101. }
  102. return subject;
  103. }
  104. /*
  105.  * 获取邮件发送日期
  106.  * 
  107.  */
  108. public String getSentDate() throws Exception {
  109. Date sentdate = mimeMessage.getSentDate();
  110. SimpleDateFormat format = new SimpleDateFormat(dateformat);
  111. return format.format(sentdate);
  112. }
  113. /**
  114.  * 获取邮件正文
  115.  * 
  116.  * @return
  117.  * 
  118.  */
  119. public String getBodyText() {
  120. return bodytext.toString();
  121. }
  122. /**
  123.  * 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
  124.  * 
  125.  * 
  126.  */
  127. public void getMailContent(Part part) throws Exception {
  128. String contenttype = part.getContentType();
  129. int nameindex = contenttype.indexOf("name");
  130. boolean conname = false;
  131. if (nameindex != -1)
  132. conname = true;
  133. System.out.println("CONTENTTYPE: " + contenttype);
  134. if (part.isMimeType("text/plain") && !conname) {
  135. bodytext.append((String) part.getContent());
  136. // else if (part.isMimeType("text/html") && !conname) {
  137. // bodytext.append((String) part.getContent());
  138. // } 
  139. // else if (part.isMimeType("multipart/*")) {
  140. // Multipart multipart = (Multipart) part.getContent();
  141. // int counts = multipart.getCount();
  142. // for (int i = 0; i < counts; i++) {
  143. // getMailContent(multipart.getBodyPart(i));
  144. // }
  145. // } 
  146. // else if (part.isMimeType("message/rfc822")) {
  147. // getMailContent((Part) part.getContent());
  148. // } 
  149. else {
  150. }
  151. }
  152. /**
  153.  * 
  154.  * 判断此邮件是否需要回执,如果需要回执返回"true",否则返回"false"
  155.  * 
  156.  */
  157. public boolean getReplySign() throws MessagingException {
  158. boolean replysign = false;
  159. String needreply[] = mimeMessage
  160. .getHeader("Disposition-Notification-To");
  161. if (needreply != null) {
  162. replysign = true;
  163. }
  164. return replysign;
  165. }
  166. /*
  167.  * 获得此邮件的Message-ID
  168.  * 
  169.  */
  170. public String getMessageId() throws MessagingException {
  171. return mimeMessage.getMessageID();
  172. }
  173. /*
  174.  * 【判断此邮件是否已读,如果未读返回返回false,反之返回true】
  175.  * 
  176.  */
  177. public boolean isNew() throws MessagingException {
  178. boolean isnew = false;
  179. Flags flags = ((Message) mimeMessage).getFlags();
  180. Flags.Flag[] flag = flags.getSystemFlags();
  181. System.out.println("flags's length: " + flag.length);
  182. for (int i = 0; i < flag.length; i++) {
  183. if (flag[i] == Flags.Flag.SEEN) {
  184. isnew = true;
  185. System.out.println("seen Message.......");
  186. break;
  187. }
  188. }
  189. return isnew;
  190. }
  191. /**
  192.  * 
  193.  * 判断此邮件是否包含附件
  194.  * 
  195.  */
  196. public boolean isContainAttach(Part part) throws Exception {
  197. boolean attachflag = false;
  198. String contentType = part.getContentType();
  199. if (part.isMimeType("multipart/*")) {
  200. Multipart mp = (Multipart) part.getContent();
  201. for (int i = 0; i < mp.getCount(); i++) {
  202. BodyPart mpart = mp.getBodyPart(i);
  203. String disposition = mpart.getDisposition();
  204. if ((disposition != null)
  205. && ((disposition.equals(Part.ATTACHMENT)) || (disposition
  206. .equals(Part.INLINE))))
  207. attachflag = true;
  208. else if (mpart.isMimeType("multipart/*")) {
  209. attachflag = isContainAttach((Part) mpart);
  210. } else {
  211. String contype = mpart.getContentType();
  212. if (contype.toLowerCase().indexOf("application") != -1)
  213. attachflag = true;
  214. if (contype.toLowerCase().indexOf("name") != -1)
  215. attachflag = true;
  216. }
  217. }
  218. } else if (part.isMimeType("message/rfc822")) {
  219. attachflag = isContainAttach((Part) part.getContent());
  220. }
  221. return attachflag;
  222. }
  223. /*
  224.  * 保存附件
  225.  * 
  226.  */
  227. public void saveAttachMent(Part part) throws Exception {
  228. String fileName = "";
  229. if (part.isMimeType("multipart/*")) {
  230. Multipart mp = (Multipart) part.getContent();
  231. for (int i = 0; i < mp.getCount(); i++) {
  232. BodyPart mpart = mp.getBodyPart(i);
  233. String disposition = mpart.getDisposition();
  234. if ((disposition != null)
  235. && ((disposition.equals(Part.ATTACHMENT)) || (disposition
  236. .equals(Part.INLINE)))) {
  237. fileName = mpart.getFileName();
  238. if (fileName.toLowerCase().indexOf("gb2312") != -1) {
  239. fileName = MimeUtility.decodeText(fileName);
  240. }
  241. // saveFile(fileName,mpart.getInputStream());
  242. saveFile(fileName, mpart.getInputStream());
  243. } else if (mpart.isMimeType("multipart/*")) {
  244. saveAttachMent(mpart);
  245. } else {
  246. fileName = mpart.getFileName();
  247. if ((fileName != null)
  248. && (fileName.toLowerCase().indexOf("GB2312") != -1)) {
  249. fileName = MimeUtility.decodeText(fileName);
  250. saveFile(fileName, mpart.getInputStream());
  251. }
  252. }
  253. }
  254. } else if (part.isMimeType("message/rfc822")) {
  255. saveAttachMent((Part) part.getContent());
  256. }
  257. }
  258. /**
  259.  * 【设置附件存放路径】
  260.  */
  261. public void setAttachPath(String attachpath) {
  262. this.saveAttachPath = attachpath;
  263. }
  264. /**
  265.  * 
  266.  * 设置日期显示本格式
  267.  */
  268. public void setDateFormat(String format) throws Exception {
  269. this.dateformat = format;
  270. }
  271. /**
  272.  * 【获得附件存放路径】
  273.  */
  274. public String getAttachPath() {
  275. return saveAttachPath;
  276. }
  277. /**
  278.  * 【真正的保存附件到指定目录里】
  279.  */
  280. private void saveFile(String fileName, InputStream in) throws Exception {
  281. String osName = System.getProperty("os.name");
  282. String storedir = getAttachPath();
  283. String separator = "";
  284. if (osName == null)
  285. osName = "";
  286. if (osName.toLowerCase().indexOf("win") != -1) {
  287. separator = "\";
  288. if (storedir == null || storedir.equals(""))
  289. storedir = "c:\tmp";
  290. } else {
  291. separator = "/";
  292. storedir = "/tmp";
  293. }
  294. File storefile = new File(storedir + separator + fileName);
  295. System.out.println("storefile's path: " + storefile.toString());
  296. BufferedOutputStream bos = null;
  297. BufferedInputStream bis = null;
  298. try {
  299. bos = new BufferedOutputStream(new FileOutputStream(storefile));
  300. bis = new BufferedInputStream(in);
  301. int c;
  302. while ((c = bis.read()) != -1) {
  303. bos.write(c);
  304. bos.flush();
  305. }
  306. } catch (Exception exception) {
  307. exception.printStackTrace();
  308. throw new Exception("文件保存失败!");
  309. } finally {
  310. bos.close();
  311. bis.close();
  312. }
  313. }
  314. /**
  315.  * PraseMimeMessage类测试
  316.  */
  317. public static void main(String args[]) throws Exception {
  318. String host = "POP3.163.com";// 【POP3.163.com】
  319. String username = "yuxia2217";// 【yuxia2217】
  320. String password = "*************";// 【........】
  321. Properties props = new Properties();
  322. Session session = Session.getDefaultInstance(props, null);
  323. Store store = session.getStore("pop3");
  324. store.connect(host, username, password);
  325. Folder folder = store.getFolder("INBOX");
  326. folder.open(Folder.READ_ONLY);
  327. Message message[] = folder.getMessages();
  328. System.out.println("Messages's length: " + message.length);
  329. TestRe pmm = null;
  330. for (int i = 0; i < message.length; i++) {
  331. pmm = new TestRe((MimeMessage) message[i]);
  332. System.out
  333. .println("Message " + i + " subject: " + pmm.getSubject());
  334. System.out.println("Message " + i + " sentdate: "
  335. + pmm.getSentDate());
  336. System.out.println("Message " + i + " replysign: "
  337. + pmm.getReplySign());
  338. System.out.println("Message " + i + " hasRead: " + pmm.isNew());
  339. System.out.println("Message " + i + "  containAttachment: "
  340. + pmm.isContainAttach((Part) message[i]));
  341. System.out.println("Message " + i + " form: " + pmm.getFrom());
  342. System.out.println("Message " + i + " to: "
  343. + pmm.getMailAddress("to"));
  344. System.out.println("Message " + i + " cc: "
  345. + pmm.getMailAddress("cc"));
  346. System.out.println("Message " + i + " bcc: "
  347. + pmm.getMailAddress("bcc"));
  348. pmm.setDateFormat("yy年MM月dd日 HH:mm");
  349. System.out.println("Message " + i + " sentdate: "
  350. + pmm.getSentDate());
  351. System.out.println("Message " + i + " Message-ID: "
  352. + pmm.getMessageId());
  353. pmm.getMailContent((Part) message[i]);
  354. System.out.println("Message " + i + " bodycontent: rn"
  355. + pmm.getBodyText());
  356. pmm.setAttachPath("c:\tmp\coffeecat1124");
  357. pmm.saveAttachMent((Part) message[i]);
  358. }
  359. }
  360. }