在我以前发表的文章《使用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);
}
问题三、我怎样从邮件服务器中获取邮件列表
回答:其实实现这个问题的方法很简单
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("这封信已被删除,请返回!");
问题五:我想知道我的邮箱中有多少封信我读过了有多少封信我没有读过,我该怎么办?
我们知道,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而不是我在前面所说的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的使用方法,希望本文对大家的学习和工作有所帮助。
闽公网安备 35060202000074号