【JavaEE】经典JAVA EE企业应用实战-读书笔记8

来源:互联网 发布:无人深空低配优化补丁 编辑:程序博客网 时间:2024/06/07 19:26

使用JavaMail接收邮件

1)创建邮件Session实例

2)以Session实例获取邮件存储对象Store。调用Store对象的connect方法执行连接

3)调用Store对象的getFolder方法来获取指定的邮件文件夹

4)调用Folderopen方法打开指定的邮件文件夹,接下来就可执行他的getMessage方法来获取该文件夹内所有的邮件了

遍历每封邮件,提取邮件内容


public class ReceiveMail {private final static String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";// 用户账号private String account;// 密码private String password;// POP3邮件服务器private String pop3Host;// POP3的端口private int pop3Port;// 省略set和get方法private Sotre store;public Store getStore() {if (this.store == null || !this.store.isConnected()) {try {Properties props = new Properties();if (isGmail()) {props.setproperty("mail.pop3.socketFactory.class", SSL_FACTORY);}Session session = Session.getDefaultInstance(props);// 使用POP3协议接收邮件URLName url = new URLName("pop3", getPop3Host(), getPop3Port(), null, getAccount(), getPassword());Store store = session.getStore(url);store.connect();this.store = store;} catch (Exception e) {e.printStackTrace();System.out.println("连接邮箱异常,请检查连接信息");}}return this.store;}// 对于Gmail的邮箱需要特别处理private boolean isGmail() {if (this.account == null || this.account.trim().equals("")) {return false;}if (this.account.lastIndexOf("@gmail.com") != -1) {return true;}return false;}public void getMessages() {// 获取收件箱try {Folder inbox = getStore().getFolder("INBOX");inbox.open(Folder.READ_WRITE);// 等到INBOX里的所有信息Message[] messages = inbox.getMessages();for (int i = 0; i < messages.length; i++) {System.out.println("第" + (i + 1) + "封邮件的信息");printMessage(messages[i]);}} catch (Exception e) {e.printStackTrace();System.out.println("读取邮件信息出错");}}// 得到接收的日期,优先返回发送日期,其次返回收信日期public Date getReceivedDate(Message m) throws Exception {if (m.getSentDate() != null) {return m.getSentDate();}if (m.getReceiveDate != null) {return m.getReceiveDate();}return new Date();}// 得到抄送的地址public List<String> getCC(Message m) throws Exception {Address[] addresses = m.getRecipients(Message.RecipientType.CC);return getAddresses(addresses);}// 得到文件名的后缀private String getFileSuffix(String fileName) {if (fileName == null || fileName.trim().equals("")) {return "";}int dotPos = fileName.lastIndexOf(".");if (dotPos != -1) {return fileName.substring(dotPos);}return "";}// 获得邮件的附件public List<FileObject> getFiles(Message m) throws Exception {List<FileObject> files = new ArrayList<FileObject>();// 是混合类型,就进行处理if (m.isMimeType("multipart/mixed")) {Multipartt mp = (Multipart) m.getContent();// 得到邮件内容的Multipart对象并得到内容中Part的数量int count = mp.getCount();for (int i = 1; i < count; i++) {// 获取附件Part part = mp.getBodyPart(i);// 获取邮件附件名String sercerFileName = MimeUtility.decodeText(part.getFileName());// 生产UUID作为在本地系统中唯一的文件标识String fileName = UUID.randomUUID().toString();File file = new File(fileName + getFileSuffix(serverFileName));// 读写文件FileOutputStream fos = new FileOutputStream(file);InputStream is = part.getInputStream();BufferedOutputStream outs = new BufferedOutputStream(fos);// 使用IO流读取邮件附件byte[] b = new byte[1024];int hasRead = 0;while ((hasRead = is.read(b)) > 0) {outs.write(b, 0, hasRead);}outs.close();is.close();fos.close();FileObject fileObject = new FileObject(serverFileName, file);files.add(fileObject);}}return files;}// 处理邮件正文的工具方法private StringBuffer getContent(Part part, StringBuffer result) throws Exception {if (part.isMimeType("multipart/*")) {Multipart p = (Multipart) part.getContent();int count = p.getCount();// Multipart的第一部分是text/plain// 第二部分是text/html的格式,只解析第一部分即可if (count > 1)count = 1;for (int i = 0; i < count; i++) {BodyPart bp = p.getBodyPart(i);// 递归调用getContent(bp, result);}} else if (part.isMimeType("text/*")) {result.append(part.getContent());}return result;}// 返回邮件正文内容public String getContent(Message m) throws Exception {StringBuffer sb = new StringBuffer("");return getContent(m, sb).toString();}// 判断一封邮件是否已读,true表示已读,false表示没有读取public boolean hasRead(Message m) throws Exception {Flags flags = m.getFlages();return flags.contains(Flags.Flag.SEEN);}// 得到一封邮件的所有收件人public List<String> getAllRecipients(Message m) throws Exception {Address[] addresses = m.getAllRecipients();return getAddresses(addresses);}// 工具方法,将参数的地址字符串封装成集合public List<String> getAddresses(Address[] addresses) {List<String> result = new ArrayList<String>();if (addresses == null) {return result;}for (Address a : addresses) {result.add(a.toString());}return result;}// 得到发送人的地址public String getSender(Message m) throws Exception {Address[] addresses = m.getForm();return MimeUtility.decodeText(addresses[0].toString());}// 打印Message的信息public void printMessage(Message m) throws Exception {System.out.println(m.toString());System.out.println("接收日期" + getReceivedDate(m));System.out.println("抄送地址" + getCC());System.out.println("是否已读" + hasRead(m));System.out.println("所有收件人" + getAllRecipients(m));System.out.println("发件人地址" + getSender(m));System.out.println("邮件正文\n" + getContent(m));System.out.println("附件信息" + getFiles(m));}public static void main(String[] args) throws Exception {ReceiveMail rec = new ReceiveMail();rec.setPop3Host("pop3.sina.com");rec.setPop3Port(110);...rec.getMessages();}}

0 0