您的位置:首页 > 编程语言 > Java开发

java邮件解析2

2016-02-03 16:18 429 查看
javamail的api介绍B.Session(邮件会话)进行收发邮件的工作都是基于这个会话的。Session对象利用了java.util.Properties对象获得了邮件服务器、用户名、密码信息和整个应用程序都要使用到的共享信息
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
或者
Properties props = new Properties();
Session session = Session.getInstance(props, null);
从上面的两个例子中不难发现,第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权(参考E)C.Message建立了Session对象后,便可以被发送的构造信息体Message抽象类使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符Message message = new MimeMessage(session);message.setContent("Hello", "text/plain");//非文本信息内容message.setText("Hello");//纯文本信息内容message.setSubject("First");//设置邮件主题message.setSentDate(Date);//设置邮件发送日期D.Address建立了Session和Message对象后,使用邮件地址Address抽象类使用javax.mail.internet.InternetAddress这个子类。通过传入邮件地址的字符串Address address = new InternetAddress("kuangye89757@163.com"); //邮件地址Address address = new InternetAddress("president@whitehouse.gov", "George Bush"); //带名字的邮件地址message.setFrom(address);//设置发信人message.setReplyTo(address);//同上message.addFrom(Address[] address);//添加多个发信人message.addRecipient(type, address)//设置收信人Message.RecipientType.TO//收信人Message.RecipientType.CC//抄送人Message.RecipientType.BCC//暗送人E.Authenticator授权者类使用Authenticator抽象类必须实现getPasswordAuthentication()方法(用于存储认证时要用到的用户名、密码)。并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。Properties props = new Properties();Authenticator auth = new MyAuthenticator();Session session = Session.getDefaultInstance(props, auth);/*** 自定义邮件授权类* @return* @throws IOException*/public class MyAuthenticator extendsAuthenticator {public PasswordAuthentication getPasswordAuthentication(Stringparam) {String username;String password;StringTokenizer st = new StringTokenizer(param, ",");username = st.nextToken();password = st.nextToken();return new PasswordAuthentication(username, password);}}F.Transport发送信息时使用Transport抽象类(实现了SMTP)Transport.send(MimeMessage message);或者一般用法当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:session.setDebug(true);//监控邮件发送过程message.saveChanges(); //保存文件Transport transport = session.getTransport("smtp");//获取实现了SMTP协议的Transport类transport.connect(host, username, password);//连接服务器transport.sendMessage(message, message.getAllRecipients());//发送邮件给所有收件人transport.close();//关闭连接G.Store(存储邮件的服务器)和Folder(目录对象)Store store = session.getStore("pop3");store.connect(host, username, password);Folder folder = store.getFolder("INBOX");//POP3协议只有一个名为INBOX的Folder有效folder.open(Folder.READ_ONLY);//只读方式打开Message message[] = folder.getMessages();//获得邮件System.out.println(((MimeMessage)message).getContent());//邮件内容(不包含邮件头)System.out.println(((MimeMessage)message).writeTo());//邮件内容(含邮件头)folder.close(true);//若删除邮件则及时更新Folder,关闭store.close();//关闭五、使用JavaMail API1.发送邮件在获得了Session后,建立并填入邮件信息,在发送邮件之前,我们需要设置SMTP服务器:通过设置Properties的mail.smtp.host属性mail配置文件.propertiesString server=xx.xx.xx.xx(服务器)authUser=XXXauthPasswd=xxxxxx/*** 获得配置文件信息* @return* @throws IOException*/private static Properties getProp() throws IOException{//获得文件存储路径ClassLoader classLoader = Thread.currentThread().getContextClassLoader();InputStream inputStream = classLoader.getResourceAsStream("mail配置文件.properties");Properties prop = new Properties();prop.load(inputStream);return prop;}private String from = ...;//发件人private String to = ...;//收件人//获取邮件发送服务器及验证用户名和密码Properties props=getProp();props.put("mail.smtp.host", host);//获取Session会话Session session = Session.getDefaultInstance(props, null);//创建MIMEMessageMessage message = new MimeMessage(session);message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO, newInternetAddress(to));message.setSubject("Hello JavaMail");message.setText("Welcome to JavaMail");//发送邮件message.saveChanges();Transport transport = session.getTransport("smtp");transport.connect(props.getProperty(“server”), props.getProperty(“authUser”), props.getProperty(“authPasswd”));transport.sendMessage(message, message.getAllRecipients());transport.close();2.接收邮件Session session = Session.getDefaultInstance(props,null);Store store = session.getStore("pop3");store.connect(props.getProperty(“server”), props.getProperty(“authUser”), props.getProperty(“authPasswd”));Folder folder = store.getFolder("INBOX");folder.open(Folder.READ_ONLY);Message message[] = folder.getMessages();for (int i=0, n=message.length; i<n; i++) {System.out.println(i + ": " + message[i].getFrom()[0] + " " + message[i].getSubject());}folder.close(false);store.close();3.删除邮件和标志Flags类的内部类Flag中预定义了一些标志:(POP协议不支持)如:Flags.Flag.DELETED通过访问一个已经打开的Folder对象的getPermanetFlags()方法,它将返回当前被支持的Flags类对象。删除邮件时,我们可以设置邮件的DELETED标志:if(Message.isSet(Flags.Flag.DELETED)){folder.open(Folder.READ_WRITE);message.setFlag(Flags.Flag.DELETED, true);//删除邮件folder.close(true);}4.回复邮件MimeMessage reply = (MimeMessage)message.reply(false);//不发送给发件人reply.setFrom(new InternetAddress("president@whitehouse.gov"));reply.setText("Thanks");Transport.send(reply);//回复邮件6.转发邮件转发邮件的过程不如前面的回复邮件那样简单,它将建立一个转发邮件,这并非一个方法就能做到。每个邮件是由多个部分(邮件体MimeBodyPart类对象)组成这些邮件体包含MimeMultiPart类对象复制一个邮件内容到另一个邮件的方法是复制它的DataHandler(数据处理者)Message forward = new MimeMessage(session);forward.setSubject("Fwd: " + message.getSubject());forward.setFrom(new InternetAddress(from));forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));forward.setContent(multipart);//这里的多媒体对象通过下列方式获得Transport.send(forward);//转发邮件//创建邮件体对象BodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setContent(“内容”,"text/plain;charset=GB2312");messageBodyPart.setDataHandler(message.getDataHandler());//从邮件中获取DataHandler//创建多媒体对象Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);
7.使用附件
A.发送带有附件的邮件建立一个完整邮件的各个邮件体部分:第一个部分:邮件内容文字第二个部分:具有DataHandler的附件1.若文件作为附件发送建立FileDataSource类型的附件数据源对象2.若URL作为附件发送建立URLDataSource类型的附件数据源对象Message message = new MimeMessage(session);message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));message.setSubject("Hello JavaMail Attachment");//第一部分(内容)BodyPart messageBodyPart1 = new MimeBodyPart();messageBodyPart1.setText("Pardon Ideas");//第二部分(文件附件)BodyPart messageBodyPart2= new MimeBodyPart();DataSource source = new FileDataSource(filename);messageBodyPart2.setDataHandler(new DataHandler(source));messageBodyPart2.setFileName(filename);Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart1);//装填第一部分multipart.addBodyPart(messageBodyPart2);//装填第二部分message.setContent(multipart);Transport.send(message);//发送带有附件的文件使用servlet实现发送带有附件的邮件注意提交页面form中对编码类型的设置应为multipart/form-data<form enctype="multipart/form-data" method=post action="/myservlet"><input type="file" NAME="thefile"><input type="submit" VALUE="Upload"></form>B.读取邮件中的附件读取邮件中带有附件的邮件是多部分组成的,我们必须处理每一个部分获得邮件的内容和附件BodyPart类提供了getDisposition()方法获得邮件体的部署类型该部分是附件时返回Part.ATTACHMENTPart.INLINE//获取邮件中的多媒体Multipart mp = (Multipart)message.getContent();//循环遍历多媒体,并获取邮件体各部分for (int i=0, n=multipart.getCount(); i<n; i++) {Part part= multipart.getBodyPart(i));//获得邮件体的部署类型String disposition = part.getDisposition();if ((disposition != null) && ((disposition.equals(Part.ATTACHMENT)|| (disposition.equals(Part.INLINE))) {saveFile(part.getFileName(), part.getInputStream());}else if (disposition == null) {MimeBodyPart mbp = (MimeBodyPart)part;if (mbp.isMimeType("text/plain")) {//解析过程} else {//其他解析过程}}}8.处理HTML邮件A.发送HTML邮件设置邮件内容为html代码,并设置内容类型为text/html即可:String htmlText = "<H1>Hello</H1>" + "<img src="http://www.jguru.com/images/logo.gif">";message.setContent(htmlText, "text/html"));请注意:在接收邮件时,因为JavaMail API邮件内容视为二进制流。必须使用JEditorPaneif (message.getContentType().equals("text/html")) {String content = (String)message.getContent();JFrame frame = new JFrame();JEditorPane text = new JEditorPane("text/html", content);text.setEditable(false);JScrollPane pane = new JScrollPane(text);frame.getContentPane().add(pane);frame.setSize(300, 300);frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.show();}B.在邮件中包含图片将HTML中用到的图片作为邮件附件并使用特殊的cid URL作为图片的引用(Content-ID头的引用)通过设置图片附件邮件体部分的header中Content-ID为一个随机字符串,并在HTML中img的src标记中设置为该字符串来完成了图片附件与HTML的关联。String file = ...;Message message = new MimeMessage(session);message.setSubject("Embedded Image");message.setFrom(new InternetAddress(from));message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));// 创建邮件体HTML部分BodyPart messageBodyPart1 = new MimeBodyPart();String htmlText = "<H1>Hello</H1>" + "<img src="cid:memememe">";messageBodyPart1.setContent(htmlText, "text/html");//创建邮件体img部分BodyPart messageBodyPart2 = new MimeBodyPart();DataSource fds = new FileDataSource(file);messageBodyPart2.setDataHandler(new DataHandler(fds));messageBodyPart2.setHeader("Content-ID","<memememe>");
// 创建一个关联的多媒体MimeMultipart multipart = new MimeMultipart("related");multipart.addBodyPart(messageBodyPart1);multipart.addBodyPart(messageBodyPart2);message.setContent(multipart);
9.在邮件中搜索短语JavaMail API提供了过滤器机制,它被用来建立搜索短语。使用javax.mail.search包中的SearchTerm抽象类来定义,在定义后我们便可以使用Folder的Search()方法查找邮件:下面有22个不同的类(继承了SearchTerm类)供我们使用:AND terms 、OR terms 、NOT terms 、SENT DATE terms、CONTENT terms 、HEADER terms实例:在Folder中搜索邮件主题含有“ADV”字符串或者发信人地址为friend@public.com的邮件。SearchTerm st = new OrTerm(newSubjectTerm("ADV:"), new FromStringTerm("friend@public.com"));Message[] msgs = folder.search(st);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: