Java --- 邮件发送详解

一、邮件协议介绍

(1)发送邮件:SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由他来控制新建的中转方式。默认端口号:25

(2)收邮件:POP3(Post Office Protocol - Version 3)即邮局协议版本3。是TCP/IP协议族中的一员。默认端口号:110

(3)收邮件:IMAP(Internet Mail Access Protocol)即Internet邮件访问协议,以前称作交互邮件访问协议(Interactive Mail Access Protocol)。IMAP是斯坦福大学在1986年开发的一种邮件获取协议。

 

二、开发环境

(1)工程中导入mail.jar包

(2)安装测试邮件服务器 --- 易邮服务器 --- eyoumailserversetup.exe

  • 工具 --- 服务器设置 --- 配置单域名
  • 账号 --- 新建账号

 

(3)安装邮件收发客户端 --- foxmail65.exe(个人,免费)  ---  OutLook.exe(企业,收费)

  • 邮箱 --- 新建邮箱账户 

 

 

三、JavaMail介绍
(1)JavaMail是Sun公司为方便Java开发人员在应用程序中实现邮件发送和接受功能的一套标准开发包,它支持一些常用的邮件协议,如SMTP、POP3、IMAP。

(2)开发人员使用JavaMail API编写邮件处理软件时,无需考虑邮件协议的底层实施细节,只要调用JavaMail开发包中相应的API类就可以了。

(3)JavaMail也提供了能够创建各种复杂MIME格式的邮件内容的相关API。



四、JavaMail的体系结构与API分类
JavaMail的API按其功能划分通常可以分为如下三大类:
(1)创建和解析邮件内容的API:Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件。

(2)发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象实现了某个邮件
发送协议的邮件发送对象,例如SMTP协议。

(3)接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个邮件
接受协议的和邮件接收对象,例如POP3协议。

(4)Session类用于定义整个应用服务所需的环境信息,以及收集客户端与邮件服务器建立网络连接
的会话信息,如邮件服务器的主机名、端口号、采用的邮件发送协议和接受协议等。Session对象根
据这些信息构建用于邮件收发的Transport和Store对象,以及为客户端创建Message对象时提供信息
支持。

 

五、实例

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Message.RecipientType;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * 发送邮件
 * @author **
 *
 */
public class MailUtils {

	public static void sendMail(String to,String code){
		//获得连接
		Properties props = new Properties();
		//创建邮件服务
		Session session = Session.getDefaultInstance(props,new Authenticator() {
			@Override
			protected PasswordAuthentication getPasswordAuthentication() {
				//发件人信息 密码
				return new PasswordAuthentication("**@**.com","**");
			}
			
		});
		
		//构建邮件
		Message message = new MimeMessage(session);
		try {
			//设置邮件来源,发件人
			message.setFrom(new InternetAddress("**@**.com"));
			
			//设置收件人
			/*
			 * RecipientType.TO:收件人
			 * RecipientType.CC:抄送
			 * RecipientType.BCC:暗送,密送
			 */
			message.addRecipient(RecipientType.TO, new InternetAddress(to));
			
			//主题
			message.setSubject("测试用户注册激活!");
			
			//正文
			message.setContent(
					"<h1>测试用户注册激活</h1>"
					+ "<h3><a href='http://**:8080/**/**?method=**&code=" + code + "'>http://**:8080/**/**?method=**&code=" + code + "</a></h3>", 
					"text/html;charset=UTF-8");
			
			//发送邮件
			Transport.send(message);
			
		} catch (AddressException e) {
			e.printStackTrace();
		} catch (MessagingException e) {
			e.printStackTrace();
		}
		
	}

}

 

 

 

六、JavaMail常用类介绍

(1) javax.util.Properties类 
  JavaMail需要Properties来创建一个session对象。它将寻找字符串"mail.smtp.host",属性值就是发送邮件的主机. 

用法: 
 Properties props = new Properties (); 
   props.put("mail.smtp.host", "smtp.163.com");//可以换上你的smtp主机名。 


(2) javax.mail.Session类 
  这个Session类代表JavaMail 中的一个邮件session. 每一个基于 JavaMail的应用程序至少有一个session但是可以有任意多的session。 在这个例子中, Session对象需要知道用来处理邮件的SMTP 服务器。 

用法: 
   Session sendMailSession; 
   sendMailSession = Session.getInstance(props, null); 


(3) javax.mail.Transport类 
  邮件是既可以被发送也可以被受到。JavaMail使用了两个不同的类来完成这两个功能:Transport 和Store. Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。 

