JAVA MAIL JavaMail详解

Proteus+汇编+8086电子时钟实战:从框架搭建到中断驱动的核心实现 本文详细介绍了使用Proteus仿真软件和8086汇编语言实现电子时钟的完整过程。从程序框架搭建、内存分段模型理解,到核心的8259中断控制器配置与编程,再到中断服务程序编写和数码管动态扫描显示驱动,系统阐述了底层软硬件协同开发的核心原理与实战步骤。该项目是深入理解计算机中断机制和汇编语言编程的绝佳实践。 阅读详情

在Java EE应用程序中,经常需要发送E-mail。Java EE框架为应用提供了JavaMail接口,通过JavaMail相关的接口可以读取邮件服务器的邮件,并且可以完成邮件的发送过程。

本章的主要内容包括:

—  E-mail体系结构

—  JavaMail API

— 如何使用JavaMail API发送邮件

— 如何使用JavaMail API接收邮件

29.1  E-mail体系结构
29.1.1  什么是E-mail
E-mail是用户间或应用程序间交换信息的Internet标准。每个用户都有自己的网上邮箱,发送方把信息发送到自己的网上信箱,并声明信息的接收方;该信箱所在的“邮局”会把信息发送到接收方的“邮局”,接收方从接收方的“邮局”中自己的信箱获取信息。这样就完成了信息从发送方到接收方的传递。所以,要发送或者接收邮件首先应该有自己的邮箱。

E-mail消息可以包含普通文本,也可以包含更为复杂的多媒体数据类型和图像声音等。这样,用户就可以交换各种各样的信息。

每个E-mail消息的头信息中都包含消息的发出者、发送的目的地和其他相关信息。

29.1.2  E-mail体系结构
要完成消息的交互,需要几方面的支持:邮件发送客户端程序、邮件接收客户端程序、邮件发送服务器和邮件接收服务器,此外,还需要相关的通信协议。

邮件发送客户端程序和邮件接收客户端程序可以是相同的,例如经常使用的微软的Outlook既可以发送邮件,也可以接收邮件。

邮件发送服务器和邮件接收服务器也可以是相同的服务器。在与邮件服务器交互的过程中,主要完成两个动作,把邮件发送到邮件服务器,以及从邮件服务器读取邮件。所以,主要使用两类协议,分别进行邮件的发送和接收。

邮件从发送方到接收方的传递过程(参见图29.1)如下:

(1)邮件发送方通过邮件发送客户端把邮件发送到发送方的邮件服务器,在发送的过程中需要用到SMTP协议。

(2)发送方的邮件服务器把邮件发送到接收方的邮件服务器,使用的协议也是SMTP。

(3)邮件接收方从接收方邮件服务器接收邮件,使用POP3协议或者IMAP协议。

邮件

发送方
 
发送方邮件

服务器
 
接收方邮件

服务器
 
邮件

接收方
 
SMTP
 
SMTP
 
IMAP
 
POP3
 

图29.1  邮件从发送方到接收方的传递过程

29.1.3  E-mail相关的协议
— 简单邮件传输协议(SMTP)

在邮件发送方把邮件发送到发送方邮件服务器的时候,需要用到简单邮件传输协议(Simple Mail Transport Protocol,简称SMTP),发送方邮件服务器把邮件发送到接收方邮件服务器的时候,也要用到SMTP。SMTP是应用程序与邮件服务器通信并发送邮件的Internet标准,SMTP通信基于TCP协议端口25之上。

— 邮箱协议(POP3)

邮件接收方从接收方邮件服务器接收邮件的时候,需要使用检索协议,可以使用POP3或者IMAP。POP3是Post Office Protocol的简称,是用于接收方从邮件服务器上检索E-mail消息的协议,工作在TCP协议端口110之上。

—  Internet消息访问协议(IMAP)

IMAP是Internet Message Access Protocol的简称,与POP3基本相同。完成的主要功能是从邮件服务器接收邮件,使用的端口是293。

29.1.4  什么是Java Mail
在Java EE应用中,经常需要通过E-mail与用户进行交互,主要是与邮件服务器的交互,例如向邮件服务器发送邮件,或者从邮件服务器接收邮件。如果是用户之间直接进行交互可以使用邮件客户端程序,例如微软的Outlook。如果想在应用程序中发送邮件,就不能直接使用通用的客户端了,需要编写自己专门的邮件发送和接收代码,并且需要与邮件服务器进行交互。可以通过Socket编程,使用相关的协议完成,但是这个过程非常复杂。而Java Mail提供了比较便利的解决方案。

JavaMail是Java EE中的标准API,是对邮件服务器访问过程的封装。使用JavaMail API则不需要编写与邮件服务器交互的详细过程,只需要调用相关接口即可。在接口中封装了与邮件服务器交互的详细过程。

本章的主要内容是介绍如何通过JavaMail API完成邮件的发送和接收。

29.2  JavaMail API                    
JavaMail API主要包括四个部分:Session,Message,Transport和InternetAddress。下面分别进行介绍。

29.2.1  Session
Session定义了全局的和每个用户的与邮件相关的属性,这些属性详细说明了客户机和服务器如何交流信息。Session中定义的属性如下:

