📄 jsp与java mail api.htm
字号:
/*主题*/<BR> Java.lang.String body /*内容*/<BR> )
throws
Java.lang.Exception<BR>{<BR> //变量声明<BR> Java.util.Properties
props; //系统属性<BR> Javax.mail.Session
mailSession; //邮件会话对象<BR> Javax.mail.internet.MimeMessage
mimeMsg; //MIME邮件对象 </P>
<P> //设置系统属性<BR> props =
Java.lang.System.getProperties();
//获得系统属性对象<BR> props.put("mail.smtp.host",smtp);
//设置SMTP主机 </P>
<P> //获得邮件会话对象<BR> mailSession =
Javax.mail.Session.getDefaultInstance(props,null); </P>
<P> //创建MIME邮件对象<BR> mimeMsg = new
Javax.mail.internet.MimeMessage(mailSession); </P>
<P> //设置发信人<BR> mimeMsg.setFrom(new
Javax.mail.internet.InternetAddress(from)); </P>
<P> //设置收信人<BR> if(to!=null)<BR>{
<BR>mimeMsg.setRecipients(Javax.mail.Message.RecipientType.TO,Javax.mail.
internet.InternetAddress.parse(to));<BR> } </P>
<P> //设置抄送人<BR> if(cc!=null)<BR>{<BR>mimeMsg.setRecipients(Javax.mail.Message.RecipientType.CC,Javax.mail.
internet.InternetAddress.parse(cc));<BR> } </P>
<P>//设置暗送人<BR>if(bcc!=null)<BR>{
<BR>mimeMsg.setRecipients(Javax.mail.Message.RecipientType.BCC,Javax.mail.
internet.InternetAddress.parse(bcc));<BR> } </P>
<P> 设置邮件主题<BR> //mimeMsg.setSubject(subject);<BR> mimeMsg.setSubject(subject,"gb2312");
</P>
<P> //设置邮件内容,将邮件body部分转化为HTML格式<BR> mimeMsg.setDataHandler(new
Javax.activation.DataHandler(new mymail.jaf.
StringDataSource (body,"text/html"))); </P>
<P> //发送邮件<BR> Javax.mail.Transport.send(mimeMsg);<BR> }<BR>}
</P>
<P> 如何实现消息和标志的删除? </P>
<P> 消息的删除涉及到与消息相关的 Flags(标志)。不同 flag
表示不同的状态,有些标志由系统定义,而有些则由用户自己定义。下面列出在内部类 Flags.Flag
中预定义的标志:<BR> ·Flags.Flag.ANSWERED
<BR> ·Flags.Flag.DELETED <BR> ·Flags.Flag.DRAFT
<BR> ·Flags.Flag.FLAGGED <BR> ·Flags.Flag.RECENT
<BR> ·Flags.Flag.SEEN <BR> ·Flags.Flag.USER
<BR> 上述这些标志只是标准定义,并不意味着所有邮件服务器或供应商都支持所有这些标志。例如,除了删除消息标志外,POP
协议不再支持其它任何标志。检查是否存在新邮件,这不是个 POP
任务,而是内建于邮件客户机的任务。为找出哪些标志能被支持,可以用 getPermanentFlags() 向
folder 提出请求。<BR> 要删除消息,您可以设置消息的 DELETED
flag:<BR> message.setFlag(Flags.Flag.DELETED,
true);<BR> 首先,请以 READ_WRITE 模式打开
folder:<BR> folder.open(Folder.READ_WRITE);<BR> 然后,当所有消息的处理完成后,关闭
folder,并传递一个 true 值,从而擦除(expunge)有 delete
标志的消息。<BR> folder.close(true);<BR> 一个 Folder 的
expunge() 方法可以用来删除消息。但 Sun 的 POP3
供应商不支持。其它供应商有的或许能够实现这一功能,而有的则不能。IMAP 供应商极有可能实现此功能。因为 POP
只支持单个对邮箱的访问,对 Sun 的供应商来说,您必需关闭 folder
以删除消息。<BR> 要取消标志,只要传递 false 给 setFlag()
方法就行了。想知道是否设置过标志,可以用 isSet() 检查。 </P>
<P> 如何实现认证? </P>
<P> 想必读者已经知道 ,如果需要可以用一个 Authenticator
提示用户输入用户名和密码,而不是将用户名和密码作为字符串传递。在这里您会明确了解怎样更充分的使用Java
Mail API的认证机制。<BR> 不用主机、用户名和密码与 Store 相连接,而是设置
Properties 来拥有主机,然后告诉 Session 自定义的 Authenticator
实例,如下所示: </P>
<P>// Setup properties<BR>Properties props =
System.getProperties();<BR>props.put("mail.pop3.host",
host); </P>
<P>// Setup authentication, get session<BR>Authenticator
auth = new PopupAuthenticator();<BR>Session session =
Session.getDefaultInstance(props, auth); </P>
<P>// Get the store<BR>Store store =
session.getStore("pop3");<BR>store.connect(); </P>
<P> 然后,创建一个 Authenticator 子类并从
getPasswordAuthentication() 方法中返回 PasswordAuthentication
对象。下面就是这样一种实现,其中用户名和密码仅占用一个域。(这不是一个 Swing
工程教程;只要将两部分输入同一个域,用逗号分隔就行。) </P>
<P>import Javax.mail.*;<BR>import
Javax.swing.*;<BR>import Java.util.*; </P>
<P>public class PopupAuthenticator extends Authenticator
<BR>{<BR>public PasswordAuthentication
getPasswordAuthentication() <BR>{<BR>String username,
password;<BR> String result =
JOptionPane.showInputDialog("Enter
'username,password'");<BR> StringTokenizer st = new
StringTokenizer(result, ",");<BR> username =
st.nextToken();<BR> password =
st.nextToken();<BR> return new
PasswordAuthentication(username,
password);<BR> }<BR>} </P>
<P> 因为 PopupAuthenticator 涉及到 Swing,它会启动 AWT
的事件处理线程。这一点基本上要求您在代码中添加一个对 System.exit() 的调用来终止程序。</P>
<P> 如何实现消息的转发?</P>
<P> 转发消息,相对于其他功能来说,显得有些棘手。没有单独的方法可以供调用,读者必须通过对组成消息各部分的处理来组织要转发的消息。<BR> 一条邮件消息可以由多个部分组成。在处理
MIME 消息时,消息中每部分都是 BodyPart,再特殊些,是 MimeBodyPart。不同的 body
part(信体部件或正文部件)结合成一个容器,名为 Multipart,再特殊些,就是
MimeMultipart。要转发一条消息,您为自己的消息正文创建一个部件,要转发的消息作为另一部件。并且将两个部件结合成一个
multipart(多部件)。然后您将这个 multipart
添加到一则已写好恰当地址的消息中,并发送。<BR> 本质上就是如此。要将一条消息内容复制到另一条,只要复制
DataHandler (JavaBeans Activation Framework 中的类)就行了。
</P>
<P>// Create the message to forward<BR>Message forward =
new MimeMessage(session);<BR>// Fill in
header<BR>forward.setSubject("Fwd: " +
message.getSubject());<BR>forward.setFrom(new
InternetAddress(from));<BR>forward.addRecipient(Message.RecipientType.TO,
new InternetAddress(to));<BR>// Create your new message
part<BR>BodyPart messageBodyPart = new
MimeBodyPart();<BR>messageBodyPart.setText( "Here you go
with the original message:\n\n");<BR>// Create a
multi-part to combine the parts<BR>Multipart multipart =
new
MimeMultipart();<BR>multipart.addBodyPart(messageBodyPart);
</P>
<P>// Create and fill part for the forwarded
content<BR>messageBodyPart = new
MimeBodyPart();<BR>messageBodyPart.setDataHandler(message.getDataHandler());
</P>
<P>// Add part to multi
part<BR>multipart.addBodyPart(messageBodyPart); </P>
<P>// Associate multi-part with
message<BR>forward.setContent(multipart); </P>
<P>// Send message<BR>Transport.send(forward); </P>
<P> 怎样处理附件? </P>
<P> 附件是邮件消息的相关资源,如通常不包含在消息正文里文本文件、电子表格或图像等。常见的邮件程序,如
Eudora 和 pine 之类,可以用 JavaMail API 将资源 attach(附加)
到您的消息上,就可以在收到消息时得到。</P>
<P> 附件的发送:</P>
<P> 发送附件非常像转发消息。您建立各部分以组成完整消息。完成第一部件,即消息正文后,您添加其它部件,其中每个
DataHandler 都代表附件,而不是转发消息情况下的共享处理程序。如果从文件中读附件,附件的数据源是
FileDataSource。而如果从 URL 中读时,附件的数据源是 URLDataSource。一旦存在
DataSource,只要先把它传递给 DataHandler 构造器,最后再用
setDataHandler() 把它附加到 BodyPart。假定您要保留附件的原始文件名,最终要做的是用
BodyPart 的 setFileName() 方法设置与附件相关的文件名。如下所示: </P>
<P> // Define message<BR> Message message = new
MimeMessage(session);<BR> message.setFrom(new
InternetAddress(from));<BR> message.addRecipient(Message.RecipientType.TO,<BR> new
InternetAddress(to));<BR> message.setSubject("Hello
JavaMail Attachment"); </P>
<P> // Create the message part<BR> BodyPart
messageBodyPart = new MimeBodyPart(); </P>
<P> // Fill the
message<BR> messageBodyPart.setText("Pardon Ideas");
</P>
<P> Multipart multipart = new
MimeMultipart();<BR> multipart.addBodyPart(messageBodyPart);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -