JavaMail功能介绍

Java邮件发送功能实现介绍

1、Java Mail介绍:

JAVA MAIL是利用现有的邮件账户发送邮件的工具,比如说,我在网易注册一个邮箱账户,通过JAVA Mail的操控,我可以不亲自登录网易邮箱,让程序自动的使用网易邮箱发送邮件。这一机制被广泛的用在注册激活和垃圾邮件的发送等方面。

2、配置JavaMail开发环境

mail.jar就是开发javamail程序所必须要用到的核心开发包。

mail.jar文件的一些核心类主要包括:Session、Message、Address、Authenticator、Transport、Store、Folder以及javax.mail.internet包中还有一些常用的子类。

A:Session类(邮件会话)

进行收发邮件的工作都是基于这个会话的。

Session对象利用java.util.Properties对象获得邮件服务器、用户名、密码信息和整个应用程序都要使用到共享信息。

Properties props = new Properties();

Session session = Session.getDefaultInstance(props, null);

或者

Properties props = new Properties();

Session session = Session.getInstance(props, null);

从上面的两个例子中不难发现,第二个参数都是null,这是因为在上面的例子中并没有使用到邮件授权(参考D)

B: Message类

建立了Session对象后,便可以构造被发送的信息体Message抽象类

使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。

信息头只能使用US-ASCII字符

Message message = new MimeMessage(session);

message.setContent("Hello", "text/plain");//非文本信息内容

message.setText("Hello");//纯文本信息内容

message.setSubject("First");//设置邮件主题

message.setSentDate(Date);//设置邮件发送日期

C:Address

建立了Session和Message对象后,使用邮件地址Address抽象类

使用javax.mail.internet.InternetAddress这个子类。通过传入邮件地址的字符串

Address address = new InternetAddress("[email protected]"); //邮件地址

Address address = new InternetAddress("[email protected]", "卓越科技"); //带名字的邮件地址

message.setFrom(address);//设置发信人

message.setReplyTo(address);//同上

message.addFrom(Address[] address);//添加多个发信人

message.addRecipient(type, address)//设置收信人

Message.RecipientType.TO//收信人

Message.RecipientType.CC//抄送人

Message.RecipientType.BCC//暗送人

D.Authenticator授权者类

使用Authenticator抽象类必须实现getPasswordAuthentication()方法(用于存储认证时要用到的用户名、密码)。

并且要在Session中进行注册,使Session能够了解在认证时该使用哪个类。

Properties props = new Properties();

Authenticator auth = new MyAuthenticator();

Session session = Session.getDefaultInstance(props, auth);

/**

 *自定义授权类

 */

public class EmailAutherticator extends Authenticator {
    private String username;
    private String password;

public EmailAutherticator() {
        super();
    }

public EmailAutherticator(String user, String pwd) {
        super();
        username = user;
        password = pwd;
    }
    public PasswordAuthentication getPasswordAuthentication(){
        return new PasswordAuthentication(username, password);
    }
    
}

E.Transport

发送信息时使用Transport抽象类(实现了SMTP)

Transport.send(MimeMessage message);

或者一般用法

当然,方法是多样的。我们也可由Session获得相应协议对应的Transport实例。并通过传递用户名、密码、邮件服务器主机名等参数建立与邮件服务器的连接,并使用sendMessage()方法将信息发送,最后关闭连接:

session.setDebug(true);//监控邮件发送过程

message.saveChanges(); //保存文件

Transport transport = session.getTransport("smtp");//获取实现了SMTP协议的Transport类

transport.connect(host, username, password);//连接服务器

transport.sendMessage(message, message.getAllRecipients());//发送邮件给所有收件人

transport.close();//关闭连接

F.Store(存储邮件的服务器)和Folder(目录对象)

Store store = session.getStore("pop3");

store.connect(host, username, password);

Folder folder = store.getFolder("INBOX");//POP3协议只有一个名为INBOX的Folder有效

folder.open(Folder.READ_ONLY);//只读方式打开

Message message[] = folder.getMessages();//获得邮件

System.out.println(((MimeMessage)message).getContent());//邮件内容(不包含邮件头)

System.out.println(((MimeMessage)message).writeTo());//邮件内容(含邮件头)

folder.close(true);//若删除邮件则及时更新Folder,关闭

store.close();//关闭

Java邮件发送的过程:

