深入探讨JavaMail API的利用
副标题#e#
在我以前颁发的文章《利用JavaMail和Jsp团结编写浅易电子邮件发送系统》 ,先容了JavaMail与JSP团结利用的要领。其实,JavaMail API是一个相当大的 系统,单单那么一片小文是不能先容完JavaMail的,因此我想以本文与各人深入 的探讨一下JavaMail的利用。
问题一、我如何发送一封简朴的信件?
答复:我将在下面的例子中具体的讲授如何发送简朴信件
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class SendSimpleMail {
file://msgText是信件的正文,共有两行
static String msgText = "Dear Mr.FangZhou\nI’m a reader of your net!"
file://从呼吁行中读入三个参数,别离为smtpHost,from,to
public static void main(String args[])
throws Exception{
if (args.length != 3) {
System.out.println("usage: java SendSimpleMail ");
return;
}
String smtpHost=args[0];//SMTP处事器名
String from=args[1];//发信人地点
String to =args[2];//收信人地点
// 建设properties工具
Properties props = new Properties();
file://建设邮件处事器
props.put("mail.smtp.host", smtpHost);
file://取得默认的Session
Session session = Session.getDefaultInstance(props, null);
// 建设一条信息,并界说发信人地点和收信人地点
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));
InternetAddress[] address = {new InternetAddress(to)};
message.setRecipients(Message.RecipientType.TO, address);
message.setSubject("Hello,FangZhou");//设定主题
message.setSentDate(new Date());//设定发送时间
message.setText(msgText);//把前面界说的msgText中的文字设定为邮件正文的 内容
file://发送邮件
Transport.send(message);
}
}
问题二、假如我想在邮件中加上附件怎么办?
这也是一个相当好的问题,要插手附件的话就要利用MimeBodyPart来建设邮 件,只需把上面的措施稍加修改就可以了,为了简朴起见,我在这里只是利用了 一条字符串作为附件内容来表明如何添加附件。
file://msgText是信件的正文,共有两行
static String msgText = "Dear Mr.FangZhou\nI’m a reader of your net!"
file://msgAttachment是一段字符串作为附件
static String msgAttachment = "This is an attachment string!"
. . . . . . . . .
MimeBodyPart mbp1 = new MimeBodyPart();
mbp1.setText(msgText); file://把前面界说的msgText中的文字设定为邮件正 文的内容
file://建设附件部门
MimeBodyPart mbp2 = new MimeBodyPart();
file://利用setText(text, charset)来插手附件
mbp2.setText(msgAttachment, "gb2312");
file://建设Multipart
Multipart mp = new MimeMultipart();
mp.addBodyPart(mbp1);
mp.addBodyPart(mbp2);
// 添加 Multipart到Message中
message.setContent(mp);
file://发送邮件
Transport.send(message);
}
#p#副标题#e#
问题三、我奈何从邮件处事器中获取邮件列表
答复:其实实现这个问题的要领很简朴
1. JavaMail客户端通过建设一个默认的会话(Session)工具来开始一个邮 件处理惩罚任务
Session session = Session.getDefaultInstance(props, authenticator);
2. 客户端利用Session工具的getStore要领来毗连到默认到Store提供者。 GetStore要领返回一个 Store 工具子类,它支持用户属性中界说的毗连协议。
Store store = session.getStore();
store.connect();
3. 假如毗连乐成的话,客户端就可以或许列出Store中的可用的文件夹。然后我 们就可以取得或时欣赏特定的Message工具。
// 取得 INBOX 文件夹
Folder inbox = store.getFolder("INBOX");
// 打开 INBOX 文件夹
inbox.open(Folder.READ_WRITE);
Message message[] = inbox.getMessage();
for(int i =0;filenumber=message.length;i < filenumber;i ++)
{
System.out.println(“第”+i +”封信:”+message[i ].getFrom()[0]+”\t” +message[i ].getSubject());
}
...
...
4. 最后,客户端封锁所有打开的文件夹,并封锁所有Store。
inbox.close(); // 封锁INBOX
store.close(); // 封锁Store
问题四:我想删除邮箱中的某些邮件,该怎么办呢?
在邮件处事器上,我们假如想删除某封信的话,只需挪用setFlag()来配置 Flags.Flag.DELETE为真即可。
譬喻:Message message = folder.getMessage(1);
message.setFlag(Flags.Flag.DELETED, true); file://配置 Flags.Flag.DELETE为真。
// 查抄这封信的DELETED标志是否配置
if (message.isSet(Flags.Flag.DELETED))
System.out.println("这封信已被删除,请返回!");
问题五:我想知道我的邮箱中有几多封信我读过了有几多封信我没有读过, 我该怎么办?
#p#分页标题#e#
我们知道,Folder工具提供了三个要领, getMessageCount,getNewMessageCount和getUnreadMessageCount。 GetMessageCount要领显示邮箱中总共有几多封信,getNewMessageCount显示邮箱 中新邮件的封数;getUnreadMessageCount显示邮箱中已读邮件的封数。操作这 三个要领,我们可以很容易的看到邮箱中有几多封信我们已经读到过,有几多没 有读。见下面的措施:
import javax.mail.*;
import javax.mail.internet.*;
public class CheckMyMailBox{
public class void main( )
throws Exception{
Properties props= new
// 建设properties工具
Properties props = new Properties();
file://得到Session
Session session = Session.getDefaultInstance(props, null);
file://得到Store
Store store=session.getStore(“pop3”);s
store.connect(Pop3Host,username,password);
file://得到folder,打开INBOX
Folder inbox= store.getFolder(“INBOX”);
file://以只读方法打开邮件夹
inbox.open(Folder.READ_ONLY);
file://取得邮箱中总共有几多封信
int numberOfTotal = inbox.getMessageCount();
file://取得邮箱中未读过的信
int numberOfUnread= inbox.getUnreadMessageCount();
System.out.println(“您的邮箱中共有”+ numberOfTotal+”封邮件,个中有 ”+ numberOfUnread+”封没有读过”);
file://封锁毗连
inbox.close();
store.close();
问题六:我的邮件中有一个附件,我怎么把它打开呢?
说到邮件中的附件,我不得不说一说Multipart类,Multipart类是Message类 的子类,提供了在邮件中插手附加的实现要领。一个多部门邮件是一个内容范例 (content-type)被配置为multipart的Message工具。Multipart类是一个容器 类,包括Bodypart范例的工具。Bodypart工具是一个Part接口的实例,它既包罗 一个新的Multipart容器工具,又包罗一个DataHandler工具。
下图显示了一个Multipart邮件的布局。
下图显示了一个典范的Multipart邮件的嵌套
当邮件中有附件时,邮件的内容就是Multipart而不是我在前面所说的Part范例 了。我们需要取得Multipart的每一部门并按照以需要和内容举办处理惩罚。此刻让 我们看一看在措施上是如何实现的:
import java.io.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
public class getAttachment{
public static void main(String args[])
{
String host=args[0];
String username=args[1];
String userpassword=args[2];
n=3;//为了简朴起见,我默认第三封信为有附件的邮件
Session session =Session.getInstance(new Properties(),null);
Store store=session.getStore("pop3");
store.connect (host,username,userpassword);
Folder folder=store.getFolder ("INBOX");
folder.open(Folder.READ_ONLY);
Message message[]=folder.getMessage();
Object content=message [n].getContent();
if (content instanceof Multipart)
{
handleMultiPart((Multipart)content);
}
else
{
handlePart(message[n]);
}
folder.close();
store.close();
}
public static void handleMultiPart (Multipart multipart)
{
for(int i=0,i
{
handlePart(multipart.getBodyPart(i));
}
}
public static void handlePart(Part part)
{
String disposit=part.getDisposition();
String conType=part.getContentType();
if(disposit==null){//假如只有正文
System.out.println("没有:"+conType);
file://查抄 是否为普通邮件
if ((conType.length()>=10)&& (conType.toLowerCase().substring(0,10).equals ("text/plain"))){
part.writeTo(System.out);
}
else {
file://大概为HTML名目标邮件,可是本文还不涉及这方面的内 容故不予以思量。
System.out.println("其它各是的正 文:"+conType);
part.writeTo(System.out);
}
}
else if (disposit.equals(Part.ATTACHMENT))//不然说明邮件中有附件
{
System.out.println("附件:"+part.getFileName() +:conType);
storeFile(part.getFileName(),part.getInputStream ());
}
else {
System.out.println("其 它:"+disposit);
}
}
public static void storeFile (String fileName,InputStream inputstream)//生存文件
{
File file=new File(fileName);
for(int i=0;file.exists();i++)
{
file= new File(fileName+i);
}
FileOutputStream fileoutputstream =new FileOutputStream(file);
BufferedOutputStream bufferedoutputstream =new BufferedOutputStream (fileoutputstream);
BufferedInputStream bufferedinputstream =new BufferedInputStream(BufferedInputStream);
int n;
while ((n=bufferedinputstream.read())!=-1)
{
bufferedoutputstream.write(n);
}
bufferedoutputstream.flush();
bufferedoutputstream.close();
bufferedinputstream.close();
}
}
本文用了一些问题 和相应的解答,和各人探讨了JavaMail Api的利用要领,但愿本文对各人的进修 和事情有所辅佐。