Your mail has been sent.
<%}catch(MessagingException m){out.println(m.toString());}%> 如何发送HTML类型的邮件 在上面的例子中,我们实现了如何发送文本格式的邮件,那么HTML格式的邮件该如何发送呢?那就看看下面的例子吧。 该例由四个文件组成: ·form.htm:用来建立邮件信息的表单 ·send.jsp:用来获取表单提交的信息,并调用mymail.mail.HTML.send()方 法发送邮件 ·StringDataSource.Java:用户自定义的JavaBean,用来将邮件的Body部分转化为HTML格式 ·HTML.Java:用户自定义的JavaBean,用来发送HTML格式的邮件。在send.jsp文件中提到的 mymail.mail.HTML.send()方法就在该JavaBean中定义。 form.htmsend.jsp< %//变量声明Java.lang.String smtp,from,to,cc,bcc,subject,body; //获得用户输入数据smtp = request.getParameter("smtp");from = request.getParameter("from");to = request.getParameter("to");cc = request.getParameter("cc");bcc = request.getParameter("bcc");subject = request.getParameter("subject");if(subject!=null){subject = new Java.lang.String(subject.getBytes("iso-8859-1"));}body = request.getParameter("body");//发送邮件mymail.mail.HTML.send(smtp,from,to, cc,bcc,subject,body);%> mymail.jaf.StringDataSource.Javapackage mymail.jaf;public class StringDataSource implements Javax.activation.DataSource{private Java.lang.String data; private Java.lang.String type; public StringDataSource(Java.lang.String data,Java.lang.String type){ this.data = data; this.type = type; } public Java.io.InputStream getInputStream() throws Java.io.IOException{ return new Java.io.StringBufferInputStream(data);} public Java.io.OutputStream getOutputStream() throws Java.io.IOException{ throw new Java.io.IOException("it does not support this method now!"); } public Java.lang.String getContentType(){ return type;} public Java.lang.String getName(){ return " mymail ";}} mymail.mail.HTML.Javapackage mymail.mail;public final class HTML{public static void send( Java.lang.String smtp, /*SMTP主机地址*/ Java.lang.String from, /*发信人*/ Java.lang.String to, /*收信人*/ Java.lang.String cc, /*抄送人*/ Java.lang.String bcc, /*暗送人*/ Java.lang.String subject, /*主题*/ Java.lang.String body /*内容*/ ) throws Java.lang.Exception{ //变量声明 Java.util.Properties props; //系统属性 Javax.mail.Session mailSession; //邮件会话对象 Javax.mail.internet.MimeMessage mimeMsg; //MIME邮件对象 //设置系统属性 props = Java.lang.System.getProperties(); //获得系统属性对象 props.put("mail.smtp.host",smtp); //设置SMTP主机 //获得邮件会话对象 mailSession = Javax.mail.Session.getDefaultInstance(props,null); //创建MIME邮件对象 mimeMsg = new Javax.mail.internet.MimeMessage(mailSession); //设置发信人 mimeMsg.setFrom(new Javax.mail.internet.InternetAddress(from)); //设置收信人 if(to!=null){ mimeMsg.setRecipients(Javax.mail.Message.RecipientType.TO,Javax.mail. internet.InternetAddress.parse(to)); } //设置抄送人 if(cc!=null){mimeMsg.setRecipients (Javax.mail.Message.RecipientType.CC,Javax.mail. internet.InternetAddress.parse(cc)); } //设置暗送人if(bcc!=null){ mimeMsg.setRecipients(Javax.mail.Message.RecipientType.BCC,Javax.mail. internet.InternetAddress.parse(bcc)); } 设置邮件主题 //mimeMsg.setSubject(subject); mimeMsg.setSubject (subject,"gb2312"); //设置邮件内容,将邮件body部分转化为HTML格式 mimeMsg.setDataHandler(new Javax.activation.DataHandler(new mymail.jaf. StringDataSource (body,"text/html"))); //发送邮件 Javax.mail.Transport.send(mimeMsg); }} 如何实现消息和标志的删除? 消息的删除涉及到与消息相关的 Flags(标志)。不同 flag 表示不同的状态,有些标志由系统定义,而有些则由用户自己定义。下面列出在内部类 Flags.Flag 中预定义的标志: ·Flags.Flag.ANSWERED ·Flags.Flag.DELETED ·Flags.Flag.DRAFT ·Flags.Flag.FLAGGED ·Flags.Flag.RECENT ·Flags.Flag.SEEN ·Flags.Flag.USER 上述这些标志只是标准定义,并不意味着所有邮件服务器或供应商都支持所有这些标志。例如,除了删除消息标志外,POP 协议不再支持其它任何标志。检查是否存在新邮件,这不是个 POP 任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用 getPermanentFlags() 向 folder 提出请求。 要删除消息,您可以设置消息的 DELETED flag: message.setFlag(Flags.Flag.DELETED, true); 首先,请以 READ_WRITE 模式打开 folder: folder.open(Folder.READ_WRITE); 然后,当所有消息的处理完成后,关闭 folder,并传递一个 true 值,从而擦除(expunge)有 delete 标志的消息。 folder.close(true); 一个 Folder 的 expunge() 方法可以用来删除消息。但 Sun 的 POP3 供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP 供应商极有可能实现此功能。因为 POP 只支持单个对邮箱的访问,对 Sun 的供应商来说,您必需关闭 folder 以删除消息。 要取消标志,只要传递 false 给 setFlag() 方法就行了。想知道是否设置过标志,可以用 isSet() 检查。 如何实现认证? 想必读者已经知道 ,如果需要可以用一个 Authenticator 提示用户输入用户名和密码,而不是将用户名和密码作为字符串传递。在这里您会明确了解怎样更充分的使用Java Mail API的认证机制。 不用主机、用户名和密码与 Store 相连接,而是设置 Properties 来拥有主机,然后告诉 Session 自定义的 Authenticator 实例,如下所示: // Setup propertiesProperties props = System.getProperties();props.put("mail.pop3.host", host); // Setup authentication, get sessionAuthenticator auth = new PopupAuthenticator();Session session = Session.getDefaultInstance(props, auth); // Get the storeStore store = session.getStore("pop3");store.connect(); 然后,创建一个 Authenticator 子类并从 getPasswordAuthentication() 方法中返回 PasswordAuthentication 对象。下面就是这样一种实现,其中用户名和密码仅占用一个域。(这不是一个 Swing 工程教程;只要将两部分输入同一个域,用逗号分隔就行。) import Javax.mail.*;import Javax.swing.*;import Java.util.*; public class PopupAuthenticator extends Authenticator {public PasswordAuthentication getPasswordAuthentication() {String username, password; String result = JOptionPane.showInputDialog("Enter 'username,password'"); StringTokenizer st = new StringTokenizer(result, ","); username = st.nextToken(); password = st.nextToken(); return new PasswordAuthentication(username, password); }} 因为 PopupAuthenticator 涉及到 Swing,它会启动 AWT 的事件处理线程。这一点基本上要求您在代码中添加一个对 System.exit() 的调用来终止程序。 如何实现消息的转发? 转发消息,相对于其他功能来说,显得有些棘手。没有单独的方法可以供调用,读者必须通过对组成消息各部分 的处理来组织要转发的消息。 一条邮件消息可以由多个部分组成。在处理 MIME 消息时,消息中每部分都是 BodyPart,再特殊些,是 MimeBodyPart。不同的 body part(信体部件或正文部件)结合成一个容器,名为 Multipart,再特殊些,就是 MimeMultipart。要转发一条消息,您为自己的消息正文创建一个部件,要转发的消息作为另一部件。并且将两个部件结合成一个 multipart(多部件)。然后您将这个 multipart 添加到一则已写好恰当地址的消息中,并发送。 本质上就是如此。要将一条消息内容复制到另一条,只要复制 DataHandler (JavaBeans Activation Framework 中的类)就行了。 // Create the message to forwardMessage forward = new MimeMessage(session);// Fill in headerforward.setSubject("Fwd: " + message.getSubject());forward.setFrom(new InternetAddress(from));forward.addRecipient(Message.RecipientType.TO, new InternetAddress(to));// Create your new message partBodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setText( "Here you go with the original message:\n\n");// Create a multi-part to combine the partsMultipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart); // Create and fill part for the forwarded contentmessageBodyPart = new MimeBodyPart();messageBodyPart.setDataHandler(message.getDataHandler()); // Add part to multi partmultipart.addBodyPart(messageBodyPart); // Associate multi-part with messageforward.setContent(multipart); // Send messageTransport.send(forward); 怎样处理附件? 附件是邮件消息的相关资源,如通常不包含在消息正文里文本文件、电子表格或图像等。常见的邮件程序,如 Eudora 和 pine 之类,可以用 JavaMail API 将资源 attach(附加) 到您的消息上,就可以在收到消息时得到。 附件的发送: 发送附件非常像转发消息。您建立各部分以组成完整消息。完成第一部件,即消息正文后,您添加 其它部件,其中每个 DataHandler 都代表附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是 FileDataSource。而如果从 URL 中读时,附件的数据源是 URLDataSource。一旦存在 DataSource,只要先把它传递给 DataHandler 构造器,最后再用 setDataHandler() 把它附加到 BodyPart。假定您要保留附件的原始文件名,最终要做的是用 BodyPart 的 setFileName() 方法设置与附件相关的文件名。如下所示: // Define message Message message = new MimeMessage(session); message.setFrom(new InternetAddress(from)); message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); message.setSubject("Hello JavaMail Attachment"); // Create the message part BodyPart messageBodyPart = new MimeBodyPart(); // Fill the message messageBodyPart.setText("Pardon Ideas"); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // Part two is attachment messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource(filename); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName(filename); multipart.addBodyPart(messageBodyPart); // Put parts in message message.setContent(multipart); // Send the message Transport.send(message); 就消息引入附件时,若程序是个 servlet (小服务程序),除告知消息发送到何处外,还必需上载附件。可以将 multipart/form-data 表单编码类型(form encoding type)用于每个上载文件的处理。 注意:消息大小由 SMTP 服务器而不是 JavaMail API 来限制。如果您碰到问题,可以考虑用设置 ms 和 mx 参数的方法增大 Java 堆大小。 附件的获取: 从消息中获取附件比发送它们棘手些,因为 MIME 没有简单的关于附件的概念。当消息包含附件时,消息的内容是个 Multipart 对象。接着,您需要处理每个 Part,获取主要内容和附件。标有从 part.getDisposition() 获得的 Part.ATTACHMENT 配置(disposition)的部件(Part)无疑就是附件。但是,没有配置(以及一个非文本 MIME 类型)和带 Part.INLINE 配置的部件也可能是附件。当配置要么是 Part.ATTACHMENT,要么是 Part.INLINE 时,这个消息部件的内容就能被保存。只要用 getFileName() 和 getInputStream() 就能分别得到原始文件名和输入流。 Multipart mp = (Multipart)message.getContent();for (int i=0, n=multipart.getCount(); i
