javaMail應用
JavaMail API是读取、撰写、发送电子信息的可选包。 一、环境配置: 为了运行Javamail。我们需要在classpath里导入两个包:mail.jar和activation.jar, mail.jar实现提供了对SMTP、IMAP4、POP3的支持,activation.jar增加了对任何数据块的分类、以及对它们的处理的特性。这些特性是JavaMail API需要的 为了要发送邮件和接收邮件,我们必须要遵守smtp和pop3协议,不过还有其它协议也可执行(如IMAP)。如果把本机当作服务器来发送邮件可在http://jakrata.网站里下载james邮件服务器,然后解压在本机上。运行james/bin里的run.bat就可以启动了服务器。 在DOS里登录邮件服务器命令為:telnet localhost 4555 增加邮箱用户名命令為:adduser 用戶名 密碼 如:adduser fyc fyc 就建立了这样一个邮箱fyc@localhost 密码为:fyc 如果想要更多功能用help命令。 注意:如果在本机装了邮件服务器的话,只能在本机局域网里申请邮箱,发送和接收。不能发送到外部的邮箱里去。如果用外部的邮件服务器像比如163的服务器等就可以随心所欲的发邮件了。 二、相關協議介紹: 常用到的協議為SMTP、POP、MIME、IMAP,雖然JavaMail API是被设计为與协议无关的,但如果我们使用的功能并不被我们选择的协议支持,那么JavaMail API就不可能發揮它提功能。 1.SMTP 简单邮件传输协议定义了递送邮件的机制。我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。这个SMTP服务器将邮件转发到接收者的SMTP服务器,直至最后被接收者通过POP或者IMAP协议获取。 2.POP POP是一种邮局协议,目前为第3个版本,即POP3。POP定义了一种用户如何获得邮件的机制。它规定了每个用户使用一个单独的邮箱。 3.MIME MIME并不是用于传送邮件的协议,它作为多用途邮件的扩展定义了邮件内容的格式:信息格式、附件格式等等。 4.IMAP IMAP使用在接收信息的高级协议,目前版本为第4版,所以也被称为IMAP4。需要注意的是在使用IMAP时,邮件服务器必须支持该协议。从这个方面讲,我们并不能完全使用IMAP来替代POP,不能期待IMAP在任何地方都被支持。假如邮件服务器支持IMAP,那么我们的邮件程序将能够具有以下被IMAP所支持的特性:每个用户在服务器上可具有多个目录,这些目录能在多个用户之间共享。其与POP相比高级之处显而易见,但是采取IMAP时,它并不是十分完美的:由于IMAP需要从其它服务器上接收新信息,将这些信息递送给用户,维护每个用户的多个目录,这都为邮件服务器带来了高负载。并且IMAP与POP的一个不同之处是POP用户在接收邮件时将从邮件服务器上下载邮件,而IMAP允许用户直接访问邮件目录,所以在邮件服务器进行备份作业时,由于每个长期使用此邮件系统的用户所用的邮件目录会占有很大的空间,这将直接导致邮件服务器上磁盘空间暴涨。 三、JavaMail介紹 1. JavaMail核心类结构 在javax.mail的包下面存在着一些核心类:Session、Message、Address、Authenticator、Transport、Store、Folder等而且在javax.mail.internet包中还有一些常用的子类。 2.Session Session类定义了基本的邮件会话。就像Http会话那样,我们进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息。 Session类的构造方法是私有的,所以我们可以使用Session类提供的getDefaultInstance()这个静态工厂方法获得一个默认的Session对象: Properties props = new Properties(); // fill props with any information Session session = Session.getDefaultInstance(props, null); 或者使用getInstance()这个静态工厂方法获得自定义的Session: Properties props = new Properties(); // fill props with any information Session session = Session.getInstance(props, null); 从上面的两个例子中不难发现,getDefaultInstance()和getInstance()方法的第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权,下文中将对授权进行详细介绍。 从很多的实例看,在对mail server进行访问的过程中使用共享的Session是足够的,即使是工作在多个用户邮箱的模式下也不例外。 3.Message 当我们建立了Session对象后,便可以构造要发送的信息体了。在这里就要用到SUN提供了Message类型。由于Message是一个抽象类,大多数情况下,我们使用MimeMessage这个具體子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入: MimeMessage message = new MimeMessage(session); 在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。最基本的设置信息内容的方法就是通过表示信息内容和HTML类型的参数调用setContent()方法: message.setContent("Hello", "text/html"); 然而,如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容。 message.setText("Hello"); 前面所讲的两种方法,对于文本信息,后者更为合适。而对于其它的一些信息类型,比如HTML信息,则要使用前者。设置邮件主题可以使用setSubject()方法: message.setSubject("mail subject"); 4.Address 建立了Session和Message之後,接下來要使用邮件地址类:Address。像Message一样,Address类也是一个抽象类,所以我们将使用javax.mail.internet.InternetAddress这个子类。 通过传入代表邮件地址的字符串,我们可以建立一个邮件地址类: Address address = new InternetAddress("wang@localhost"); 如果要在邮件地址后面增加名字的话,可以通过传递两个参数:代表邮件地址和名字的字符串来建立一个具有邮件地址和名字的邮件地址类: Address address = new InternetAddress("wang@ localhost ", "wang"); 这里所讲的邮件地址类是为了设置邮件信息的发信人和收信人而准备的,在建立了邮件地址类后,我们通过message的setFrom()或者setReplyTo()两种方法设置邮件的发信人: message.setFrom(address); message.setReplyTo(address) 若在邮件中存在多个发信人地址,我们可用addForm()方法增加发信人: Address address[] ={new InternetAddress("wang@localhost"), new InternetAddress("fyc@localhost")}; message.addFrom(address); 为了设置收信人,我们使用addRecipient()方法增加收信人,此方法需要使用Message.RecipientType的常量来区分收信人的类型: message.addRecipient(type, address) 下面是Message.RecipientType的三个常量: Message.RecipientType.TO 信件接收者 Message.RecipientType.CC 抄送接收者 Message.RecipientType.BCC 暗送接收者 因此,如果我们要发送邮件给wang,并发用一个副本给fyc的话,下面的方法将被用到: Address toAddress = new InternetAddress("wang@localhost"); Address ccAddress = new InternetAddress("fyc@localhost"); message.addRecipient(Message.RecipientType.TO, toAddress); message.addRecipient(Message.RecipientType.CC, ccAddress); JavaMail API并没有提供检查邮件地址有效性的机制。当然我们可以自己完成这个功能:验证邮件地址的字符是否按照RFC822规定的格式书写或者通过DNS服务器上的MX记录验证等。 5.Authenticator 像java.net类那样,JavaMail API通过使用授权者类(Authenticator)以用户名、密码的方式访问那些受到保护的资源,在这里“资源”就是指邮件服务器。在javax.mail包中可以找到这个JavaMail的授权者类(Authenticator)。 在使用Authenticator这个抽象类时,我们必须采用继承该抽象类的方式,并且该继承类必须具有返回PasswordAuthentication对象(用于存储认证时要用到的用户名、密码)getPasswordAuthentication()方法。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。 下面代码片断中的MyAuthenticator就是一个Authenticator的子类。 Properties props = new Properties(); // fill props with any information Authenticator auth = new MyAuthenticator(); Session session = Session.getDefaultInstance(props, auth); 6.Transport 在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息: Transport.send(message); 当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接: message.saveChanges(); // implicit with send() Transport transport = session.getTransport("smtp"); transport.connect(host, username, password); transport.sendMessage(message, message.getAllRecipients()); transport.close(); 上面的方法是一个很好的方法,尤其是在我们在同一个邮件服务器上发送多个邮件时。因为这时我们将在连接邮件服务器后连续发送邮件,然后再关闭掉连接。send()这个基本的方法是在每次调用时进行与邮件服务器的连接的,对于在同一个邮件服务器上发送多个邮件来讲可谓低效的方式。 注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志: session.setDebug(true) 7.Store和Folder 接收邮件和发送邮件很类似都要用到Session。但是在获得Session后,我们需要从Session中获取特定类型的Store,然后连接到Store,这里的Store代表了存储邮件的邮件服务器。在连接Store的过程中,极有可能需要用到用户名、密码或者Authenticator。 // Store store = session.getStore("imap"); Store store = session.getStore("pop3"); store.connect(host, username, password); 在连接到Store后,一个Folder对象即目录对象将通过Store的getFolder()方法被返回,我们可从这个Folder中读取邮件信息: Folder folder = store.getFolder("INBOX"); folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); 上面的例子首先从Store中获得INBOX这个Folder(对于POP3协议只有一个名为INBOX的Folder有效),然后以只读(Folder.READ_ONLY)的方式打开Folder,最后调用Folder的getMessages()方法得到目录中所有Message的数组。 注意:对于POP3协议只有一个名为INBOX的Folder有效,而对于IMAP协议,我们可以访问多个Folder,而且Folder的getMessages()方法时采取了很智能的方式:首先接收新邮件列表,然后再需要的时候(比如读取邮件内容)才从邮件服务器读取邮件内容。 在读取邮件时,我们可以用Message类的getContent()方法接收邮件或是writeTo()方法将邮件保存,getContent()方法只接收邮件内容(不包含邮件头),而writeTo()方法将包括邮件头。 System.out.println(((MimeMessage)message).getContent()); 在读取邮件内容后,别忘记了关闭Folder和Store。 folder.close(aBoolean); store.close(); 传递给Folder.close()方法的boolean 类型参数表示是否在删除操作邮件后更新Folder。 8. MimeMultpart 一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象: MimeMultipart multipart = new MimeMultipart(); 注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分 9.MimeBodyPart MimeBodyPart是BodyPart具体用于mimeMessage的一个子类. 1.一个MIME类型 2.匹配这个类型的内容 用法:MimeBodyPart mdp = new MimeBodyPart(); String text = "Hello JavaMail!"; mdp.setContent(text, "text/plain"); //定义MIME类型为text/plain,并设置MimeBodyPart的内容。 10. javax.activation.DataHandler JavaMail API不限制信息只为文本,任何形式的信息都可能是MimeMessage的一部分.除了文本信息,文件附件包含在电子邮件信息的一部分是很普遍的,.JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法. 用法:DataHandler dh = new DataHandler(text, type); mdp.setDatahandler(dh); //mdp是一个MimeBodyPart对象 11. javax.activation.FileDataSource FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的MimeBodyPart对象附在一个mimeMessage对象上. 用法::MimeMultipart mm = new MimeMultipart(); MimeBodyPart mdp = new MimeBodyPart(); FileDataSource fds = new FileDataSource("c:/exam.txt"); mdp.setDataHandler(new DataHandler(fds)); //设置数据源 mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart 12 .javax.activation.URLDataSource 远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多). 用法::FileDataSource唯一不同的是数据源的设置: 四、用javaMail實現郵件發送、讀取步驟 環境介紹:本例所用的環境:jdk1.5,eclipse3.1;需導入的包:mail.jar, activation.jar 由於是應用程序只需新建一個java工程,工程目錄結構:
![]() 右鍵點擊java工程名javaMailTest選擇內容/Properties──點擊java建置路徑──點擊新增外部JAR如圖
![]() 選擇mail和activeation兩個包。 1.啟動郵件服務器:运行http://jakrata.网站下載的james服務器下的james/bin里的run.bat就可以启动了服务器如圖:
![]() 在DOS用telnet localhost 4555 登錄郵件服務器如圖: ![]() Login id: root 輸入root後會提示輸入密碼
![]() 同樣輸入root可登錄郵件服務器,用adduser 用戶名 密碼 命令可添加用戶 2.郵件系統工作過程
![]() 3.發郵件 3.1.用import導入所需要的包:java.util.*; javax.mail.*; avax.mail.internet.*; javax.activation.*; 3.2.創建java.util.Properties對象並將郵件服務器、郵件傳輸協議放入其中,如果需要授權訪問還要存放訪問用戶名、密碼信息。 Properties props = System.getProperties(); props.put("mail.transpost.protocol", "smtp"); props.put("mail.smtp.host", host); 3.3.通過以上的Properties對象實例化一個會話Session。 Session session = Session.getDefaultInstance(props, null); 3.4.用MimeMessage類通過創建的Session構建一個消息,並設置消息提各個元素如:發信人、收信人、主題、內容、附件等 MimeMessage msg = new MimeMessage(session); msg.setFrom(new InternetAddress(from)); InternetAddress[] address = { new InternetAddress(to) }; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject); 3.5.用Transport類的send方法發送構建的消息:Transport.send(msg); 3.6.以java應用程序方式運行應用程序mail.java發送郵件正常會彈出如下圖框
4.讀郵件 4.1.用import導入所需要的包:java.io.*; java.text.*; avax.mail.internet.*; javax.mail.*; java.util.* 4.2.創建java.util.Properties對象:Properties props = new Properties(); 4.3.通過以上的Properties對象實例化一個會話Session: Session session = Session.getDefaultInstance(props, null); 4.4.通過Session創建郵件服務器Store,並指定讀取郵件協議:Store store = session.getStore("pop3");: 4.5.連接郵件服務器並傳入服務器名、用戶、密碼信息:store.connect(hostname, username, password); 4.6.取得郵件服務器目錄,對於用POP3協議讀取只有“INBOX”目錄: Folder folder = store.getFolder("INBOX"); 4.7.打開目錄,並指定郵件讀取方式為只讀、讀寫或其它:folder.open(Folder.READ_ONLY); 4.8.讀取這個用戶下的所有郵件放在消息數組裡:Message message[] = folder.getMessages(); 4.9.讀取在消息數組中的每個郵件,在讀取郵件需要按照郵件的各個部分分別讀取,如讀取發信人、讀取收信人、讀取主題、讀取郵件內容、讀取郵件附件等,並且還要根郵件的各個部分在發送時的MIME類型編碼進行相應的解碼。 4.10.以java應用程序方式運行應用程序readMail.java如正常會交替彈出如下兩個圖框 並且在控制台會輸出所有郵件信息: ![]() 附源碼:發送郵件源碼,讀取郵件源碼
1.授权訪問 import javax.mail.*; public class Email_Autherticatorbean extends Authenticator { private String m_username = null; //用戶名 private String m_userpass = null; //密碼 public void setUsername(String username) { m_username = username; } public void setUserpass(String userpass) { m_userpass = userpass; } public Email_Autherticatorbean(String username, String userpass) { super(); setUsername(username); setUserpass(userpass); } public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(m_username, m_userpass); //存儲驗證的用戶名、密碼 } }
2.發送郵件 import java.util.*; import javax.mail.*; import javax.mail.internet.*; import javax.activation.*; public class mail { // 定义發件人、收件人、主題等 String to = ""; String from = ""; String host = ""; String filename = ""; String subject = ""; Vector file = new Vector(); // 保存發送附件的文件名的集合 /** * 构造函數 */ public mail(String to, String from, String smtpServer, String subject) { // 初始化發件人、收件人、smtp服務器、主题 this.to = to; this.from = from; this.host = smtpServer; this.subject = subject; } /** * 收集附件名 */ public void attachfile(String fname) { file.addElement(fname); } /** * 開始發送信件 */ public boolean startSend() { Properties props = System.getProperties(); // 创建Properties對象 props.put("mail.transpost.protocol", "smtp"); //郵件傳輸協議 props.put("mail.smtp.host", host); // 创建信件服务器 發內部郵件:Session session = Session.getDefaultInstance(props, null); // 得到默认的會話對象 //props.put("mail.smtp.auth", "true"); 用於發 //props.put("mail.smpt.port", "25"); 外部郵 //Email_Autherticatorbean auth = new Email_Autherticatorbean("ypfeng2005", "20052005"); // 驗證 件 // session //Session session = Session.getInstance(props, auth); // 得到通過驗證會話 session.setDebug(true); // 輸出MAIL命令 try { MimeMessage msg = new MimeMessage(session); // 创建消息,并初始化该消息 msg.setFrom(new InternetAddress(from)); InternetAddress[] address = { new InternetAddress(to) }; msg.setRecipients(Message.RecipientType.TO, address); msg.setSubject(subject); msg.setContent("this is my mail", "text/html;charset=big5"); //msg.setText("mail!!!"); Multipart mp = new MimeMultipart();// 后面的BodyPart将加入到此处创建的Multipart中 Enumeration efile = file.elements();// 利用枚举器遍历集合 // 检查序列中是否还有更多的对象 while (efile.hasMoreElements()) { MimeBodyPart mbp = new MimeBodyPart(); // 选择出每一个附件名 filename = efile.nextElement().toString(); // 得到数据源 FileDataSource fds = new FileDataSource(filename); // 得到附件本身并至入BodyPart mbp.setDataHandler(new DataHandler(fds)); // 得到文件名同样至入BodyPart mbp.setFileName(fds.getName()); mp.addBodyPart(mbp); } // 移走集合中的所有元素 file.removeAllElements(); // Multipart加入到信件 msg.setContent(mp); // 设置信件头的发送日期 msg.setSentDate(new Date()); // 发送信件 Transport.send(msg); System.out.println("mail send successful!!"); } catch (MessagingException mex) { mex.printStackTrace(); Exception ex = null; if ((ex = mex.getNextException()) != null) { ex.printStackTrace(); } return false; } return true; } public static void main(String[] args) { mail sendmail=new mail("fyc@localhost","wang@localhost","localhost","test");//發內部郵件 //mail sendmail=new mail("fff@163.com", "ppp@163.com","smtp.163.com", "test");//發外部郵件 sendmail.attachfile("D:/spring_reference.pdf");//添加附件 sendmail.startSend();//發送郵件 } }
3.讀取郵件 import java.io.*; import java.text.*; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class readMail { private MimeMessage mimeMessage = null; private String saveAttachPath = ""; // 附件下载后的存放目录 private StringBuffer bodytext = new StringBuffer();// 存放邮件内容的StringBuffer对象 private String dateformat = "yy-MM-dd HH:mm"; // 默认的日前显示格式 /** * * 構造函数,初始化一个MimeMessage對象 */ public readMail() { } public readMail(MimeMessage mimeMessage) { this.mimeMessage = mimeMessage; System.out.println("create a PraseMimeMessage object........"); } /** * * 獲取一个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(); } } /** * * 类测试 */ public static void main(String args[]) throws Exception { String host = "localhost"; // 主机名/ip String username = "fyc"; // 用戶名 String password = "fyc"; // 密碼 Properties props = new Properties(); Session session = Session.getDefaultInstance(props, null); Store store = session.getStore("pop3");// 郵件服務器 store.connect(host, username, password); Folder folder = store.getFolder("INBOX"); // 郵件服務器目錄 folder.open(Folder.READ_ONLY); Message message[] = folder.getMessages(); // 獲得郵件 System.out.println("Messages‘s length: " + message.length); readMail pmm = null; for (int i = 0; i < message.length; i++) { pmm = new readMail((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: " + mm.isContainAttach((Part) message[i])); System.out.println("Message " + i + " from: " + 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("d:\\tmp"); pmm.saveAttachMent((Part) message[i]); } } } |
|