—  mail.store.protocol:确定检索邮件所使用的协议。可以是IMAP(接收),也可以是POP3。

—  mail.transport.protocol:确定发送邮件所使用的协议,可以是SMTP(发送)。

—  mail.host:确定邮件服务器的主机名。

—  mail.user:确定检索邮件或者发送邮件的用户名。

—  mail.protocol.host:确定具体的发送邮件服务器或者接收邮件服务器。有时候发送邮件服务器和接收邮件服务器使用的主机不同,这时候需要详细指定各个协议使用的主机,如果不指定,则使用mail.host所确定的主机。

—  mail.protocol.user:为登录特定邮件服务器所使用的用户名,如果没有指定,使用mail.user所指定的用户。

—  mail.from:为邮件指定默认的回复地址,如果没有指定,使用mail.user所指定的用户。

29.2.2  Message
Message表示单个邮件消息,其属性包括消息类型、地址信息和所定义的目录结构。但是Message类是一个抽象类,必须实现它的一个子类。通常使用MimeMessage,它是Message类的一个派生类。

Message类的主要方法有两部分,第一部分主要在发送邮件的时候使用,用于设置邮件的相关信息,包括邮件的发送者、接收者、主题和发送时间等。这些方法如下:

—  setFrom(),用于设置邮件的发送者,值从“mail.user”属性中获取,如果这个值是默认的,则使用系统属性“user.name”。

—  setFrom(Address address),与上一个方法的作用相同,值是通过参数确定的,是Address的对象,通常使用其实现者InternetAddress的对象作为参数。

—  addFrom(Address[] addresses),在已有的邮件发送者中添加其他的邮件发送者,参数是要添加的邮件发送者的地址。

—  setSubject(String subject),用于设置邮件的标题。

—  setContent(String contentType),用于设置邮件的内容类型。

—  setSentDate(java.util.Date date),用于设置邮件发送的时间。

—  setRecipient(Message.RecipientType type, Address address),用于设置邮件的接收者。有两个参数,第一个参数是接收者的类型,第二个参数是接收者。接收者类型可以是Message.RecipientType.TO,Message.RecipientType.CC和Message.RecipientType.BCC,TO表示主要接收人,CC表示抄送人,BCC表示秘密抄送人。接收者与发送者一样,通常使用InternetAddress的对象。

—  addRecipient(Message.RecipientType type, Address address),用于添加邮件的接收者,其参数与setRecipient方法的基本相同。

—  setRecipients(Message.RecipientType type, Address[] addresses),作用和setRecipient基本相同,区别在于该方法可以同时设置多个邮件的接收者。

—  addRecipients(Message.RecipientType type, Address[] addresses),用于添加邮件接收者,可以同时添加多个接收者。

—  setReplyTo(Address[] addresses),设置邮件的回复地址,参数用于确定要回复的地址。

—  setText(String text),用于设置邮件的文本,同时还将邮件的内容类型设置为text/plain。如果邮件的内容类型不是文本的,则需要通过setContent方法来设置内容类型。

第二部分用于获取邮件的相关信息,在接收邮件的时候使用:

—  Flags getFlags(),用于获取与邮件相关的标记属性。

—  Folder getFolder(),用于获取该邮件所在的文件夹。

—  Address getFrom(),用于获取邮件的发送者。

—  int getMessageNumber(),用于获取邮件的编号,该编号是邮件系统设置的。

—  Address[] getAllRecipients(),获取邮件的所有接收者。

—  java.util.Date getReceivedDate(),用于获取邮件的接收时间。

—  Address[] getRecipients(Message.RecipientType type),用于获取指定接收类型的接收者,参数用于确定接收者的类型。

—  Address[] getReplyTo(),用于获取邮件的回复者,也就是邮件要给哪些人回复。

—  java.util.Date getSentDate(),用于获取邮件的发送时间。

—  java.lang.String getSubject(),用于获取邮件的主题。

29.2.3  Transport
Transport是一个抽象类,用于邮件的发送,主要的方法有:

—  public static void send(Message msg) throws MessagingException,用于发送邮件,参数就是要发送的邮件本身,该方法是一个静态方法,不需要实例化对象,可以直接使用。

—  public static void send(Message msg, Address[] addresses) throws MessagingException,也是用于发送邮件,有两个参数,第一个参数是要发送的邮件本身,第二个参数是邮件发送的目的地。该方法会忽略在邮件中设置的接收者。

29.2.4  InternetAddress
InternetAddress把用户的E-mail地址映射为Internet地址。得到的邮件发送者和接收者通常都是字符串,但是在Message中确定邮件的接收者和发送者,以及在发送邮件时候使用的都是Address的对象。InternetAddress是Address的派生类,可以把字符串转换成InternetAddress类的对象。

构造函数如下:

InternetAddress( ),无参数的默认构造函数。

InternetAddress(java.lang.String address),把一个字符串构造成一个InternetAddress,用得比较多。

InternetAddress(java.lang.String address, java.lang.String personal),使用字符串和个人姓名构造一个InternetAddress。

