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("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邮件发送的过程:
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); } }