javamail模拟邮箱功能发送电子邮件-中级实战篇

上一篇章简单讲解了javamail发送邮件的基本基础和用到的几个类,并且所有初始化和发送方法都封装在一个类里面(为了代码方便演示),本章节将对各个模块进行拆分和优化,并且引入附件发送的方法

创新互联公司服务项目包括钦南网站建设、钦南网站制作、钦南网页制作以及钦南网络营销策划等。多年来,我们专注于互联网行业,利用自身积累的技术优势、行业经验、深度合作伙伴关系等,向广大中小型企业、政府机构等提供互联网行业的解决方案,钦南网站推广取得了明显的社会效益与经济效益。目前,我们服务的客户以成都为中心已经辐射到钦南省份的部分城市,未来相信会继续扩大服务区域并继续获得客户的支持与信任!

要想邮件发送附件,就要引入两个新类 Multipart 和 BodyPart 两类

Multipart(报文部件容器) 实则为一个报文容器,而邮件消息 Msage 是由各个子报文 BdyPart(报文单元部件) 类组成

由此可见所有邮件消息都可由这两类来实现,接下来的演示发送HTML(兼并了普通Text格式)内容方法是所谓的简单的模式,因为他只有正文部分,无需多个部件来组合,而附件采纳了这两类,我们可以把包涵附件的邮件拆分为两个部件来理解,即:正文(邮件内容)部件、附件(邮件附加文件)两个部件。

示例结构:

本篇示例代码分了3类(其实可以说是2类,因为测试test类只有一个main方法来调用邮件发送方法)

EmailEntity 类 邮件基础父类,两个私有属性(发件地址,发件密码),继承了Authenticator自动校验类(方便自动校验) 
EmailServiceEnity 类 邮件服务支持类,继承邮件基础父类,并声明其他必要的私有属性,封装邮件发送方法
TestEmailFunction 类 邮件测试发送类,简单的main方法里面初始化一个服务支持类,并调用两个发送方法


实例代码演示:

****复制此三个类可直接跑测试****注释部分我尽可能详细讲解每个方法的作用****

EmailEntity 类

package com.cplatform.movie.back.javamail; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * 邮件基础实体类 */ public class EmailEntity extends Authenticator { /** * 用户名(登录邮箱) */ protected static String username; /** * 密码 */ protected static String password; /** * 初始化邮箱地址和密码 * @param username 邮箱 * @param password 密码 */ public EmailEntity(String username, String password) { EmailEntity.username = "这里填写发件箱地址"; EmailEntity.password = "这里填写发件箱密码"; } /** * 重写自我检验方法 */ @Override protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } String getPassword() { return password; } String getUsername() { return username; } public void setPassword(String password) { EmailEntity.password = password; } public void setUsername(String username) { EmailEntity.username = username; } }

EmailServiceEnity 类

package com.cplatform.movie.back.javamail; import java.io.File; import java.io.UnsupportedEncodingException; 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.NoSuchProviderException; 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 com.cplatform.movie.back.javamail.SimpleEmailFunction.MyAuthenricator; import com.sun.xml.internal.messaging.saaj.packaging.mime.internet.MimeUtility; /** * 邮件服务支持类 */ public class EmailServiceEnity extends EmailEntity{ // java.util.propertis 类 private transient Properties props; // 一个邮件会话 private transient Session session; // 邮件消息 private transient MimeMessage message; // 邮件内容格式 private final String CONTENT_TYPE_HTML = "text/html;charset=utf-8"; // 端口号 private final static int MAIL_PORT = 25; // 邮箱服务器列表 private String stmpHostPort; // 邮件传输对象 private Transport transport; // 邮件发送内容 private String content; /** * 实参构造 * @param mailToaddress 收件人地址,多个以逗号隔开 * @param content 邮件内容 * @throws MessagingException * @throws UnsupportedEncodingException */ public EmailServiceEnity(String mailToaddress, String content) throws UnsupportedEncodingException, MessagingException { super(username, password); this.content = content; this.session = this.initSession(); this.message = this.initMessage(this.getSession(), mailToaddress); this.transport = this.initTransport(this.getSession()); } /** * 根据发件人地址获取邮件服务器主机地址 * @param username 发件人邮件地址 * @return */ public String getStmpHostP(String username) { return "smtp." + username.split("@")[1]; } /** * 初始化perps文件 * @return */ public Properties initPrope() { // 初始化props文件 props = new Properties(); props.setProperty("mail.transport.protocol", "smtp");//发送邮件协议 props.put("mail.smtp.auth", "true"); //需要验证 props.put("mail.smtp.host", this.getStmpHostP(username)); //服务器地址 return props; } /** * 初始化session会话 * @return */ public Session initSession() { session = Session.getInstance(this.initPrope(),new MyAuthenricator(username, password)); session.setDebug(true); return session; } /** * 初始化Message消息 * @param session * @return * @throws MessagingException * @throws UnsupportedEncodingException */ public MimeMessage initMessage(Session session, String mailToaddress) throws MessagingException, UnsupportedEncodingException { message = new MimeMessage(session); // 设置发件人地址 message.setFrom(new InternetAddress(username, "要显示的发件人名称")); // 设置邮件主题 message.setSubject("主题:默认主题"); // 设置邮件发送内容和内容的content-type message.setContent(content.toString(),this.CONTENT_TYPE_HTML); // 设置邮件接收人地址 String [] address = mailToaddress.split(","); for(int i=0; i

TestEmailFunction 类

package com.cplatform.movie.back.javamail; import java.io.File; import java.io.UnsupportedEncodingException; import javax.mail.MessagingException; public class TestEmailFunction { public static void main(String[] args) { EmailServiceEnity e; // 多个收件人中间以逗号间隔 String mailToaddress = "418874847@qq.com,12450374@qq.com"; // 正文(内容)部分 String content = "点击进入» 刘一天的博客"; try { e = new EmailServiceEnity(mailToaddress, content); e.sendHtmlOrText(); // 测试HTML文本 /** * 切勿使用同一个EmailServiceEnity实例来发送不同内容,如有需要就再初始化一个新实例(否则附件发送失败且乱码) * 因为每个实例在发送完邮件后就会关闭Transport */ e = new EmailServiceEnity(mailToaddress, content); // 传入一个绝对位置的文件路径 File file = new File("d:/data/adimg/20141022/09/ad_20141022094708943.jpg"); e.sendFile(file,"测试复件.jpg"); // 测试复件发送 } catch (UnsupportedEncodingException e1) { e1.printStackTrace(); } catch (MessagingException e1) { e1.printStackTrace(); } } }

本章小结:

对代码进行模块化,分为实体类和业务类
利用继承,来共享父类的属性
简单责任原则,业务类里面能拆分的功能都进行拆分,各负其责,方便调试
复用性,本章体现在邮件的发送功能,真正实现发送功能的是send方法
其他细节:(附件编码问题,正文格式声明,设置收件人方法【多种】)
未涉及:邮件协议


本文题目:javamail模拟邮箱功能发送电子邮件-中级实战篇
浏览路径:http://scjbc.cn/article/cjcshc.html