InternetAddress(java.lang.String address, java.lang.String personal, java.lang.String charset),使用字符串和个人姓名构造一个InternetAddress对象,名字的编码方式是第三个参数确定的。

要设置该对象所表示的Internet地址,可以通过下面的方法:

void setAddress(java.lang.String address),参数确定了地址。

如果想把Internet地址转换成字符串,则使用下面的方法:

java.lang.String toString()

29.3  WebLogic中邮件会话的配置
在介绍邮件发送和邮件接收程序之前,需要在WebLogic中配置邮件会话的相关信息。需要配置所使用的发送邮件服务器和接收邮件服务器。在WebLogic中的配置过程如下:

(1)进入到WebLogic Server的控制台;

(2)在控制台的左下方选择【Domain Structure】→【Service】→【Mail Sessions】;

(3)在控制台的左上方点击【Lock & Edit】;

(3)在界面的右边点击【New】;

(4)在接下来的过程中需要分别输入下面的信息:

— 会话的名字(Name):MailSession。

— 会话的JNDI名字(JNDIName):MailSession;会话的JNDI名字可以和会话的名字相同。

— 会话相关的属性:

mail.pop3.host = 218.25.154.4 (应该写你所使用的邮件服务器的IP地址)

mail.transport.protocol = smtp (发送)

mail.user = lixucheng

mail.smtp.host = 218.25.154.6

mail.store.protocol = pop3(接收)

其中mail.pop3.host是所使用的接收邮件服务器,mail.transport.protocol是发送邮件所使用的协议,mail.user是发送邮件和接收邮件时候的用户名,mail.smtp.host是所使用的发送邮件服务器,mail.store.protocol是检索邮件所使用的协议。

输入完这些信息之后,点击【Save】,创建该邮件会话。

(5)把邮件会话部署到相应的服务器上:选择【Targets】页面,从服务器列表中选择相应的服务器,然后点击【Save】,就完成邮件会话的配置了。要让之前的配置起作用,需要点击左上角的【Activate Changes】(参见图29.2和图29.3)。

29.4  邮件发送示例程序
发送邮件的基本过程如下:

(1)得到会话对象

(2)构造邮件对象

(3)发送邮件


图29.2  邮件会话的配置


图29.3  把会话部署到相应的服务器上

29.4.1  得到会话对象
这里使用前面在WebLogic中配置好的邮件会话,所以首先要获取这个会话。下面的代码完成获取邮件会话的功能:

//获取上下文环境

Context ctx = new InitialContext();

//从JNDI中查找会话MailSession

Session mailSession = (Session) ctx.lookup("MailSession");

其中,MailSession是我们在前面配置的邮件会话中的JNDI名字。

如果不使用配置好的邮件会话,可以通过创建Properties对象设置相关会话属性,然后,通过Session.getInstance(propoties, null)创建会话对象。

29.4.2  构造邮件对象
发送一封邮件通常需要确定邮件发送者、邮件接收者、邮件的主题和邮件的内容,有时候还需要发送附件。这里先不考虑附件。其他的条件通过JSP界面接收,下面是构造邮件的代码:

//获取相关参数

String to = request.getParameter("to");

String subject = request.getParameter("subject");

String from = request.getParameter("from");

String message = request.getParameter("message");

to = new String(to.getBytes("8859_1"));

subject = new String(subject.getBytes("8859_1"));

from = new String(from.getBytes("8859_1"));

//创建消息对象

Message msg = new MimeMessage(mailSession);

 

//把邮件地址映射到Internet地址上

InternetAddress dest = new InternetAddress(to);

 

//设置消息内容

msg.setFrom(new InternetAddress(from));

msg.setSubject(subject);    

msg.setRecipient(Message.RecipientType.TO, dest);

msg.setContent(message, "text/plain");

首先,通过request对象的getParameter方法获取邮件接收者、邮件发送者、邮件主题和邮件内容。然后,创建Message的对象。最后,通过Message的setXXX方法设置邮件的相关信息。

29.4.3  发送邮件
通过Transport的send(Message msg)方法发送构建好的消息。

Transport.send(msg);

29.4.4  完整的代码
该实例的代码分为两部分,第一部分是发送邮件的界面,第二部分是发送邮件的处理代码。完整的代码如下:

<%@ page import = "java.util.*,

             javax.mail.*,

         javax.mail.internet.*,

         javax.naming.*"

%>

<%@ page contentType = "text/html;charset = gb2312"%>

<html>

<head>

<title>Mail Sender JSP</title>

</head>

<body>

 

<%

 

