JavaMail实现发送邮件,主要是用在项目中的:当新用户以邮箱号码注册的时候,给新用户发送邮件,提醒用户点击连接激活。 其中封装了信件模板。 html
1. java
package com.common.util; import java.util.*; import javax.mail.*; import javax.mail.internet.*; public class MailUtil { /*** * 下发邮件 * @param smtpServers //邮件服务器主机名 * @param protocols //邮件传输协议 * @param usernames //登陆用户名 * @param passwords //登陆密码 * @param froms //发信人地址 * @param tos //收信人地址 * @param subjects //邮件主题 * @param bodys //邮件内容 * @throws Exception */ public void smthEmail(String smtpServers,String protocols,String usernames,String passwords,String froms,String tos,String subjects,String bodys)throws Exception{ String smtpServer=smtpServers;//邮件服务器主机名 String protocol=protocols;//邮件传输协议 String username=usernames;//登陆用户名 String password=passwords;//登陆密码 String from=froms;//发信人地址 String to=tos;//收信人地址 String subject=subjects;//邮件主题 String body=bodys;//邮件内容 //建立Session对象 Properties props=new Properties(); props.setProperty("mail.transport.protocol", protocol); props.setProperty("mail.host",smtpServer); props.put("mail.smtp.auth", "true"); MyAuthenticator authenticator=new MyAuthenticator(username,password); Session session=Session.getInstance(props,authenticator); session.setDebug(true); //建立表明邮件的MimeMessage对象 MimeMessage msg=new MimeMessage(session); msg.setFrom(new InternetAddress(from)); msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to)); msg.setSentDate(new Date()); msg.setSubject(subject); // 设置 E-mail 主题 msg.setContent(body, "text/html;charset = gbk"); // 设置 E-mail 正文部分 msg.saveChanges(); // msg.writeTo(new FileOutputStream("F:\\htmlMail.eml")); //本地调试代码,可去掉 Transport.send(msg); } }
2. 浏览器
package com.common.util; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class MyAuthenticator extends Authenticator{ String username=null; String password=null; //经过构造方法接受外部传入的用户信息 public MyAuthenticator(String user,String pass){ this.username=user; this.password=pass; } //覆盖Authenticator类中的getPasswordAuthentication方法 protected PasswordAuthentication getPasswordAuthentication(){ //使用外部传入的用户名和密码建立对象 return new PasswordAuthentication(username,password); } }
3. 在后台的代码能够这样调用JavaMail接口,其中里面包含了信件的内容模板。 服务器
/** * 给绑定的邮箱发激活邮件 * @param mapping * @param form * @param request * @param response * @return * @throws Exception */ public ActionForward boundEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { // 获取注册的手机号和绑定的邮箱 String userPhone = request.getParameter("userPhone"); String email = request.getParameter("email"); log.debug("----注册的手机号----" + userPhone); log.debug("----要绑定的邮箱----" + userPhone); // 下发邮件 MailUtil mm = new MailUtil(); StringBuffer url = request.getRequestURL(); Long createDate = System.currentTimeMillis(); // 下发邮件的时间,由于连接只能30分钟内有效 //url中的参数最好加密后传输 String link = url + "?method=activeBoundEmail&userPhone="+userPhone+"&email=" + email + "&createDate=" + createDate; // 发送邮件模板,由联通提供 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); String nowDate = sdf.format(new Date()); String subject = "XXX—绑定的用户邮箱激活连接"; String body = "<h2>亲爱的" + userPhone + ":</h2> " + "<h4>恭喜您成为XXX用户!</h4> " + "<p>请点击如下连接激活您绑定的邮箱(连接30分钟内有效): " + "<a href=" + link + ">" + link + "</a>(激活连接)</p><br/>" + "<p>若是点击以上连接没有反应,请将该网址复制并粘贴到新的浏览器窗口中。</p>" + "<p>绑定的邮箱激活后,您便可用绑定的邮箱做为登陆帐号</p><br/><br/>" + "<p style='font-size: 13px' >(请注意,该电子邮件地址不接受回复邮件,若是您并未发过此请求,则多是由于其余用户在尝试绑定邮箱时误输入了您的电子邮件地址而使您收到这封邮件,那么您能够放心的忽略此邮件,无需进一步采起任何操做。)</p><br/><br/><br/>" + "<p align='right'>XXX</p>" + "<p align='right'>" + nowDate + "</p>"; log.debug("---绑定的邮箱的激活连接----" + body); log.debug("---绑定的邮箱的激活连接----" + link); mm.smthEmail(this.getServlet().getServletContext().getInitParameter("smtpServer"), "smtp", this .getServlet().getServletContext().getInitParameter("username"), this.getServlet() .getServletContext().getInitParameter("password"), this.getServlet().getServletContext() .getInitParameter("from"), email, subject, body); //由于这里调用邮件的接口内部代码 若是抛异常的时候并无相关的捕捉异常块,因此外面没法判断邮件接口是否已经发生成功了,只好默认每次都能发送成功 PrintWriter out = response.getWriter(); out.println(0); return null; }