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("1107935211@163.com"); //邮件地址

Address address = new InternetAddress("1107935211@163.com", "卓越科技"); //带名字的邮件地址

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邮件发送的过程:

 

java qq发邮件服务器server 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);
	}

}