if (request.getMethod().equals("POST")) {

 

try {

 

    //获取相关参数

    String to = request.getParameter("to");

    String subject = request.getParameter("subject");

    String from = request.getParameter("from");

    String message = request.getParameter("message");

    to = new String(to.getBytes("8859_1"));

    subject = new String(subject.getBytes("8859_1"));

    from = new String(from.getBytes("8859_1"));

    message = new String(message.getBytes("8859_1"));

    //获取上下文环境

    Context ctx = new InitialContext();

 

    //从JNDI中查找会话MailSession

    Session mailSession = (Session) ctx.lookup("MailSession");

 

    //创建消息对象

    Message msg = new MimeMessage(mailSession);

   

    //把邮件地址映射到Internet地址上

    InternetAddress dest = new InternetAddress(to);

 

    //设置消息内容

    msg.setFrom(new InternetAddress(from));

    msg.setSubject(subject);    

    msg.setRecipient(Message.RecipientType.TO, dest);

    msg.setContent(message, "text/plain");

   

    //通过Transport类发送消息

    Transport.send(msg);

 

    out.println("<h2>到 " + to + "的邮件发送成功!<h2>");

 

  }

  catch (Exception e) {

 

    out.println(e);

 

  }

} else {

 

%>

 

<h1>发送邮件!</h1>

<form method = "post" action = "mailsender.jsp">

 

To :<input type = "text" name = "to" size = 16><p>

 

From :<input type = "text" name = "from" size = 16><p>

 

Subject :<input type = "text" name = "subject" size = 16><p>

 

Message :<input type = "text" name = "message" size = 16>

<p>

<input type = "submit" value = "Submit" name = "Command">

 

 

<%

}

%>

</body>

</html>

29.4.5  程序的运行结果
直接访问mailsender.jsp文件时候的结果,这时候使用的请求方式是get,所以显示邮件发送的界面,参见图29.4。


图29.4  邮件发送的界面

图29.5显示了邮件发送成功的界面。填写完邮件的信息之后,提交给服务器,这时候的请求方式是Post。首先获取用户输入的与邮件相关的信息,然后把邮件发送出去。

 

图29.5  邮件发送成功的界面

29.4.6  发送HTML格式的邮件
HTML格式的邮件发送过程与前面文本类型邮件的发送过程基本相同,不同的是需要读取邮件的HTML文件,同时,需要设置邮件内容的格式。

先获取邮件的内容:

String content = "";

String file = "source.htm";

//要发送的html文件

String line = "";

FileReader f = new FileReader(file);

BufferedReader b = new BufferedReader(f);

While((line = b.readline()) != null)

   content += line;

然后设置邮件的内容,把邮件的内容添加到邮件对象中:

message.setContent(content, "text/html");

29.4.7  发送带附件的邮件
我们经常需要发送带附件的邮件。带附件的邮件发送过程与前面介绍的普通邮件发送过程基本相同,不同的是邮件本身的构造比较麻烦。下面我们介绍如何发送带附件的邮件,有些代码和前面是相同的,所以这里只介绍与前面不同的代码。

创建一个带附件的邮件的过程如下:

— 创建BodyPart对象,该对象表示邮件的主体或者邮件的附件。

— 把所有的BodyPart对象添加到MimeMultipart对象中。

— 把MimeMultipart对象添加到MimeMessage对象中。

(1)BodyPart对象的创建

BodyPart是抽象类,具体使用的是MimeBodyPart类的对象,而MimeBodyPart是BodyPart类的派生类。组成邮件的各部分都是MimeBodyPart的对象。

首先,创建邮件的主体部分:

BodyPart messagebody = new MimeBodyPart();

//创建BodyPart类的对象

messagebody.setText("带附件的邮件,注意查看附件!");

//设置邮件的内容

这样就创建了邮件的第一部分,也就是邮件的主体部分,下面创建邮件的附件部分。其中filename表示附件的名字。

BodyPart attachment = new MimeBodyPart();

//创建BodyPart对象,用于表示邮件的附件

String filename = "filename";

//要发送的邮件附件的名字

DataSource ds = new FileDataSource(filename);

//创建数据源,数据源指向附件文件

attachment.setDataHandler(new DataHandler(ds));

//把附件BodyPart对象指向ds

attachment.setFileName(filename);

//设置附件的文件名

这样把邮件的主体部分和邮件的附件部分全部创建完了。

(2)把Body对象添加到MimeMultipart对象中

邮件的各个组成部分不能独立添加到MimeMessage对象中,可以添加到其中的只能是Multipart的对象,而组成邮件的各个部分可以分别添加到Multipart对象中。下列代码完成的功能是把前面创建好的邮件的两部分添加到Multipart对象中。

Multipart multipart = new MimeMultipart();

//创建MimeMultipart对象

multipart.addBodyPart(messagebody);

//把messagebody添加到multipart对象中

multipart.addBodyPart(attachment);

//把附件添加到multipart中

(3)把MimeMultipart对象添加到MimeMessage中

把MimeMultipart对象添加到MimeMessage对象中的方法非常简单,与前面介绍的基本相同。

message.setContent(multipart);

把MimeMultipart对象添加到message中之后,邮件的构造就完成了。邮件的发送过程与前面介绍的简单邮件的发送过程相同。

29.5  邮件接收示例程序
邮件接收的基本过程如下:

— 获得邮件会话;

— 创建Store对象;

— 连接到邮件服务器;

— 得到默认的文件夹;

— 得到所要操作的文件夹;

— 打开文件夹,可以获取与文件夹相关的信息;

— 获取文件夹中的所有邮件;

— 获取邮件相关的信息。

