深入探讨JavaMail API的使用

 问题一、我如何发送一封简单的信件?

  回答:我将在下面的例子中详细的讲解如何发送简单信件

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 I’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 I’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]+” ”+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邮件的结构。

  下图显示了一个典型的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();
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值