JavaMail API简介
java发邮件方法
java发邮件方法Java是一种功能强大的编程语言,它提供了多种方法来实现发送邮件的功能。
本文将介绍两种常用的Java发邮件的方法,分别是使用JavaMail API和使用Spring Framework的JavaMail库。
JavaMail API是一个用于发送和接收电子邮件的标准API,它是Java平台的一部分。
使用JavaMail API,我们可以在Java程序中轻松地发送邮件。
下面是使用JavaMail API发送邮件的步骤:1. 添加依赖:首先,我们需要在我们的Java项目中添加JavaMail API的依赖。
可以通过Maven或Gradle等构建工具,将以下依赖添加到项目的构建文件中:```xml<dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><version>1.6.2</version></dependency>```2. 创建会话对象:接下来,我们需要创建一个会话对象,用于与邮件服务器进行通信。
可以使用javax.mail.Session类的getInstance()方法来创建会话对象,该方法接受一个Properties对象作为参数,用于指定邮件服务器的配置信息,如SMTP 服务器的地址、端口号等。
```javaProperties properties = new Properties();properties.put("mail.smtp.host", "");properties.put("mail.smtp.port", "25");Session session = Session.getInstance(properties);```3. 创建邮件消息:然后,我们需要创建一个邮件消息对象,用于设置邮件的各种属性,如发件人、收件人、主题、内容等。
JavaMail使用
JavaMail使用在Web应用程序的开发中,经常会有处理邮件的需求,在J2EE中提供了邮件处理的API,使用这些API,可以非常方便地接收和发送邮件。
1、邮件协议简介SMTP(Simple Mial Transfer Protocol) 即简单邮件传输协议,它提供了一种可靠而且有效的电子邮件传输协议,SMTP主要用于系统之间传递邮件信息,而且还可以提供来信有关的通知服务。
在发送电子邮件的时候,可以选择这个协议,在JavaMail中提供了对SMTP协议的支持。
POP(Post Office Protocol) 即邮局协议,而POP3则是POP协议的第三个版本,这个协议规定了用户连接到邮件服务器和接收邮件的规则,是Internet电子邮件的第一个离线协议标准。
简单说POP3就是在接收电子邮件的简单通信协议,用户在接收邮件的时候可以选择使用这个协议,在JavaMail中同样支持这个电子邮件协议。
2、开发环境的配置拷贝相关jar包到lib目录下,或配置在classpath中即可3、一个简单的例子为了方便程序的演示,提供了一个测试邮箱,邮箱的地址为jjqibmbld@,密码为123。
这个邮箱的SMTP服务器地址为,POP3服务器地址为。
以下程序演示的是用上面的邮箱向jjq@发送邮件的例子(TestJavaMail.java)那么如何发送带有附件的E-mail呢,如下例子(TestJavaMailAttachment.java)此程序,用户可以在jsp页面上输入要发送邮件的内容和地址,通过表单把邮件的内容提交给一个Servlet处理,这个Servlet调用一个JavaBean进行邮件发送。
为了方便演示,默认发送邮件的地址为jjqibmbld@6、发送带有附件的邮件AttachmentSender.java。
JavaMail组件简单介绍
JavaMail组件的简单介绍一、什么是JavaMailJavaMail是Sun发布的用来处理email的API。
它可以方便地执行一些常用的邮件传输。
虽然JavaMail是Sun的API之一,但它目前还没有被加在标准的java开发工具包中(Java Development Kit),这就意味着你在使用前必须另外下载JavaMail文件。
除此以外,你还需要有Sun的JavaBeans Activation Framework (JAF)。
JavaBeans Activation相关的包你可以到sun的官方网站上去下载二、如何使用JavaMail组件在使用JavaMail发送邮件之前,先来看一下在发送邮件过程中主要使用到的几个类以及它们的用处和用法!Session定义了一个基本的邮件会话,所有的基于JavaMail的程序都至少需要一个或全部的对话目标。
Session对象需要一个,Session的构造函数是私有的,你可以通过getDefaultInstance()方法来取得一个单一的可以被共享的默认的Session,如:Properties props=new Properties();……..Session session = Session.getDefaultInstance(props, null);或者,可以使用getInstance()方法来创建一个唯一的Session如:Properties props=new Properties();…….Session session=Session.getInstance(props,null);在多数情况下,整个应用中使用一个共享Session已经足够了;2、创建了Session 对象以后,那么下面就要创建Message对象来发送Session., Message是一个抽象类,再大部分应用中可以使用它的子类可以用如下的方法创建一个Message;Message newMessage = new MimeMessage(sendMailSession);一旦得到了Message,就可以设置它的各个部分。
Java实现发送邮件,图片,附件
Java实现发送邮件,图⽚,附件1、JavaMail 介绍JavaMail 是sun公司(现以被甲⾻⽂收购)为⽅便Java开发⼈员在应⽤程序中实现邮件发送和接收功能⽽提供的⼀套标准开发包,它⽀持⼀些常⽤的邮件协议,如前⾯所讲的SMTP,POP3,IMAP,还有MIME等。
我们在使⽤JavaMail API 编写邮件时,⽆须考虑邮件的底层实现细节,只要调⽤JavaMail 开发包中相应的API类就可以了。
JavaMail 下载地址:2、JavaMail APIJavaMail API 按照功能可以划分为如下三⼤类:①、创建和解析邮件的API②、发送邮件的API③、接收邮件的API以上三种类型的API在JavaMail 中由多个类组成,但是主要有四个核⼼类,我们在编写程序时,记住这四个核⼼类,就很容易编写出Java邮件处理程序。
Message 类:javax.mail.Message 类是创建和解析邮件的核⼼ API,这是⼀个抽象类,通常使⽤它的⼦类javax.mail.internet.MimeMessage 类。
它的实例对象表⽰⼀份电⼦邮件。
客户端程序发送邮件时,⾸先使⽤创建邮件的 JavaMail API 创建出封装了邮件数据的 Message 对象,然后把这个对象传递给邮件发送API(Transport 类)发送。
客户端程序接收邮件时,邮件接收API把接收到的邮件数据封装在Message 类的实例中,客户端程序在使⽤邮件解析API从这个对象中解析收到的邮件数据。
Transport 类:javax.mail.Transport 类是发送邮件的核⼼API 类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如 SMTP 协议,客户端程序创建好Message 对象后,只需要使⽤邮件发送API 得到 Transport 对象,然后把 Message 对象传递给 Transport 对象,并调⽤它的发送⽅法,就可以把邮件发送给指定的 SMTP 服务器。
JavaMail概述
JavaMail概述J avaMail,顾名思义,提供给开发者处理电子邮件相关的编程接口。
它是Sun 公司发布的用来处理email的API,是一种可选的、用于读取、编写和发送电子消息的包(标准扩展)。
用户可以基于JavaMail开发出类似于Microsoft Outlook的应用程序。
Java Mail是JavaEE平台提供的邮件API。
使用这套API,可以轻松实现邮件的创建,发送和接受。
1.什么是E-mailE-mail是用户间或应用程序间交换信息的Internet标准。
每个用户都有自己的网上邮箱,发送方把信息发送到自己的网上信箱,并声明信息的接收方;该信箱所在的“邮局”会把信息发送到接收方的“邮局”,接收方从接收方的“邮局”中自己的信箱获取信息。
这样就完成了信息从发送方到接收方的传递。
所以,要发送或者接收邮件首先应该有自己的邮箱。
E-mail消息可以包含普通文本,也可以包含更为复杂的多媒体数据类型和图像声音等。
这样,用户就可以交换各种各样的信息。
每个E-mail消息的头信息中都包含消息的发出者、发送的目的地和其他相关信息。
2 E-mail体系结构要完成消息的交互,需要几方面的支持:邮件发送客户端程序、邮件接收客户端程序、邮件发送服务器和邮件接收服务器,此外,还需要相关的通信协议。
邮件发送客户端程序和邮件接收客户端程序可以是相同的,例如经常使用的微软的Outlook既可以发送邮件,也可以接收邮件。
邮件发送服务器和邮件接收服务器也可以是相同的服务器。
在与邮件服务器交互的过程中,主要完成两个动作,把邮件发送到邮件服务器,以及从邮件服务器读取邮件。
邮件发送方通过邮件发送客户端把邮件发送到发送方的邮件服务器,在发送的过程中需要用到SMTP协议。
发送方的邮件服务器把邮件发送到接收方的邮件服务器,使用的协议也是SMTP。
邮件接收方从接收方邮件服务器接收邮件,使用POP3协议或者IMAP协议。
3 E-mail相关的协议简单邮件传输协议(SMTP)在邮件发送方把邮件发送到发送方邮件服务器的时候,需要用到简单邮件传输协议(Simple Mail Transport Protocol,简称SMTP),发送方邮件服务器把邮件发送到接收方邮件服务器的时候,也要用到SMTP。
张孝祥Java邮件开发详解
张孝祥Java邮件开发详解Java邮件开发是一项在当今信息时代非常重要的技能。
随着电子邮件在个人和商业领域的广泛应用,了解如何使用Java编程语言开发邮件应用程序是非常有价值的。
本文将详细介绍张孝祥在Java邮件开发方面的经验和技巧。
一、Java邮件开发概述邮件开发是一种基于邮件传输协议的应用程序开发技术。
它可以实现电子邮件的发送、接收和管理等功能。
Java是一种跨平台的高级编程语言,具有广泛的应用领域。
通过Java,我们可以利用已有的邮件传输协议和库来开发强大的邮件应用程序。
二、Java邮件开发的基本原理Java邮件开发的基本原理是利用Java Mail API与邮件服务器进行通信。
Java Mail API是一组用于发送和接收电子邮件的类和接口。
它提供了Java开发人员所需的一切工具,使他们能够轻松地编写邮件应用程序。
三、Java邮件开发的核心类1. Session类Session类是Java Mail API中的一个关键类,它表示一个邮件会话。
我们可以通过Session类来配置邮件服务器的连接参数,例如主机地址、端口号和认证信息等。
2. Message类Message类用于表示一封电子邮件。
我们可以通过Message类来设置邮件的发件人、收件人、主题、正文和附件等信息。
3. Transport类Transport类用于将邮件发送到邮件服务器并进行传输。
我们可以通过Transport类来发送邮件。
4. Store类Store类用于从邮件服务器接收邮件并进行存储。
我们可以通过Store类来接收和管理邮件。
四、Java邮件开发的基本步骤1. 创建一个Session对象,配置邮件服务器的连接参数。
2. 创建一个Message对象,设置邮件的发件人、收件人、主题、正文和附件等信息。
3. 使用Transport类将Message对象发送到邮件服务器。
4. 使用Store类从邮件服务器接收邮件。
五、Java邮件开发的实际应用Java邮件开发可应用于许多实际场景,例如:1. 发送邮件:可以使用Java Mail API发送电子邮件,便于快速、准确地与他人沟通。
JAVAMAILAPI文档
4、MIME协议
多用途的国际邮件扩充协议定义传输的内容。
二、Java Mail开发包
Java Mail API的核心类包括会话、消息、地址、身份验证、传输、存储和文件夹。
1、会话类(Session)
Session类定义了一个基本的邮件会话。Session对象利用
java.util.Properties对象获取邮件服务器、用户名和密码等信息,以及其他可在整个应用程序rties props = new Properties();
...//填充Properties对象
Session session = Session.getDefaultInstance(props,null); 创建独特会话
Properties props = new Properties();
机制。在Java Mail API环境中,基于JavaMail的应用程序将于与Internet服务提供商的SMTP服务器通信,SMTP服务器把消息转发给用做接收消息的SMTP服务
器。
2、POP协议
邮局协议是Internet上大多数人用来接收邮件的机制。
3、IMAP协议
Internet消息访问协议是用于接收消息的更加高级的协议。
...//填充Properties对象
Session session = Session.getInstance(props,null);
Null参数是一种Authenticator(认证)对象
2、消息类(MimeMessage)
一个MimeMessage对象是一种MIME类型和报头的消息。
如果消息是纯文本
message.setText(&uot;hello&uot;);
java mail详解
java mail详解JavaMail是Java平台上用于发送、接收和管理电子邮件的API。
它提供了一种方便的方式来处理电子邮件,包括发送和接收电子邮件,以及访问和操作邮件服务器。
首先,让我们来看看JavaMail API的一些主要功能和用法。
JavaMail API包括javax.mail包,它提供了发送和接收电子邮件的类和接口。
要发送电子邮件,你需要使用javax.mail.Session类来创建一个会话对象,然后使用javax.mail.internet.MimeMessage类来创建邮件消息。
你可以设置邮件的主题、内容、附件等信息,并使用javax.mail.Transport类的send方法来发送邮件。
另外,JavaMail API也支持接收邮件。
你可以使用javax.mail.Store类来连接到邮件服务器,并使用javax.mail.Folder类来访问邮件文件夹。
通过这些类,你可以检索邮件、读取邮件内容以及执行其他邮件管理操作。
JavaMail API还支持与邮件服务器的安全通信,包括SSL和TLS协议。
你可以使用javax.mail.Session类的属性来配置安全连接参数,以确保与邮件服务器的通信是安全的。
除了基本的发送和接收邮件功能,JavaMail API还提供了一些高级功能,比如处理邮件附件、设置邮件优先级、回复和转发邮件等。
你可以使用javax.mail.internet.MimeBodyPart类来处理邮件附件,使用javax.mail.Flags类来设置邮件标记,以及使用javax.mail.internet.InternetAddress类来表示邮件地址等。
总之,JavaMail API提供了丰富的功能和灵活的接口,使得在Java应用程序中处理电子邮件变得非常方便。
无论是发送简单的文本邮件,还是处理复杂的邮件操作,JavaMail API都能满足你的需求。
希望这些信息能帮助你更好地理解和使用JavaMail API。
JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
JavaWeb学习总结(五⼗⼆)——使⽤JavaMail创建邮件和发送邮件⼀、RFC882⽂档简单说明 RFC882⽂档规定了如何编写⼀封简单的邮件(纯⽂本邮件),⼀封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使⽤空⾏分隔。
邮件头包含的内容有:1. from字段 --⽤于指明发件⼈2. to字段 --⽤于指明收件⼈3. subject字段 --⽤于说明邮件主题4. cc字段 -- 抄送,将邮件发送给收件⼈的同时抄送给另⼀个收件⼈,收件⼈可以看到邮件抄送给了谁5. bcc字段 -- 密送,将邮件发送给收件⼈的同时将邮件秘密发送给另⼀个收件⼈,收件⼈⽆法看到邮件密送给了谁 邮件体指的就是邮件的具体内容。
⼆、MIME协议简单介绍 在我们的实际开发当中,⼀封邮件既可能包含图⽚,⼜可能包含有附件,在这样的情况下,RFC882⽂档规定的邮件格式就⽆法满⾜要求了。
MIME协议是对RFC822⽂档的升级和补充,它描述了如何⽣产⼀封复杂的邮件。
通常我们把MIME协议描述的邮件称之为MIME邮件。
MIME协议描述的数据称之为MIME消息。
对于⼀封复杂邮件,如果包含了多个不同的数据,MIME协议规定了要使⽤分隔线对多段数据进⾏分隔,并使⽤Content-Type头字段对数据的类型、以及多个数据之间的关系进⾏描述。
三、使⽤JavaMail创建邮件和发送邮件 JavaMail创建的邮件是基于MIME协议的。
因此可以使⽤JavaMail创建出包含图⽚,包含附件的复杂邮件。
3.1、JavaMail API的简单介绍3.2、创建邮件发送测试项⽬3.3、发送⼀封只包含⽂本的简单邮件1package me.gacl.main;23import java.util.Properties;4import javax.mail.Message;5import javax.mail.Session;6import javax.mail.Transport;7import javax.mail.internet.InternetAddress;8import javax.mail.internet.MimeMessage;910/**11* @ClassName: Sendmail12* @Description: 发送Email13* @author: 孤傲苍狼14* @date: 2015-1-12 下午9:42:5615*16*/17public class Sendmail {1819/**20 * @param args21 * @throws Exception22*/23public static void main(String[] args) throws Exception {2425 Properties prop = new Properties();26 prop.setProperty("mail.host", "");27 prop.setProperty("mail.transport.protocol", "smtp");28 prop.setProperty("mail.smtp.auth", "true");29//使⽤JavaMail发送邮件的5个步骤30//1、创建session31 Session session = Session.getInstance(prop);32//开启Session的debug模式,这样就可以查看到程序发送Email的运⾏状态33 session.setDebug(true);34//2、通过session得到transport对象35 Transport ts = session.getTransport();36//3、使⽤邮箱的⽤户名和密码连上邮件服务器,发送邮件时,发件⼈需要提交邮箱的⽤户名和密码给smtp服务器,⽤户名和密码都通过验证之后才能够正常发送邮件给收件⼈。
邮件原理与JAVAMAIL3
使用JavaMail API收发邮件31.JavaMail API按其功能划分通常可分为如下三大类(1)创建和解析邮件内容的API:Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。
(2)发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议。
(3)接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件接收协议的邮件接收对象,例如POP3协议。
2.Session类Session类用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送和接收协议等。
Session对象根据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息支持。
3.使用JavaMail发送一封简单的邮件创建包含邮件服务器的网络连接信息的Session对象。
创建代表邮件内容的Message对象。
创建Transport对象、连接服务器、发送Message、关闭连接。
4.实例(1)JavaMail邮件只发送内容public class SendMail{public static void main(String[]args)throws Exception{//属性文件Properties props=new Properties();//设置邮件的发送主机名、发送协议和是否验证props.setProperty("mail.host","");props.setProperty("mail.transport.protocol","smtp");props.setProperty("mail.smtp.auth","true");//获取发送接收邮件环境的对象Session session=Session.getInstance(props);Message message=createMessage(session);//创建发送邮件的对象Transport tsp=session.getTransport();tsp.connect("csdn","csdn");tsp.sendMessage(message,message.getAllRecipients());tsp.close();}public static Message createMessage(Session session)throws Exception{ //根据环境对象创建一份邮件MimeMessage message=new MimeMessage(session);//设置邮件属性message.setFrom(new InternetAddress("csdn@"));message.setRecipient(Message.RecipientType.TO,newInternetAddress("csdn@"));message.setSubject("hello");//创建邮件体MimeBodyPart text=new MimeBodyPart();text.setContent("你好?","text/html;charset=utf-8");//设置描述关系MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);message.setContent(mm);message.saveChanges();return message;}}(2)JavaMail邮件发送内容和图片public class SendImageMail{public static void main(String[]args)throws Exception{//属性文件Properties props=new Properties();//设置邮件的发送主机名、发送协议和是否验证props.setProperty("mail.host","");props.setProperty("mail.transport.protocol","smtp");props.setProperty("mail.smtp.auth","true");//获取发送接收邮件环境的对象Session session=Session.getInstance(props);Message message=createMessage(session);//创建发送邮件的对象Transport tsp=session.getTransport();tsp.connect("csdn","csdn");tsp.sendMessage(message,message.getAllRecipients());tsp.close();}public static Message createMessage(Session session)throws Exception{ MimeMessage message=new MimeMessage(session);message.setFrom(new InternetAddress("csdn@"));message.setRecipient(Message.RecipientType.TO,newInternetAddress("csdn@"));message.setSubject("图片");MimeBodyPart text=new MimeBodyPart();text.setContent("好看吗?<br/><imgsrc='cid:xx.jpg'>","text/html;charset=utf-8");MimeBodyPart image=new MimeBodyPart();image.setDataHandler(new DataHandler(newFileDataSource("src\\f.jpg")));image.setContentID("xx.jpg");MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");message.setContent(mm);message.saveChanges();return message;}}(3)JavaMail邮件发送内容、图片和附件public class SendAttchImageMail{public static void main(String[]args)throws Exception{//属性文件Properties props=new Properties();//设置邮件的发送主机名、发送协议和是否验证props.setProperty("mail.host","");props.setProperty("mail.transport.protocol","smtp");props.setProperty("mail.smtp.auth","true");//获取发送接收邮件环境的对象Session session=Session.getInstance(props);Message message=createMessage(session);//创建发送邮件的对象Transport tsp=session.getTransport();tsp.connect("csdn","csdn");tsp.sendMessage(message,message.getAllRecipients());tsp.close();}public static Message createMessage(Session session)throws Exception{ MimeMessage message=new MimeMessage(session);message.setFrom(new InternetAddress("csdn@"));message.setRecipient(Message.RecipientType.TO,newInternetAddress("csdn@"));message.setSubject("图片");MimeBodyPart text=new MimeBodyPart();text.setContent("好看吗?<br/><imgsrc='cid:xx.jpg'>","text/html;charset=utf-8");MimeBodyPart image=new MimeBodyPart();image.setDataHandler(new DataHandler(newFileDataSource("src\\f.jpg")));image.setContentID("xx.jpg");MimeBodyPart attch=new MimeBodyPart();DataHandler dh=new DataHandler(new FileDataSource("src\\默默无语.mp3"));attch.setDataHandler(dh);String name=dh.getName();attch.setFileName(MimeUtility.encodeText(name));MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");MimeBodyPart part=new MimeBodyPart();part.setContent(mm);MimeMultipart m=new MimeMultipart();m.addBodyPart(part);m.addBodyPart(attch);m.setSubType("mixed");message.setContent(m);message.saveChanges();return message;}}注:邮箱地址必须是真实的。
chapter14-通过JavaMail API收发邮件
邮件服务器按照提供的服务类型,可以分为发送 邮件服务器(简称发送服务器)和接收邮件服务 器(简称接收服务器)。
发送邮件服务器使用邮件发送协议,现在常用的是 SMTP,所以通常发送邮件服务器也称为SMTP服务器; 接收邮件服务器使用接收邮件协议,常用的有POP3协 议和IMAP协议,所以通常接收邮件服务器也称为 POP3服务器或IMAP服务器。
14.5 身份验证
在实际应用中,往往希望在连接邮件服务器时,弹出一个对话框, 提示用户输入用户名和口令。 为了达到这一效果,需要按照以下步骤创建和使用 javax.mail.Authenticator类:
(1)创建一个javax.mail.Authenticator类的子类(假定名为 MailAuthenticator),实现getPasswordAuthentication()方法。 (2)创建MailAuthenticator对象,并且把它作为参数传给Session的 getDefaultInstance()方法: Authenticator ma=new MailAuthenticator(); Session session = Session.getDefaultInstance(props,ma); (3)连接到接收邮件服务器时,把用户名和口令设为null: store.connect(receiveHost,null, null);
步骤(3)调用Session的getStore(String protocol)方法 来获得Store对象,参数protocol指定接收邮件协议: Store store = mailsession.getStore("imap");
JavaMail API 核心类(一)
Address 可以通过刚好路过的电子邮件地址来创建:
Address address = new InternetAddress("manisha@");
创建地址的另一种方式是通过将名称与电子邮件地址:
Address address = new InternetAddress("manisha@", Manisha);
MimeMessage类的常用的方法有
public void setFrom(Address address)
public void addRecipients(Message.RecipientType type, String addresses)
public void setSubject(String subject)
MimeMessage message=new MimeMessage(session);
一旦消息对象被创建,我们需要存储的信息在里面。消息类实现了javax.mail.Part接口,当使用javax.mail.internet。的MimeMessage实现javax.mail.internet.MimePart。您可以使用message.setContent()或mimeMessage.setText()来存储内容。
public void setText(String textmessage)
地址类
现在,我们有一个会话和消息(存储在它里面的内容)的对象,我们需要使用地址对象,以解决这封邮件。
Address 是一个抽象类。因此,它的子类javax.mail.internet.InternetAddress类大多被使用。
创建Session对象的另一种方法是基于编程方法,可以在其中使用的java.util.Properties对象来覆盖一些默认信息,如邮件服务器名,用户名,密码,那可以是其他信息整个应用程序共享。
JavaMail邮件发送机制详解
JavaMail邮件发送机制详解这篇⽂章主要介绍了JavaMail邮件发送机制详解,⽂中通过⽰例代码介绍的⾮常详细,对⼤家的学习或者⼯作具有⼀定的参考学习价值,需要的朋友可以参考下概念JavaMail,顾名思义,提供给开发者处理电⼦邮件相关的编程接⼝。
它是Sun发布的⽤来处理email的API。
它可以⽅便地执⾏⼀些常⽤的邮件传输。
我们可以基于JavaMail开发出类似于Microsoft Outlook的应⽤程序。
应⽤场景⼀般在系统的注册模块,当⽤户填⼊注册信息的邮箱时,点击保存。
系统根据⽤户的信息会⾃动给⽤户发送⼀封邮件,上⾯有⽤户的基本信息和注意事项,也可以⽤此⽅法实现⽤户的激活。
代码实现普通⽅式⼀1.⾸先引⼊javaMail的mail坐标即jar包jar包:mail:1.4.1坐标:<dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.4</version></dependency>2.测试代码实现⾸先引⼊junit 测试包package mail.test;import java.util.Properties;import javax.mail.Address;import javax.mail.Session;import javax.mail.Transport;import javax.mail.internet.InternetAddress;import javax.mail.internet.MimeMessage;import javax.mail.internet.MimeMessage.RecipientType;import org.junit.Test;public class Mail01Test {@Testpublic void testJavaMail() throws Exception{//1.设置邮件的⼀些信息Properties props = new Properties();//发送邮件的服务器地址props.put("mail.smtp.host", "");// props.put("mail.smtp.auth", "true");//2.创建Session对象Session session =Session.getInstance(props);//3.创建出MimeMessage,邮件的消息对象MimeMessage message = new MimeMessage(session);//4.设置发件⼈Address fromAddr = new InternetAddress("发件⼈邮箱");message.setFrom(fromAddr);//5.设置收件⼈Address toAddr = new InternetAddress("收件⼈邮箱");message.setRecipient(RecipientType.TO, toAddr);//6.设置邮件的主题message.setSubject("项⽬进展顺序");//7.设置邮件的正⽂message.setText("项⽬进展顺序,所有兄弟们都⾮常努⼒,⽼板今天可以请吃饭");message.saveChanges();//保存更新//8.得到⽕箭Transport transport = session.getTransport("smtp");transport.connect("", "发件⼈邮箱", "发件⼈密码");//设置了⽕箭的发射地址transport.sendMessage(message, message.getAllRecipients());//发送具体内容及接收⼈transport.close();}}普通⽅式⼆⽅式⼆可以带附件和图⽚1.测试代码:package mail.test;import java.io.File;import javax.mail.internet.MimeMessage;import org.junit.Test;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframework.core.io.FileSystemResource;import org.springframework.mail.javamail.JavaMailSender;import org.springframework.mail.javamail.MimeMessageHelper;public class Mail03Test {@Testpublic void testJavaMail() throws Exception{ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-mail.xml");//得到发送器JavaMailSender mailSender = (JavaMailSender) ac.getBean("mailSender");//得到⼀个MimeMessage对象MimeMessage message = mailSender.createMimeMessage();//产⽣出⼀个MimeMessageHelper helperMimeMessageHelper helper = new MimeMessageHelper(message, true);//⼯具类本质是操作message消息 true代表可以带附件,图⽚//3.使⽤helper⼯具类,设置邮件的发送者,接收者,主题,正⽂helper.setFrom("发送邮箱");helper.setTo("接收邮箱");helper.setSubject("发送图⽚和附件");helper.setText("<html><head></head><body><h1>hello!!spring image html mail</h1><a href=>baidu</a><img src='cid:image' /></body></html>", true); //指定cid的取值FileSystemResource imgResource = new FileSystemResource(new File("E:/01分配权限原理分析.png"));helper.addInline("image", imgResource);//带附件FileSystemResource fileResource = new FileSystemResource(new File("E:/javamail1_4_4.zip"));helper.addAttachment("javamail1_4_4.zip", fileResource);//发送mailSender.send(message);}}2.applicationContext-mail.xml⽂件:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans.xsd/schema/aop/schema/aop/spring-aop.xsd/schema/tx/schema/tx/spring-tx.xsd/schema/context/schema/context/spring-context.xsd"><description>JavaMail的配置⽂件</description><!-- 加载mail.properties配置⽂件 --><context:property-placeholder location="classpath:mail.properties"/><!-- 简单消息对象创建 --><bean id="mailMessage" class="org.springframework.mail.SimpleMailMessage"><property name="from" value="${mail.from}"></property></bean><!-- 2.创建发送器 --><bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"><property name="host" value="${mail.host}"></property><property name="username" value="${ername}"></property><property name="password" value="${mail.password}"></property><property name="defaultEncoding" value="UTF-8"></property><property name="javaMailProperties"><props><prop key="mail.smtp.auth">true</prop><prop key="mail.debug">true</prop><prop key="mail.smtp.timeout">0</prop></props></property></bean></beans>3.mail.properties⽂件:mail.host=ername=@前⾯的⽤户名mail.password=密码mail.from=发件⼈邮箱全拼以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java中javamail收发邮件实现方法
java中javamail收发邮件实现⽅法概述1、邮件相关的标准⼚商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:SMTP(Simple Mail Transfer Protocol) :即简单邮件传输协议,它是⼀组⽤于由源地址到⽬的地址传送邮件的规则,由它来控制信件的中转⽅式。
POP3(Post Office Protocol – Version 3) :即邮局协议版本 3 ,⽤于接收电⼦邮件的标准协议。
IMAP(Internet Mail Access Protocol) :即 Internet 邮件访问协议。
是 POP3 的替代协议。
这三种协议都有对应 SSL 加密传输的协议,分别是 SMTPS , POP3S 和 IMAPS 。
MIME(Multipurpose Internet Mail Extensions) :即多⽤途因特⽹邮件扩展标准。
它不是邮件传输协议。
但对传输内容的消息、附件及其它的内容定义了格式。
2、JavaMail 简介JavaMail 是由 Sun 发布的⽤来处理 email 的 API 。
它并没有包含在 Java SE 中,⽽是作为 Java EE 的⼀部分。
mail.jar :此 JAR ⽂件包含 JavaMail API 和 Sun 提供的 SMTP 、 IMAP 和 POP3 服务提供程序;activation.jar :此 JAR ⽂件包含 JAF API 和 Sun 的实现。
JavaMail 包中⽤于处理电⼦邮件的核⼼类是: Properties 、 Session 、 Message 、 Address 、 Authenticator 、 Transport 、 Store 等。
3、邮件传输过程如上图,电⼦邮件的处理步骤如下:创建⼀个 Session 对象。
Session 对象创建⼀个 Transport 对象 /Store 对象,⽤来发送 / 保存邮件。
JAVA邮件服务API详解
JavaMail(JAVA邮件服务) API详解一、JavaMail API简介JavaMail API是读取、撰写、发送电子信息的可选包。
我们可用它来建立如Eudora、Foxmail、MS Outlook Express一般的邮件用户代理程序(Mail User Agent,简称MUA)。
而不是像sendmail或者其它的邮件传输代理(Mail Transfer Agent,简称MTA)程序那样可以传送、递送、转发邮件。
从另外一个角度来看,我们这些电子邮件用户日常用MUA程序来读写邮件,而MUA依赖着MTA处理邮件的递送。
在清楚了到MUA与MTA之间的关系后,让我们看看JavaMail API是如何提供信息访问功能的吧!JavaMail API被设计用于以不依赖协议的方式去发送和接收电子信息,这个API被分为两大部分:基本功能:如何以不依赖于协议的方式发送接收电子信息,这也是本文所要描述的,不过在下文中,大家将看到这只是一厢情愿而已。
第二个部分则是依赖特定协议的,比如SMTP、POP、IMAP、NNTP协议。
在这部分的JavaMail API是为了和服务器通讯,并不在本文的内容中。
二、相关协议一览在我们步入JavaMail API之前,先看一下API所涉及的协议。
以下便是大家日常所知、所乐于使用的4大信息传输协议:SMTPPOPIMAPMIME当然,上面的4个协议,并不是全部,还有NNTP和其它一些协议可用于传输信息,但是由于不常用到,所以本文便不提及了。
理解这4个基本的协议有助于我们更好的使用JavaMail API。
然而JavaMail API是被设计为与协议无关的,目前我们并不能克服这些协议的束缚。
确切的说,如果我们使用的功能并不被我们选择的协议支持,那么JavaMail API并不可能如魔术师一样神奇的赋予我们这种能力。
1.SMTP简单邮件传输协议定义了递送邮件的机制。
在下文中,我们将使用基于Java-Mail的程序与公司或者ISP的SMTP服务器进行通讯。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
javamail:JavaMail API简介疯狂代码 / ĵ:http://Java/Article7029.html转载自:JavaMailAPI是种可选、能用于读取、编写和发送电子消息包(标准扩展)您可使用这种包创建邮件用户代理(MailUserAgentMUA)类型它类似于Eudora、Pine及MicrosoftOutlook这些邮件其主要目不是像发送邮件或其他邮件传输代理(MailTransferAgentMTA)类型那样用于传输、发送和转发消息换句话说用户可以和MUA类型交互以阅读和撰写电子邮件MUA依靠MTA处理实际发送任务JavaMailAPI设计是为收发信息提供和协议无关访问方式是把该API划分成两个部分:?该API第个部分是本课程重点基本上是如何发送和接收独立于提供/协议消息?第 2个部分则使用特定协议语言如:SMTP、POP、IMAP和NNTP如果要让JavaMailAPI和服务器通信就需要为的提供协议由于Sun公司对特定协议提供有充分介绍用户可以免费获取所以本课程没有介绍创建特定协议提供内容复习相关协议在学习JavaMailAPI深层知识的前让我们回过头来看看在该API中使用协议,本质上有4种人们常用协议:?SMTP?POP?IMAP?MIME您还需要了解NNTP及其他些协议理解这些协议基本原理有助于您理解如何使用JavaMailAPI而该API设计要和协议无关所以不能克服这些基础协议限制如果选用协议不支持某种功能那么JavaMailAPI也无法在其上添加这种功能(正如您会儿就会看到在操作POP协议时常常会碰到这种问题)SMTP简单邮件传输协议(SMTP)是用于传送电子邮件机制在JavaMailAPI环境中您基于JavaMail将和您公司或Internet服务提供商(ISP)SMTP服务器通信该SMTP服务器将会把消息转发给用作接收消息SMTP服务器最后用户可通过POP或IMAP协议获取该消息由于支持身份验证所以不需要SMTP服务器是种开放转发器但需要确保SMTP服务器配置正确JavaMailAPI中没有集成用于处理诸如配置服务器以转发消息或添加/删除电子邮件帐户这类任务功能POPPOP含义是邮局协议当前版本为3也称作POP3该协议是在RFC1939中定义POP是Internet上大多数人用来接收邮件机制它为每个用户每个邮箱定义支持这是它所做全部工作也是大多数问题根源在使用POP协议时人们熟悉很多功能如查看收到了多少新邮件消息功能POP根本不支持这些功能都内置到诸如Eudora或MicrosoftOutlook的类邮件中能为您记住接收上封邮件以及计算有多少新邮件这类信息因此使用JavaMailAPI时如果想获取这类信息将需要由自己进行计算IMAPIMAP是用于接收消息更加高级协议它是在RFC2060中定义IMAP含义是“Internet消息访问协议”当前版本是第4版也称作IMAP4使用IMAP时您邮件服务器必须支持该协议您不能只是简单地把转变为支持IMAP而不是支持POP就指望能支持IMAP中切假定您邮件服务器支持IMAP那么基于JavaMail就可利用在服务器上拥有多个文件夹用户并且这些文件夹可以被多个用户共享功能由于IMAP协议具有更高级功能您也许会想IMAP应该被每个人使用但事实不是这样IMAP会加重邮件服务器负荷它需要服务器接收新消息发送消息给请求用户并在多个文件夹中为每个用户维护这些消息而这要集中备份因而长期下去用户文件夹会变得越来越大当磁盘空间用光了时每个人都会遭受损失而使用POP协议时已保存消息可以解除服务器重负MIMEMIME含义是“多用途网际邮件扩充协议”它不是种邮件传输协议相反它定义传输内容:消息格式、附件等许多文档都定义了MIME协议包含:RFC822、RFC2045、RFC2046和RFC2047作为JavaMailAPI用户般不需要担心这些格式但是这些格式确实存在并为您所用NNP和其他协议由于JavaMailAPI分开了提供和其他部分所以您可以轻松地为附加协议添加支持Sun公司提供第3方提供清单这些提供要利用Sun公司不支持少见协议在这份清单中您将会看到对NNTP(网络新闻传输协议)[新闻组]、S/MIME(安全多用途网际邮件扩充协议)及其他协议提供支持第3方提供安装目前有两种版本JavaMailAPI最常用:1.2和1.1.3本课程中所有例子都适用于这两种版本其中JavaMailAPI1.2是最新而JavaMailAPI1.1.3中包含了Java2企业版(J2EE)平台1.2.1版所以它仍然很常用使用JavaMailAPI版本会对您下载和安装产生些影响这两种版本JavaMailAPI都能和JDK1.1.6、Java2标准版(J2SE)平台1.2.x和1.3.x协同工作 注意:在安装了Sun公司JavaMail工具后会在演示目录下看到许多举例安装JavaMail1.2要使用JavaMail1.2API可以下载JavaMail1.2工具然后解压缩javamail-1_2.zip文件并把mail.jar文件添加到典型安装路径下JavaMail1.2工具带有SMTP、IMAP4和POP3提供以及核心类安装完JavaMail1.2后再安装JavaBeansActivationFramework安装JavaMail1.1.3要使用JavaMail1.1.3API可以下载JavaMail1.1.3工具然后解压缩javamail1_1_3.zip文件并把mail.jar文件添加到典型安装路径下JavaMail1.1.3工具带有SMTP和IMAP4提供以及核心类如果您想用JavaMail1.1.3访问POP服务器需要下载并安装POP3提供Sun公司拥有个独立于JavaMail工具提供在下载并解压缩pop31_1_1.zip文件后也还需要把pop3.jar添加到典型安装路径下安装完JavaMail1.1.3后再安装JavaBeansActivationFramework安装JavaBeansActivationFrameworkJavaMailAPI所有版本都需要JavaBeansActivationFramework(JavaBeans激活框架)这种框架提供了对输入任意数据块支持并能相应地对其进行处理看上去效果好像不太好但该框架是在当今许多浏览器和邮件工具中可以找到基本MIME类型支持下载该框架后解压缩jaf1_0_1.zip文件并将activation.jar文件添加到典型安装路径下对于JavaMail1.2用户现在应该把mail.jar和activation.jar文件添加到典型安装路径下对于JavaMail1.1.3用户现在应该把mail.jar、pop3.jar和activation.jar添加到典型安装路径下如果您不打算使用POP3就不需要把pop3.jar文件添加到典型安装路径下如果您不想更改安装路径环境变量可以把JAR文件复制到Java运行时环境(JRE)目录下lib/ext目录下例如对于J2SE1.3版本Windows平台上默认目录应该是C:\\jdk1.3\\jre\\lib\\ext使用Java2企业版如果您使用是J2EE则在使用基本JavaMailAPI时不需要做什么特殊工作;JavaMailAPI带有J2EE类只要确保j2ee.jar文件位于典型安装路径下并完成了所有设置工作对于J2EE1.2.1POP3提供是单独提供因此需要下载该提供并按安装JavaMail1.1.3步骤在J2EE1.2.1中包含POP3提供J2EE1.3用户会获得J2EE和POP3提供因而不需要对POP3提供执行独立安装使用这两种版本J2EE用户都不需要安装JavaBeansActivationFramework练习设置您JavaMail环境复习核心类在开始深入研究JavaMail类的前首先让用户浏览下构成API核心类:会话、消息、地址、验证、传输存储和文件夹所有这些类都可以在JavaMailAPI即javax.mail顶层包中找到尽管您将频繁地发现您自己使用子类是在javax.mail.ernet包中找到Session类Session类定义了个基本邮件会话通过该会话可让别工作顺利执行Session对象利用java.util.Properties对象获取诸如邮件服务器、用户名、密码等信息以及其他可在整个应用中共享信息Session类构造器是私有您可以获得个可被getDefaultInstance思路方法共享单默认会话:Propertiesprops=Properties;//fillpropswithanyinformationSessionsession=Session.getDefaultInstance(props,null);或者您可以用getInstance思路方法创建个独特会话:Propertiesprops=Properties;//fillpropswithanyinformationSessionsession=Session.getInstance(props,null);这两种情形下null参数都是种Authenticator对象它不是在此时使用详细信息请参阅其后“Autherticator”节 在大多数情况下使用共享会话就足够了即使为多个用户邮箱处理邮件会话也是如此您可以在通信过程后面步添加上用户名和密码组合并保持所有切是独立Message类旦创建了自己Session对象就是该去创建要发送消息时候了这时就要用到消息类型作为个抽象类您必须操作个子类在大多数情况下该子类是javax.mail.ernet.MimeMessage个MimeMessage是种理解MIME类型和报头(在区别RFC文档中均有定义)消息消息报头被严格限制成只能使用US-ASCII尽管非ASCII可以被编码到某些报头字段中可以通过将Session对象传递给MimeMessage构造器思路方法来创建消息:MimeMessagemessage=MimeMessage(session);注意:还有其他构造器像用于创建消息源于RFC822格式化输入流构造器旦创建了消息就可以设置其各个部分如Message(消息)实现Part(部分)接口(以MimeMessage实现MimePart)设置内容基本机制是Content思路方法它带有表示内容和MIME类型参数:message.Content(\"Hello\",\"text/plain\");但是如果正在使用MimeMessage并且您消息是纯文本那么您就可以使用Text思路方法该思路方法只需要个表示实际内容参数默认MIME类型为纯文本:message.Text(\"Hello\");对于纯文本消息Text思路方法更常常被用来设置内容要发送其他类型消息如HTML消息就要使用Content思路方法现在用更多是HTML消息要设置主题可以使用Subject思路方法:message.Subject(\"First\");Address类旦创建了会话和消息并为消息填充了内容就需要用Address类为您信件标上地址了同Message类样Address类也是种抽象类您可以使用javax.mail.ernet.InternetAddress类要创建只带有电子邮件地址地址可以把电子邮件地址传递给Address类构造器:Addressaddress=InternetAddress(\"president@\");如果想让个名字出现在电子邮件地址后也可以将其传递给构造器:Addressaddress=InternetAddress(\"president@\",\"GeorgeBush\");您要为消息from(发送者)字段和to(接收者)字段创建地址对象除非您邮件服务器阻止这样做否则要在发送消息中注明该消息发送者旦创建好了地址有两种思路方法可让您将地址和消息连接起来为了鉴别发送者您可以使用From和ReplyTo思路方法message.From(address)如果您消息需要显示多个地址来源则可以使用addFrom思路方法:Addressaddress=...;message.addFrom(address);为了鉴别消息接收者您可以使用addRecipient思路方法该思路方法除了需要个地址参数外还需要个Message.RecipientType属性(消息接收类型)message.addRecipient(type,address)地址3种预定义类型如下:?Message.RecipientType.TO??Message.RecipientType.BCC因此如果条消息将发送给副总统同时还将发送该消息副本给第夫人则采用下面代码:AddresstoAddress=InternetAddress(\"vice.president@\");AddressccAddress=InternetAddress(\"dy@\");message.addRecipient(Message.RecipientType.TO,toAddress);message.addRecipient(,ccAddress);JavaMailAPI没有提供检查电子邮件地址有效性机制您可以自己编写支持扫描有效(在RFC822文档中所定义)或检验MX(邮件交换)记录这些都超越了JavaMailAPI范围Authenticator类和类样JavaMailAPI可以利用Authenticator(验证)类通过用户名和密码来访问受保护资源对于JavaMailAPI来说这种受保护资源是指邮件服务器JavaMailAuthenticator类可以在javax.mail包中找到并有别于同名类当JavaMailAPI在Java1.1下工作时JavaMail和不会共享同个Authenticator类名称这是Java1.1中不含有要使用Authenticator类您可以使用该抽象类子类并通过getPasswordAuthentication思路方法返回个PasswordAuthentication例子在创建时您必须用会话记录Authentication类其后当需要进行身份验证时会通知您Authenticator会弹出个窗口或从个配置文件(尽管不加密就不安全)中读取用户名和密码并把它们作为个PasswordAuthentication对象返回给Propertiesprops=Properties;//fillpropswithanyinformationAuthenticatorauth=MyAuthenticator;Sessionsession=Session.getDefaultInstance(props,auth);Transport类发送消息最后步操作是使用Transport类该类使用特定于协议(通常是SMTP)语言来发送消息它是个抽象类其操作和Session类有些相似您可以通过只静态send思路方法来使用该类默认版本:Transport.send(message);或者您可以从用于您协议会话中获取个特定例子然后传递用户名和密码(不必要时可以为空)并发送消息最后关闭连接:message.saveChanges;//implicitwithsendTransporttransport=session.getTransport(\"smtp\");transport.connect(host,username,password);transport.sendMessage(message,message.getAllRecipients);transport.close;当您需要发送多个消息时建议采用后种思路方法它将保持消息间活动服务器连接而基本send机制会为每个思路方法都建立条独立连接注意:要查看经过邮件服务器邮件命令可以用session.Debug(true)思路方法设置调试标志Store和Folder类使用Session类来获取消息开始时和发送消息很相似但是在获取会话后很有可能使用用户名和密码或Authenticator类来连接Store类和Transport类样您要告诉Store类将使用什么协议://Storestore=session.getStore(\"imap\");Storestore=session.getStore(\"pop3\");store.connect(host,username,password);在连接Store类后就可以获取个Folder类在读取其中消息前必须先打开该类Folderfolder=store.getFolder(\"INBOX\");folder.open(Folder.READ_ONLY);Messagemessage=folder.getMessages;对于POP3协议惟可用文件夹是INBOX如果使用是IMAP协议则可以使用其他文件夹注意:Sun公司提供本来想提供方便而Messagemessage=folder.getMessages;这条语句却是种从服务器逐条读取消息缓慢操作所以仅当您确实需要获取消息部分(该内容是所检索消息内容)时可以使用这条语句旦读取消息就可以使用getContent思路方法获取其内容或使用writeTo思路方法将其内容写到个流中getContent思路方法只获取消息内容而writeTo思路方法则还会输出报头.out.prln(((MimeMessage)message).getContent);旦您阅读完邮件就可以关闭对文件夹和存储连接folder.close(aBoolean);store.close;传递给文件夹close思路方法布尔变量指定了是否通过清除已删除消息来更新文件夹继续前进实际上理解使用这7个类方式是使用JavaMailAPI处理几乎所有事情所需要全部内容用这7个类以外方式构建JavaMailAPI其大多数功能都是以几乎完全相同或特定方式来执行任务就好像内容是附件特定任务如:搜索、隔离等将在后面进行介绍使用JavaMailAPI您已经看到了如何操作JavaMailAPI核心部分在下面几节中您将学习如何连接几个部分以执行特定任务发送消息发送电子邮件消息涉及到获取会话、创建和填充消息并发送消息这些操作您可以在获取Session时通过为要传递Properties对象设置mail.smtp.host属性来指定您SMTP服务器Stringhost=...;Stringfrom=...;Stringto=...;//GetsystempropertiesPropertiesprops=.getProperties;//Setupmailserverprops.put(\"mail.smtp.host\",host);//GetsessionSessionsession=Session.getDefaultInstance(props,null);//DefinemessageMimeMessagemessage=MimeMessage(session);message.From(InternetAddress(from));message.addRecipient(Message.RecipientType.TO,InternetAddress(to));message.Subject(\"HelloJavaMail\");message.Text(\"WelcometoJavaMail\");//SendmessageTransport.send(message);您应该在try-catch块中编写代码以在创建消息并发送它时可以抛出个异常练习发送您第个消息获取消息对于阅读邮件来说首先您要获取个会话然后获取并连接到个相应用于您收件箱存储上接着打开相应文件夹再获取消息同时不要忘记了操作完成后关闭连接Stringhost=...;Stringusername=...;Stringpassword=...;//CreateemptypropertiesPropertiesprops=Properties;//GetsessionSessionsession=Session.getDefaultInstance(props,null);//GetthestoreStorestore=session.getStore(\"pop3\");store.connect(host,username,password);//GetfolderFolderfolder=store.getFolder(\"INBOX\");folder.open(Folder.READ_ONLY);//GetdirectoryMessagemessage=folder.getMessages;for(i=0,n=message.length;i<n;i){.out.prln(i+\":\"+message[i].getFrom[0]+\"\\t\"+message[i].getSubject);}//Closeconnectionfolder.close(false);store.close;每条消息执行何种操作取决于自己决定上面代码块只是显示了消息发送者和主题从技术上讲发送者地址列表可以为空此时getFrom[0]会抛出个异常为了显示整条消息您可以提示用户在看完消息发送者和主题字段后如果想看到消息内容可以再消息writeTo思路方法BufferedReaderreader=BufferedReader(InputStreamReader(.in));//GetdirectoryMessagemessage=folder.getMessages;for(i=0,n=message.length;i<n;i){.out.prln(i+\":\"+message[i].getFrom[0]+\"\\t\"+message[i].getSubject);.out.prln(\"Doyouwanttoreadmessage?\"+\"[YEStoread/QUITtoend]\");Stringline=reader.readLine;(\"YES\".equals(line)){message[i].writeTo(.out);}(\"QUIT\".equals(line)){;}}练习检查邮件删除消息和标志删除消息涉及到操作和消息关联标志对区别状态有区别标志有些标志是系统定义有些则是由用户定义预定义标志都是在内部类Flags.Flag中定义如下所示:?Flags.Flag.ANSWERED?Flags.Flag.DELETED?Flags.Flag.DRAFT?Flags.Flag.FLAGGED?Flags.Flag.RECENT?Flags.Flag.SEEN?ER仅仅标志存在并不表示标志为所有邮件服务器/提供所支持例如除了删除消息外POP协议对它们都不支持检查新邮件不是POP任务但它已内置到邮件客户中要搞清楚什么标志受到支持可以使用getPermanentFlags思路方法来询问文件夹要删除消息需要为消息设置DELETE标志:message.Flag(Flags.Flag.DELETED,true);第次以READ_WRITE(读-写)模式打开文件夹:folder.open(Folder.READ_WRITE);然后处理完了所有消息请关闭文件夹并传递true值以擦去删除消息folder.close(true);用户可使用Folder类expunge思路方法来删除消息但是该思路方法对Sun公司POP3提供不起作用其他提供或许能也或许不能实现其功能它更有可能适用于IMAP提供由于POP只支持对收件箱简单访问使用Sun公司提供时您将不得不关闭文件夹以删除消息要移去标志只需传递个false值给Flag思路方法要看看是否设置了某个标志可以使用isSet进行检查自我验证先前学到是使用Authenticator类以在需要时提示输入用户名和密码而不是以串形式传入它们这里您将真正看到如何更加充分地使用验证不需使用主机、用户名和密码连接到Store您可以配置Properties带有主机并告诉Session有关您自定义Authenticator例子如下所示://SetuppropertiesPropertiesprops=.getProperties;props.put(\"mail.pop3.host\",host);//Setupauthentication,getsessionAuthenticatorauth=PopupAuthenticator;Sessionsession=Session.getDefaultInstance(props,auth);//GetthestoreStorestore=session.getStore(\"pop3\");store.connect;然后您可以使用Authenticator类子类并通过getPasswordAuthentication思路方法返回个PasswordAuthentication对象下面是这种实现个例子其中个字段同时适用于两部分内容它不是个ProjectSwing指南只是在个字段中输入了两部分内容它们是用逗号隔开importjavax.mail.*;importjavax.swing.*;importjava.util.*;publicPopupAuthenticatorextendsAuthenticator{publicPasswordAuthenticationgetPasswordAuthentication{Stringusername,password;Stringresult=JOptionPane.showInputDialog(\"Enter\'username,password\'\");StringTokenizerst=StringTokenizer(result,\",\");username=st.nextToken;password=st.nextToken;PasswordAuthentication(username,password);}}由于PopupAuthenticator依赖于Swing因而将会启动用于AWT事件处理线程这在本质上要求您在代码中添加个对.exit以终止执行回复消息Message类包含个reply思路方法以用正确接收者和主题(添加“Re::”如果没有话)配置条新消息该思路方法不会为消息添加任何内容只是为新接收者复制发送者或回复到报头该思路方法使用个布尔型参数提示是否只回复给发送者(false)或回复给所有人(true)MimeMessagereply=(MimeMessage)message.reply(false);reply.From(InternetAddress(\"president@\"));reply.Text(\"Thanks\");Transport.send(reply);在发送消息时要配置回复到地址可使用ReplyTo思路方法练习回复邮件转发消息转发消息涉及内容要稍微多点没有个专门用于转发消息思路方法您可以通过处理组成消息各个部分来创建要转发消息条邮件消息可由多个部分组成每部分是个BodyPart(报文部分)或更特殊点在操作MIME消息时则是MimeBodyPart区别报文部分组合到个称为Multipart容器中或者又更特殊点是个MimeMultipart容器要转发消息您要创建个用于消息文本部分和用于要转发消息第 2个部分并将这两个部分组合成个multipart(多个部分)然后您可以把这个multipart添加到个合适注明地址消息中并发送它这就是转发消息本质要把条消息内容复制给另条消息只需通过它DataHandler类复制即可它是出自于JavaBeansActivationFramework个类//CreatethemessagetoforwardMessageforward=MimeMessage(session);//Fillinheaderforward.Subject(\"Fwd:\"+message.getSubject);forward.From(InternetAddress(from));forward.addRecipient(Message.RecipientType.TO,InternetAddress(to));//CreateyourmessagepartBodyPartmessageBodyPart=MimeBodyPart;messageBodyPart.Text(\"Hereyougowiththeoriginalmessage:\\n\\n\");//Createamulti-parttocombinethepartsMultipartmultipart=MimeMultipart;multipart.addBodyPart(messageBodyPart);//CreateandfillpartfortheforwardedcontentmessageBodyPart=MimeBodyPart;messageBodyPart.DataHandler(message.getDataHandler);//Addparttomultipartmultipart.addBodyPart(messageBodyPart);//Associatemulti-partwithmessageforward.Content(multipart);//SendmessageTransport.send(forward);操作附件附件是和邮件消息关联资源通常保存在消息的外如:个文本文件电子表格或图片对于像Eudora和Pine的类常用邮件您可以通过JavaMailAPI把资源附加到邮件消息上并在您接收消息时获取附件发送附件发送附件和转发消息非常相似您要创建组成完整消息各个部分在创建好第个部分即消息文本的后您添加用DataHandler类处理其他部分就是您附件而不是转发消息中共享处理当您从个文件读取附件时附件数据资源是FileDataSource;从URL读取时则是URLDataSource旦您有了自己DataSource在将其通过DataHandler思路方法最终附加到BodyPart上的前只需将其传递给DataHandler类构造器即可假定您想保留附件原始文件名要做最后件事就是用BodyPart类FileName思路方法设置和附件关联文件名所有这些操作如下所示://DefinemessageMessagemessage=MimeMessage(session);message.From(InternetAddress(from));message.addRecipient(Message.RecipientType.TO,InternetAddress(to));message.Subject(\"HelloJavaMailAttachment\");//CreatethemessagepartBodyPartmessageBodyPart=MimeBodyPart;//FillthemessagemessageBodyPart.Text(\"PardonIdeas\");Multipartmultipart=MimeMultipart;multipart.addBodyPart(messageBodyPart);//ParttwoisattachmentmessageBodyPart=MimeBodyPart;DataSourcesource=FileDataSource(filename);messageBodyPart.DataHandler(DataHandler(source));messageBodyPart.FileName(filename);multipart.addBodyPart(messageBodyPart);//Putpartsinmessagemessage.Content(multipart);//SendthemessageTransport.send(message);在消息中包含附件时如果您是个servlet您用户就必须上传附件并告诉您要把消息发送到什么位置上传每个文件都可以用个表单来处理该表单是以multipart/表单数据(form-data)来编码<FORMENCTYPE=\"multipart/form-data\"method=postaction=\"/myservlet\"><INPUTTYPE=\"file\"NAME=\"thefile\"><INPUTTYPE=\"submit\"VALUE=\"Upload\"></FORM>注意:消息大小要受到您SMTP服务器限制而不是由JavaMailAPI限制如果出现了问题可以通过设置ms和mx参数来考虑增加Java堆区空间尺寸练习发送附件获取附件从消息中取出附件比发送附件涉及操作要稍微多点而MIME没有简单附件概念当消息带有附件时消息内容就是个Multipart对象然后需要处理各个部分以获取主要内容和附件通过part.getDisposition思路方法标记上Part.ATTACHMENT配置部分显然就是附件同时附件也可以不带有配置(和非文本MIME类型)或Part.INLINE配置当配置是Part.ATTACHMENT或Part.INLINE时您可以脱离该消息部分内容将其保存起来只需通过getFileName思路方法获取原始文件名并通过getInputStream思路方法获取输入流即可Multipartmp=(Multipart)message.getContent;for(i=0,n=multipart.getCount;i<n;i){Partpart=multipart.getBodyPart(i));Stringdisposition=part.getDisposition;((disposition!=null)&&((disposition.equals(Part.ATTACHMENT)||(disposition.equals(Part.INLINE))){saveFile(part.getFileName,part.getInputStream);}}saveFile思路方法只用于根据文件名创建个文件从输入流中读取字节并将它们写入个文件中去如果文件已存在将在文件名后添加个编号直到找到个不存在文件为止//fromsaveFileFilefile=File(filename);for(i=0;file.exists;i){file=File(filename+i);}上面代码介绍了消息各个部分被标上相应标志个最简单例子要想包含所有情况还要对disposition值为null及消息部分为MIME类型情况作相应处理(dispositionnull){//CheckplainMimeBodyPartmbp=(MimeBodyPart)part;(mbp.isMimeType(\"text/plain\")){//Handleplain}{//Specialnon-attachmentshereofimage/g,text/html,...}...}处理HTML消息发送基于HTML消息比发送纯文本消息要稍微复杂点尽管它不需要做大量工作它全部取决于您特定需求发送HTML消息如果您所要做全部工作是发送个等价HTML文件作为消息并让邮件阅读者忧心于取出任何嵌入图片或相关片段那么就可以使用消息Content思路方法以串形式传递消息内容并把内容类型设置为text/html StringhtmlText=\"<H1>Hello</H1>\"+\"<imgsrc=\\\"/images/logo.g\\\">\";message.Content(htmlText,\"text/html\"));在接收端如果您用JavaMailAPI获取消息在该API中没有内置任何用于以HTML格式显示消息功能JavaMailAPI只以字节流形式来查看消息要以HTML格式显示消息您必须使用SwingJeditorPane或某些第3方HTML阅读器组件(message.getContentType.equals(\"text/html\")){Stringcontent=(String)message.getContent;JFrameframe=JFrame;JEditorPanetext=JEditorPane(\"text/html\",content);text.Editable(false);JScrollPanepane=JScrollPane(text);frame.getContentPane.add(pane);frame.Size(300,300);frame.DefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);frame.show;}在消息中包含图片另方面如果您HTML消息中嵌入了作为消息部分图片并且您想保持消息内容完整就必须把图片看作附件并用特殊通信标识符URL引用该图片该通信标识符引用是图片附件内容ID报文嵌入图片处理和附加个文件到消息上非常相似惟区别的处在于:您必须区分MimeMultipart中哪些部分是在构造器(或通过SubType思路方法)通过设置其子类型而使的相关以及将图片内容ID报头设置成任意串它将在img标记中用作图片源路径下面显示了个完整举例:Stringfile=...;//CreatethemessageMessagemessage=MimeMessage(session);//Fillitsheadersmessage.Subject(\"EmbeddedImage\");message.From(InternetAddress(from));message.addRecipient(Message.RecipientType.TO,InternetAddress(to));//CreateyourmessagepartBodyPartmessageBodyPart=MimeBodyPart;StringhtmlText=\"<H1>Hello</H1>\"+\"<imgsrc=\\\"cid:memememe\\\">\";messageBodyPart.Content(htmlText,\"text/html\");//Createarelatedmulti-parttocombinethepartsMimeMultipartmultipart=MimeMultipart(\"related\");multipart.addBodyPart(messageBodyPart);//CreatepartfortheimagemessageBodyPart=MimeBodyPart;//FetchtheimageandassociatetopartDataSourcefds=FileDataSource(file);messageBodyPart.DataHandler(DataHandler(fds));messageBodyPart.Header(\"Content-ID\",\"memememe\");//Addparttomulti-partmultipart.addBodyPart(messageBodyPart);//Associatemulti-partwithmessagemessage.Content(multipart);练习发送带有图片HTML消息用SearchTerm搜索JavaMailAPI包含种可用于创建SearchTerm(搜索条件)筛选机制它可以在javax.mail.search包中找到旦创建了SearchTerm您就可以询问某个文件夹匹配消息并检索出消息对象:SearchTermst=...;Messagemsgs=folder.search(st);有22种区别类可用于帮助创建搜索条件?AND条件(AndTerm类)?OR条件(OrTerm类)?NOT条件(NotTerm类)?SENTDATE条件(SentDateTerm类)?CONTENT条件(BodyTerm类)?HEADER条件(FromTerm/FromStringTerm,RecipientTerm/RecipientStringTerm,SubjectTerm,etc.)本质上您可以为匹配消息创建个逻辑表达式然后进行搜索例如下面显示了条消息条件搜索举例该消息带有(部分带有)个ADV主题串其发送者字段为friend@您可能考虑定期运行该查询并自动删除任何返回消息 SearchTermst=OrTerm(SubjectTerm(\"ADV:\"),FromStringTerm(\"friend@\"));Messagemsgs=folder.search(st);2009-2-12 5:23:11疯狂代码 /。