29.5.1  获得邮件会话
与发送邮件相同,接收邮件也需要获取相关的邮件会话。可以使用在WebLogic中配置好的邮件会话,也可以通过Properties对象保存邮件会话相关的信息,然后通过该Properties对象创建邮件会话。下面的代码使用的是WebLogic中配置好的邮件会话。在运行程序之前,需要保证配置好邮件会话。

Context ctx = new InitialContext();

//创建上下文环

Session mailsession = (Session)ctx.lookup("MailSession");

//得到邮件会话

29.5.2  创建Store对象
要检索邮件服务器上的邮件,需要连接到邮件服务器,与邮件服务器的连接可以通过Store对象来完成。Store对象是通过Session的getStore方法创建的。

    Store store = mailsession.getStore();

    //创建存储对象

29.5.3  连接到邮件服务器
连接到邮件服务器,需要知道邮件服务器的地址、连接邮件服务器的用户名以及该用户的口令。连接过程是通过Store对象的connect方法完成的。该方法需要三个参数,第一个参数为邮件服务器的地址、域名或者IP地址,第二个参数是用户名,第三个参数是口令。

    store.connect("218.25.154.4","lixucheng","123456");

    //连接到邮件服务器

29.5.4  得到默认的文件夹
连接到邮件服务器之后,可以得到一个默认的文件夹,通过它可以获得其他的文件夹。默认文件夹是通过Store对象的getDefaultFolder方法得到的。文件夹是邮件的存储地方。

    Folder defaultFolder = store.getDefaultFolder();

    //得到默认的文件夹

29.5.5  得到所要操作的文件夹
要访问邮件,需要得到邮件所在的文件夹,可以通过默认文件夹得到该文件夹,defaultFolder的list方法可以得到所有的文件夹。

    Folder[] allfolder = defaultFolder.list();

也可以通过Store对象的getFolder方法得到想要的文件夹。该方法需要一个参数,用于指定要打开的文件夹的名字。如果想得到INBOX文件夹,可以通过下面的方法。

    Folder folder = store.getFolder("INBOX");

29.5.6  打开文件夹,可以获取与文件夹相关的信息
可以通过Folder对象的open方法打开文件夹。该方法需要一个参数,指定了文件夹的打开方式。文件夹的打开方式有两种:READ_ONLY和READ_WRITE。如果只是检索邮件信息而不改变其状态或内容,则应该使用READ_ONLY打开方式。下面的代码是分别打开邮箱中的文件夹,并获得文件夹的相关信息。

        for(int i = 0;i<allfolder.length;i++)

        {

            allfolder[i].open(Folder.READ_ONLY);

            out.println(allfolder[i].getName());

            out.println("/t"+allfolder[i].getMessageCount());

            out.println("/t"+allfolder[i].getNewMessageCount());

            out.println("/t"+allfolder[i].getUnreadMessageCount());

            out.println("<br>");

            allfolder[i].close(false);

        }

其中,getName( )方法用于获取文件夹的名字,getMessageCount得到文件夹中邮件的数量,getNewMessageCount得到文件夹中新邮件的数量,getUnreadMessageCount得到文件夹中未读邮件的数量。读取文件夹的信息之后,需要关闭文件夹。

29.5.7  获取文件夹中的所有邮件
要获取文件夹中的邮件,首先要打开文件夹。获取邮件是通过文件夹的getMessages方法来完成的。

defaultFolder = allfolder[0];

defaultFolder.open(Folder.READ_ONLY);

//打开该文件夹

Message[] messages = defaultFolder.getMessages();

//得到邮件信息

29.5.8  获取邮件相关的信息
得到邮件对象Message之后,就可以获取邮件相关的信息以及邮件的内容了。下面的代码输出了邮件的相关信息:

Message message = messages[j];

out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");

out.println("<td>"+message.getSubject()+"</td>");

out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");

out.println("<td>"+message.getSize()+"</td></tr>");

out.println("<td>"+(String)message.getContent()+"</td></tr>");

其中,getFrom( )得到邮件的发送者,getSubject得到邮件的主题,getSentDate得到邮件的发送时间,getSize得到邮件的大小,getContent得到邮件的内容。

29.5.9  邮件的状态
邮件可以处于不同的状态,使用系统标记来标识邮件的状态,可以用Flags.Flag类中的静态成员变量来标记。共有七种:ANSWERED,DELETED,DRAFT,FLAGGED,RECENT,SEEN和USER。

ANSWERED表示该邮件已经被回复,当客户端对该信息回复后可以把该邮件标记为ANSWERED。

DELETED表示该邮件已经被删除,对某个文件夹的删除操作将删除该文件夹中所有标记为DELETED的邮件。

DRAFT表示该邮件是草稿,这样就不会被发送。

FLAGGED标记没有定义明确的语义,客户端可以根据自己的需要来使用该标记。

RECENT表示该邮件是最近一段时间的,是上次文件夹打开之后到达的邮件。

SEEN表示该邮件被查看过,当该邮件的内容以某种方式被用户得到后该邮件标记为SEEN,一般情况下调用Message的getInputStream和getContent方法会使得该标识得到设置。

USER是一个特殊的标志,表示文件夹支持用户自定义的标志。