package mail;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class SendMail {

	private static SendMail instance = null;

	private SendMail() {

	}

	public static SendMail getInstance() {
		if (instance == null) {
			instance = new SendMail();
		}
		return instance;
	}

	public void send(String to[], String cs[], String ms[], String subject,
			String content, String formEmail, String fileList[]) {
		try {
			Properties p = new Properties(); // Properties p =
			// System.getProperties();
			p.put("mail.smtp.auth", "true");
			p.put("mail.transport.protocol", "smtp");
			p.put("mail.smtp.host", "smtp.qq.com");
			p.put("mail.smtp.port", "25");
			// 建立会话
			Session session = Session.getInstance(p);
			Message msg = new MimeMessage(session); // 建立信息
			BodyPart messageBodyPart = new MimeBodyPart();
			Multipart multipart = new MimeMultipart();
			msg.setFrom(new InternetAddress(formEmail)); // 发件人

			String toList = null;
			String toListcs = null;
			String toListms = null;

			// 发送,
			if (to != null) {
				toList = getMailList(to);
				InternetAddress[] iaToList = new InternetAddress()
						.parse(toList);
				msg.setRecipients(Message.RecipientType.TO, iaToList); // 收件人
			}

			// 抄送
			if (cs != null) {
				toListcs = getMailList(cs);
				InternetAddress[] iaToListcs = new InternetAddress().parse(toListcs);
				msg.setRecipients(Message.RecipientType.CC, iaToListcs); // 抄送人
			}

			// 密送
			if (ms != null) {
				toListms = getMailList(ms);
				InternetAddress[] iaToListms = new InternetAddress()
						.parse(toListms);
				msg.setRecipients(Message.RecipientType.BCC, iaToListms); // 密送人
			}
			msg.setSentDate(new Date()); // 发送日期
			msg.setSubject(subject); // 主题
			msg.setText(content); // 内容
			// 显示以html格式的文本内容
			messageBodyPart.setContent(content, "text/html;charset=gbk");
			multipart.addBodyPart(messageBodyPart);

			// 2.保存多个附件
			if (fileList != null) {
				addTach(fileList, multipart);
			}

			msg.setContent(multipart);
			// 邮件服务器进行验证
			Transport tran = session.getTransport("smtp");
			tran.connect("smtp.qq.com", "1111@2qq.con",
					"1Q2W3E4R5dTMMM");
			tran.sendMessage(msg, msg.getAllRecipients()); // 发送
			System.out.println("邮件发送成功");

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 添加多个附件
	public void addTach(String fileList[], Multipart multipart)
			throws MessagingException, UnsupportedEncodingException {
		for (int index = 0; index < fileList.length; index++) {
			MimeBodyPart mailArchieve = new MimeBodyPart();
			FileDataSource fds = new FileDataSource(fileList[index]);
			mailArchieve.setDataHandler(new DataHandler(fds));
			mailArchieve.setFileName(MimeUtility.encodeText(fds.getName(),
					"GBK", "B"));
			multipart.addBodyPart(mailArchieve);
		}
	}

	private String getMailList(String[] mailArray) {

		StringBuffer toList = new StringBuffer();
		int length = mailArray.length;
		if (mailArray != null && length < 2) {
			toList.append(mailArray[0]);
		} else {
			for (int i = 0; i < length; i++) {
				toList.append(mailArray[i]);
				if (i != (length - 1)) {
					toList.append(",");
				}

			}
		}
		return toList.toString();

	}

	public static void main(String args[]) {
		SendMail send = SendMail.getInstance();
		String to[] = { "aaaa@aaaa.cn" };
		String cs[] = {"laaaa@aaa.cn"};
		String ms[] = null;
		String subject = "测试一下";
		String content = "这是邮件内容,仅仅是测试,不需要回复";
		String formEmail = "aaaa@mftcc.cn";
		String[] arrArchievList = new String[4];
		arrArchievList[0] = "c:\\2012052914033429140297.rar";
		arrArchievList[1] = "c:\\topSearch.html";
		arrArchievList[2] = "c:\\topSearch2.html";
		arrArchievList[3] = "c:\\logo_white.png";
		// 2.保存多个附件
		send.send(to, cs, ms, subject, content, formEmail, arrArchievList);
	}

}
时间: 2024-08-24 23:54:06

JavaMail功能介绍的相关文章

Exchange2016正式版功能介绍及全新安装配置

Exchange2016功能介绍及全新安装配置 说到Exchange服务相信很多人都在关注,微软在2015年更新了很多服务,从功能上来说确实做了很多优化及提升,具体就不多说了,微软在2015年10月1日发布了Exchange2016正式版,版本还是分为标准版和企业版,此次发布为多语言版本 同样微软在2015年发布了那些新产品呢 : 我们还是说说Exchange2016,从安装及官网文档上看微软从Exchange2010到Exchange2016角色上缩减了很多,从Exchange2010的Mai

Python中生成器和迭代器的功能介绍

生成器和迭代器的功能介绍 1. 生成器(generator) 1. 赋值生成器 1. 创建 方法:x = (variable for variable in iterable) 例如:x = (i for i in range(10)) print(x) >>> <generator object <genexpr> at 0x00000000006B85C8> 返回值:generator #使用元祖推导式的时候回变成一个生成器. 2. 调用 方法:x.__nex

友盟新功能介绍:在线参数-备用

作为开发者您是否也碰到过这些挠头问题: 刚上线不久的应用就要修改说明文字?应用添加广告后,如何平衡用户流失和广告收入情况?如何对游戏中的道具进行合理定价? 为帮助开发者告别频繁地更新应用版本,更好的比较版本之间的用户行为及习惯,友盟针对Android开发者新推出在线参数功能.通过在线参数功能,开发者可以远程动态修改应用中的参数值,灵活调整运营策略.iOS版本近期推出. 获得更多信息和体验在线参数功能请访问www.umeng.com 什么是在线参数 在线参数是友盟推出的新功能,可以让您动态修改应用

Python中set的功能介绍

Set的功能介绍 1.集合的两种函数(方法) 1. 集合的内置函数 交集 格式:x.__and__(y)等同于x&y 例如:s1 = {'a',1,} s2 = {'b',1,} s3 = {'b','d'} print(s1.__and__(s2)) >>> {1} print(s1.__and__(s3)) >>> set() 返回值:set #y只能是集合,当两个集合没有交集时,返回值为空集合. 判断是否是包含关系 格式:x.__contains__(y)

EXCEL基础内容学习笔记(二)Excel文档的基本组成与功能介绍

一.基本组成 (一)工作簿.工作表与单元格 (1)工作簿:一个Excel文档即为一个工作簿. (2)工作表:工作簿中的每个表. (3)单元格:打开Excel文档,在工作表中单击,出现的加粗四边形即为单元格.单元格由行和列组成,命名时由行和列说明,称为单元格名称或地址. 一个工作簿中有若干个工作表,每个工作表有许多单元格组成. 二.功能介绍 (1)标题栏:Excel文档最上端. (2)选项卡 (3)工作区:每一个打开的选项卡都含有若干工作区. (4)名称框:所选择的单元格的名字. (5)编辑栏:可

keepalived高可用的常用功能介绍

Keepalived的作用是检测web服务器的状态,如果有一台web服务器死机,或工作出现故障,Keepalived将检测到,并将有故障的web服务器从系统中剔除,当web服务器工作正常后Keepalived自动将web服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的web服务器.本篇文章会介绍keepalived的安装,配置,还有keepalived的一些脚本,keepalived+nginx高可用实现和keepalived双机互为主从的实现. keep

vsphere(vCenter功能介绍)四

今天我们来讲vcenter的功能 让大家熟悉熟悉 这就是 一个容器罢了 大家根据公司的环境 自由搭建 这个会经常操作 做HA时会用运到以下配置 然后我们把esxi41-2 的配合改了 比如说改改网络 配置啥的 然后在附加上去 前提要进入维护模式  导入后在退出维护模式就行了 ok 今天就讲到这里 大家一定要多点 并不是我写的这些功能就是全部的  拜 vsphere(vCenter功能介绍)四,布布扣,bubuko.com

带你走近AngularJS - 基本功能介绍

AngularJS是Google推出的一款Web应用开发框架.它提供了一系列兼容性良好并且可扩展的服务,包括数据绑定.DOM操作.MVC设计模式和模块加载等.本文专注于AngularJS 指令的使用,在我们进入主题之前,我们将快速浏览AngularJS的基本用法. AngularJS 不仅仅是一个类库,而是提供了一个完整的框架.它避免了您和多个类库交互,需要熟悉多套接口的繁琐工作.它由Google Chrome的开发人员设计,引领着下一代Web应用开发.也许我们5年或10年后不会使用Angula

GPS接收器控件TGPS下载及功能介绍

TGPS是一个Delphi控件,包装了GPS接收器的相关接口.TGPS是一个GPS接收器接口,它可以用于所有发送NMEA 0183数据的GPS接收器,同时也可以连接计算机的串行通信端口. TGPS的功能特性包括: 可以获取位置.时间.速度.标题.方位.路标.线路等等(主要取决于GPS接收器提供的数据,不同的GPS接收器接收的数据也可能有一些差异) 包含两个组件:提供卫星位置的图片以及信号强度 自动识别COM端口,波特率等等 TGPS 组件在Delphi 3.0, 4.0, 6.0 和 7.0开发