用法: 
Transport transport; 
  transport = sendMailSession.getTransport("smtp"); 

  用JavaMail Session对象的getTransport 方法来初始化Transport。传过去的字符串申明了对象所要使用的协议,如"smtp"。这将为我们省了很多时间。因为JavaMail以境内置了很多协议的实现方法。 

 注意: JavaMail并不是绝对支持每一个协议,目前支持IMAP、 SMTP和 POP3. 


(4) javax.mail.MimeMessage类 
  Message对象将存储我们实际发送的电子邮件信息,Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个JavaMail session。 

  用法: 
Message newMessage = new MimeMessage(sendMailSession); 


(5) javax.mail.InternetAddress类 
一旦您创建了 Session 和 Message,并将内容填入消息后,就可以用Address确定信件地址了。和 Message 一样,Address 也是个抽象类。您用的是Javax.mail.internet.InternetAddress 类. 

用法: 
InternetAddress from=new InternetAddress("xxf@cafe.com"); 


(6) javax.mail.Store类 
Store类实现特定邮件协议上的读、写、监视、查找等操作。通过Javax.mail.Store类可以访问Javax.mail.Folder类。 

用法: 
Store store=s.getSorte("pop3");//s为一个邮件会话 
store.connect(popserver,username,password);//通过你提供的pop地址,用户名和密码登录你的邮箱 


(7) javax.mail.Folder类 
Folder类用于分级组织邮件,并提供照Javax.mail.Message格式访问email的能力。 

用法: 
Folder folder=store.getFolder("INBOX"); 
folder.open(Folder.READ_ONLY); 


(8) javax.mail.Internet.MimeMultpart 
一般保存电子邮件内容的容器是Multipart抽象类,它定义了增加和删除及获得电子邮件不同部分内容的方法.由于Multipart是抽象类,我们必须为它使用一个具体的子类,JavaMail API提供javax.mail.Internet.MimeMultpart类来使用MimeMessage对象. 

用法: 
MimeMultipart multipart=new MimeMultipart(); 

注:我们使用MimeMultipart对象的一个方法是addBodyPart(),它在我们的电子邮件内容里添加BodyPart(BodyPart类在下面紧接着要介绍)对象.消息可以有很多部分,一个BodyPart可以代表一个部分. 


(9) javax.mail.Internet.MimeBodyPart类 

MimeBodyPart是BodyPart具体用于mimeMessage的一个子类. 
MimeBodyPart对象代表一个MimeMessage对象内容的一部分.每个MimeBodyPart被认为有两部分: 
⊙一个MIME类型 
⊙匹配这个类型的内容 

用法: 
MimeBodyPart mdp=new MimeBodyPart(); 
String text="Hello JavaMail!"; 
mdp.setContent(text,"text/plain");//定义MIME类型为text/plain,并设置MimeBodyPart的内容. 


(10) javax.activation.DataHandler类(包含在JAF中) 
JavaMail API不限制信息只为文本,任何形式的信息都可能作茧自缚MimeMessage的一部分.除了文本信息,作为文件附件包含在电子邮件信息的一部分是很普遍的.JavaMail API通过使用DataHandler对象,提供一个允许我们包含非文本BodyPart对象的简便方法. 

用法: 
DataHandler dh=new DataHandler(text,type); 
mdp.setDatahandler(dh);//mdp是一个MimeBodyPart对象 


(11) javax.activation.FileDataSource类(包含在JAF中) 
一个FileDataSource对象可以表示本地文件和服务器可以直接访问的资源.一个本地文件可以通过创建一个新的MimeBodyPart对象附在一个mimeMessage对象上. 

用法: 
MimeMultipart mm=new MimeMultipart(); 
MimeBodyPart mdp=new MimeBodyPart(); 
FileDataSource fds=new FileDataSource("c:/exam.txt"); 
mdp.setDataHandler(new DataHandler(fds)); //设置数据源 
mm.addBodyPart(mdp); //为当前消息MimeMultipart对象增加MimeBodyPart 


(12) javax.activation.URLDataSource类(包含在JAF中) 
远程资源,URL不会指向它们,由一个URLDataSource对象表示.一个远程资源可以通过创建一个新mimeBodyPart对象附在一个mimeMessage对象上(同FileDataSource差不多). 

用法: 
与FileDataSource唯一不同的是数据源的设置: 
URLDataSource uds=new URLDataSource("http://www.cnjsp.com/logo.gif"); 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值