getFlags( )可以得到邮件的标记,该方法返回的是Flags对象,要获得所有的标记,通过Flags对象的getSystemFlags方法获得具体标记的集合,而具体标记是Flags.Flag的对象。

isSet方法用于判断该邮件是否被设置了某个标记,而参数是某个给定的标志。如果邮件被设置了该标记,返回值是true;如果邮件没有被设置该标记,返回值为false。该方法通常用于判断邮件的状态。

setFlag用于设置邮件的状态,共有两个参数。第一个参数是所设置的标识的类型,第二个参数是值,取值为true或者false。

setFlags方法与setFlag方法的作用大致相同,不同之处在于可以同时设置多个标识。

29.5.10  接收邮件的完整代码
接收邮件的完整代码如下:

<%@ page import = "java.util.*,

             javax.mail.*,

         javax.mail.internet.*,

         javax.naming.*"

%>

<%@ page contentType = "text/html;charset = gb2312"%>

<!doctype html public "-//w3c/dtd HTML 4.0//en">

<html>

<head>

<title>Mail Sender JSP</title>

</head>

<body>

<%

    try

{

        Context ctx = new InitialContext();

        //创建上下文环

        Session mailsession = (Session)ctx.lookup("MailSession");

        //得到邮件会话

        Store store = mailsession.getStore();

        //创建存储对象

        store.connect("218.25.154.4","lixucheng","123456");

        //连接到邮件服务器

        Folder defaultFolder = store.getDefaultFolder();

        //得到默认的文件夹

        Folder[] allfolder = defaultFolder.list();

        for(int i = 0;i<allfolder.length;i++)

        {

            allfolder[i].open(Folder.READ_ONLY);

            out.println(allfolder[i].getName());

            out.println("/t"+allfolder[i].getMessageCount());

            out.println("/t"+allfolder[i].getNewMessageCount());

            out.println("/t"+allfolder[i].getUnreadMessageCount());

            out.println("<br>");

            allfolder[i].close(false);

        }

        defaultFolder = allfolder[0];

        defaultFolder.open(Folder.READ_ONLY);

        //打开默认文件夹

        Message[] messages = defaultFolder.getMessages();

        //得到邮件信息

        out.println("邮件的数量:"+messages.length);

        if(messages.length>0)

        {

            out.println("<table>");

            out.println("<tr><td>发送者</td><td>主题</td><td>接收时间</td><td>大小</td><td>内容</td></hr>");

            for(int j = 0;j<messages.length;j++)

            {

                Message message = messages[j];

out.println("<tr><td>"+message.getFrom()[0].toString()+"</td>");

out.println("<td>"+message.getSubject()+"</td>");

out.println("<td>"+message.getSentDate().toLocaleString()+"</td>");

out.println("<td>"+message.getSize()+"</td></tr>");

out.println("<td>"+(String)message.getContent()+"</td></tr>");

                       }

            out.println("</table>");

        }

        defaultFolder.close(false);

        store.close();

    }catch(Exception e)

    {

        out.println(e.toString());

        e.printStackTrace();

    }

 

%>

</body>

</html>

29.6  实验
29.6.1  实验目的
掌握JavaMail API中的主要接口和类,能够实现邮件的发送和接收。

29.6.2  实验内容
编写两个JSP文件,分别用于邮件的发送和接收。

29.6.3  实验过程
(1)先配置邮件会话,把邮件服务器的相关信息配置到邮件会话中。

(2)编写发送邮件的文件。

(3)编写接收邮件的文件。

(4)部署到WebLogic上运行。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/steven_05514/archive/2008/12/08/3478776.aspx

Trae IDE与Playwright MCP:5分钟实现零代码网页数据抓取 网页数据抓取是数据采集和自动化处理中的基础技术,其核心原理是通过程序模拟浏览器行为,定位并提取页面中的结构化信息。传统方式依赖编写脚本处理网络请求、解析HTML和应对反爬机制,技术门槛较高。而结合AI与自动化工具的新范式,通过自然语言交互即可完成复杂操作,极大降低了技术门槛并提升了开发效率。这种技术价值在于将开发者从繁琐的编码中解放,使其更专注于数据分析和业务逻辑。在数据监控、市场调研、竞品分析等应用场景中,快速获取网页数据是关键需求。本文以Trae IDE集成Playwright MCP为例,演示如何通过 阅读详情

相关推荐

Hermes V0.10.0:官方UI几乎无Bug版

如果你还在观望Hermes,现在可能是最好的入局时机。 因为网页端来了,门槛降到了最低。 如果你已经是Hermes用户,升级就对了。 因为0.9.0的更新,值得一试。

weixin_66295112的博客 2044

邮件传送

电子邮件 电子邮件是依靠邮箱服务器来完成的; SMTP服务器地址:一般是 smtp.xxx.com,例如:qq邮箱是smtp.qq.com。 电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。比如我们要使用QQ邮箱,就需要开通邮箱功能; 传输协议 SMTP协议 发送邮件: 通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 P...

zhangc 2727

GD32模拟IIC读写DVC1124

GD32模拟IIC读写集澈AFE芯片DVC1124

ponyma_的博客 1226

邮件发送原理及实现

JavaMail是sun公司(现以被甲骨文收购)为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME等。我们在使用JavaMailAPI编写邮件时,无须考虑邮件的底层实现细节,只要调用JavaMail开发包中相应的API类就可以了。我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。创建包含邮件服务器的网络连接信息的Session对象。创建代表邮件内容的Message对象。...

希望有点用 5499

自动换挡频率计的设计精髓:如何用数字电路优雅地解决量程切换难题

本文深入解析了自动换挡频率计的设计精髓,重点探讨如何利用数字电路优雅解决量程切换难题。通过74系列通用数字集成电路构建智能化的自动量程切换系统,详细介绍了状态检测、决策逻辑和档位执行等核心模块的设计方法,并对比了不同实现方案的优劣,为电子测量领域的工程师提供了实用的硬件设计参考。

weixin_27869497的博客 407

【CTFSHOW】web入门 黑盒测试

文章目录写在前面web380web381web382web383web384web385web386web387web388web389web390web391web392web393web394web395参考资料 写在前面 一直没搞过渗透,先学学黑盒测试吧 web380 进入题目发现是一个关于灯泡的悲伤故事,点进去,看到跳转到page_1.php页面。 我们访问page.php试试: 发现报错:$id.php,可以猜想需要传名称为id的参数,来访问id.php。我们访问page.php?id=1试试

7ruth0hn的博客 1896

java mail pom_Java实现邮件发送

JavaWeb实现邮件发1、传输协议:SMTP协议处理用户邮件发送的请求。POP3协议处理用户邮件接收请的求。2、所需要的jar包mail-1.4.7.jar : 点击下载activation-1.1.1.jar : 点击下载Pom.xml文件:javax.mailmail1.4.7javax.activationactivation1.1.13、发送一封纯文本的邮件package com.xu;...

weixin_34034295的博客 1267

通用抓取————6D位姿估计

这意味着算法在没有物体的先验知识(如 CAD 模型)的情况下,依然能够通过神经网络捕捉物体的外观、形状和几何特征,生成相关的 6D 位姿估计。通过输入物体类别的描述,算法能够推断出该类别物体的位姿和尺度,无需特定物体的 CAD 模型。在这个坐标空间中,物体的位姿和尺度都是已知的,基于这个标准化表示,算法可以对输入图像中的物体进行 6D 位姿和尺寸的估计。○优势: ICP 是一种非常有效的位姿优化算法,特别适合精细调整物体的位姿,确保最终估计的位姿与真实物体的点云或模型高度一致。

具身机器人和通用AI 2376

Java学习-邮件发送

JavaMail API 的工作原理就是通过创建邮件会话、构建邮件消息、连接邮件服务器、发送邮件消息等步骤,实现了邮件的发送功能。使用 JavaMail API 发送邮件本质上就是 MUA(Mail User Agent,邮件用户代理)通过 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)协议将邮件发送到 MTA(Mail Transfer Agent,邮件传输代理)服务器。MUA 是邮件客户端软件,它负责创建、编辑和发送邮件;MTA 是邮件服务器软件,它负责接收、传

SJG_JANE的博客 1002

华为OD机考双机位C卷 - AI处理器组合 (Java & Python & JS & GO & C++ & C)

> 2026华为OD机试双机位C卷 - 华为OD上机考试双机位C卷 华为OD机试双机位C卷真题目录点击查看: [【全网首发】2026华为OD机位C卷 机考真题题库含考点说明以及在线OJ(OD上机考试双机位C卷)](https://blog.csdn.net/banxia_frontend/article/details/155503868)

算法大师! 231

台球 PCOL:极致物理还原的网页斯诺克引擎(附源码深度解析)

*完整源码地址**:[https://github.com/billiards/pcol-core](https://github.com/billiards/pcol-core)(包含详细文档与示例)通过这个项目,我们不仅创建了一个游戏,更构建了一个**可扩展的物理引擎框架**,为网页端复杂物理模拟开辟了新的可能性。**在线体验**:[https://pcol.billiards](https://pcol.billiards)(支持移动端触控操作)clone.velocity.x *= -0.92;

Loving_enjoy的博客 2796

Java发送邮件,支持SSL和TLS,支持给邮箱地址起别名

使用java发送邮件,很常用的功能。 现在大多邮件服务器使用了ssl加密,也有的用tls加密, 这时该如何发送邮件呢,见下文。 1、使用SSL加密方式发送邮件,企业邮箱一般需要此类加密 Properties prop = new Properties(); // 协议 prop.setProperty("mail.transport.protocol", "smtp"); // 服...

星河漫步的专栏 1931

【RKNN】RKNN-Toolkit2 Python API函数详解

RKNN-Toolkit2 的 API 设计以开发者效率为核心,覆盖模型转换、量化、部署全流程。通过灵活的参数配置(如多核调度、混合量化)和调试工具(性能分析、精度对比),可快速适配复杂边缘场景。

浩瀚之水的专栏 786

javamail 超时,Java Mail timeout&连接超时处理

I'm using JavaMail to send email requests to an SMTP server.I would like to set both "mail.smtp.connectiontimeout" and "mail.smtp.timeout" properties within my code.Programmatically, I want to catch b...

weixin_32677301的博客 564

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

mail java mail_javamail使用完全手册

javamail使用完全手册作者:Unkown文章来源:www.jspcn.net发布日期:2004年02月16日前言:自己的精华的文章太少,真没“面子”,这片努力争取争取吧。1,哪里是开始:初始环境,安装好你的j2sdk和你的web服务器,也就是说你的机器应该能够运行jsp。不能??这里不管2,安装javamail和jafJavaMail是Sun发布的用来处理email的API。它可以方...

weixin_31412915的博客 268

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

[转]JAVA MAIL JavaMail详解

http://blog.csdn.net/it_man/archive/2009/07/31/4395946.aspx 在Java EE应用程序中,经常需要发送E-mail。Java EE框架为应用提供了JavaMail接口,通过JavaMail相关的接口可以读取邮件服务器的邮件,并且可以完成邮件的发送过程。本章的主要内容包括:—  E-mail体系结构—  JavaMail

1006

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

java mail 三个_JavaMail

Ø SMTP 的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议(25号端口)。Ø POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。Ø IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一1...

weixin_39825872的博客 226

java mail_javamail的使用方法

1.参考文献https://javaee.github.io/javamail/?xd_co_f=56d1d069-5c5e-41ff-bf54-df52d3d6ccb72.javax.mail.jar的下载地址https://github.com/javaee/javamail/releases3.在eclipse中导入jar包流程如下一、在项目名上右击,依次点击【New】-->【Flod...

weixin_34917038的博客 1220

java mail cc,JavaMail的使用

Javamail是用来发送邮件的一个常用框架,我以前用过这个框架写过一个发送邮件的demo,以下内容是我以前整理的。1javamail的使用我是使用mavne的,所以引用了如下的依赖,如果不引入第二个依赖的话会报javamail的一个log类找不到javax.mailjavax.mail-api1.5.0javadoccom.sun.mailjavax.mail1.5.02javamail中的常用...

weixin_29767773的博客 1229

java mail介绍_【Mail】JavaMail介绍及发送邮件(一)

JavaMail介绍JavaMail是SUN提供给开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发类库,支持常用的邮件协议,如SMTP、POP3、IMAP,开发人员使用JavaMail编写邮件程序时,无需考虑底层的通信细节(Socket),JavaMail也提供了能够创建出各种复杂MIME格式的邮件内容的API。使用JavaMail,我们可以实现类似OutLook、FoxMail的软...

weixin_34239861的博客 909

java mail outlook,Javamail在公​​司中使用outlook

我第一次使用javamail并且有一些例外,我不明白我在其他问题中也看到了一些错误,但是它们的答案对我没有帮助.这是我的代码.final String username = "imsan1@cdcpk.com";final String password = "**********";Properties props = System.getProperties();props.put("mail...

weixin_42513387的博客 476

javamail 超时_Java Mail timeout&连接超时处理

I'm using JavaMail to send email requests to an SMTP server.I would like to set both "mail.smtp.connectiontimeout" and "mail.smtp.timeout" properties within my code.Programmatically, I want to catch b...

weixin_39672572的博客 305

java mail 是什么_JavaMail是什么意思

1. Javamail realization, we can download directly to their works Copy Lane's it.Javamail功能实现,大家可以直接下载文件Copy到自己工程里就行了。2. JavaMail的反义词2. Javamail realization, we can download directly to their works...J...

weixin_42099302的博客 359

java spring mail_Spring JavaMail发送邮件

1.邮件协议主要包括:SMTP协议:Simple Mail Transfer Protocol,即简单邮件传输协议,用于发送电子邮件POP3协议:Post Office Protocol 3,即邮局协议的第三个版本,用于接收邮件IMAP协议:Internet Message Access Protocol,即互联网消息访问协议,是POP3的替代协议2.搭建James邮件服务器James是Apach...

weixin_32115711的博客 1222

java mail pom_集成JavaMail

我们在发送Email和接收Email中已经介绍了如何通过JavaMail来收发电子邮件。在Spring中,同样可以集成JavaMail。因为在服务器端,主要以发送邮件为主,例如在注册成功、登录时、购物付款后通知用户,基本上不会遇到接收用户邮件的情况,所以本节我们只讨论如何在Spring中发送邮件。在Spring中,发送邮件最终也是需要JavaMail,Spring只对JavaMail做了一点简单的...

weixin_34342860的博客 1096

java mail api_JavaMail API 概述

JavaMail API提供了一种与平台无关和协议独立的框架来构建邮件和消息应用程序。 JavaMail API提供了一组抽象类定义构成一个邮件系统的对象。它是阅读,撰写和发送电子信息的可选包(标准扩展)。JavaMail 规定,用于构造一个接口,一个消息传送系统中的元素,包括系统的部件和接口。虽然本规范没有定义任何特定的实现,JavaMail是否包括实现RFC822和MIME Internet邮...

weixin_42510182的博客 825
上一篇: 深入 Lucene 索引机制
下一篇: spring ioc原理(看完后大家可以自己写一个spring)
超级谷歌
博客等级 码龄20年 2271粉丝 286原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值