Overview
本文主要参考了javamail发送邮件的简单实例这篇文章。
最近和Chris
在做secretepdb
这个项目时,用到了发送邮件这一功能(需要用到mail.jar
这个包)。经过Chris
指点和自己查阅资料,还是比较顺利地完成了这一模块,特此记录一下。
该模块包含3
部分:发送器(SimpleMailSender)
,验证器(MyAuthenticator)
和action
。其中发送器部分将model
单独分离出来为MailSenderInfo.java
。
1.发送器(SimpleMailSender)
原程序中实现了两种邮件格式的发送,本项目仅取文本格式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import java.util.Date; import java.util.Properties; import javax.mail.Address; import javax.mail.Message; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; public class SimpleMailSender { public boolean sendTextMail(MailSenderInfo mailInfo) { Properties pro = mailInfo.getProperties(); MyAuthenticator authenticator = new MyAuthenticator(mailInfo.getUserName(), mailInfo.getPassword()); // 根据邮件会话属性和验证器构造一个发送邮件的session Session sendMailSession = Session.getDefaultInstance(pro,authenticator); try { // 根据session创建一个邮件消息 Message mailMessage = new MimeMessage(sendMailSession); // 创建邮件发送者地址 Address from = new InternetAddress(mailInfo.getFromAddress()); // 设置邮件消息的发送者 mailMessage.setFrom(from); // 创建邮件的接收者地址,并设置到邮件消息中 Address to = new InternetAddress(mailInfo.getToAddress()); mailMessage.setRecipient(Message.RecipientType.TO,to); // 设置邮件消息发送的时间 mailMessage.setSentDate(new Date()); // 设置邮件消息的主要内容 String mailContent = mailInfo.getContent(); mailMessage.setText(mailContent); // 发送邮件 Transport.send(mailMessage); return true; } catch (MessagingException e) { e.printStackTrace(); } return false; } } |
2.发送器(SimpleMailSender)
的model
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | import java.util.Properties; public class MailSenderInfo { // 发送邮件的服务器的IP和端口 private String mailServerHost; private String mailServerPort; // 邮件发送者的地址 private String fromAddress; // 邮件接收者的地址 private String toAddress; // 登陆邮件发送服务器的用户名和密码 private String userName; private String password; // 邮件的文本内容 private String content; public Properties getProperties(){ Properties p = new Properties(); //这里我们选用的是SMTP服务器,也可以选择POP3等服务器,但是要注意配置文件要对应。 p.put("mail.smtp.host", mailServerHost); p.put("mail.smtp.port", mailServerPort); //验证类型为ture,否则会出现javax.mail.AuthenticationFailedException异常。 p.put("mail.smtp.auth", "true"); return p; } /* 这里是mailServerHost等7个model的getters和setters。 */ } |
3.验证器(MyAuthenticator)
这个密码验证器必须要有否则会出现javax.mail.AuthenticationFailedException
异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; public class MyAuthenticator extends Authenticator{ String userName=null; String password=null; public MyAuthenticator(){ } public MyAuthenticator(String username, String password) { this.userName = username; this.password = password; } protected PasswordAuthentication getPasswordAuthentication(){ return new PasswordAuthentication(userName, password); } } |
4.Action
这里主要负责读取配置文件(serverInfo.properties)
、前后台交互和执行发送。
4.1 提交(SubmissionAction)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 | import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Properties; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import service.MailSenderInfo; import service.SimpleMailSender; public class SubmissionAction extends ActionSupport { //Used to store the results from DB and be fetched by JSP. private String surname; private String givenName; private String organization; private String email; private String proteinName; private String species; private String geneName; private String uniprotID; private String molecularWeight; private String evidence; private String proteinSequence; private String proteinFunction; private String structure; private String interaction; private String proteinMutation; private String ptSites; private String functionDomain; private String pathway; //Begin Search Action Method public String execute() { MailSenderInfo mailInfo = new MailSenderInfo(); Properties pps = new Properties(); //get the path of the properties file String path = ServletActionContext.getServletContext().getRealPath("/")+"WEB-INF/serverInfo.properties"; try { pps.load(new FileInputStream(path)); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //根据key读取配置文件 String host=pps.getProperty("MAILSERVERHOST"); String port=pps.getProperty("MAILSERVERPORT"); String userName=pps.getProperty("USERNAME"); String password = pps.getProperty("PASSWORD"); String fAddress = pps.getProperty("FROMADDRESS"); String tAddress=pps.getProperty("TOADDRESS"); mailInfo.setMailServerHost(host);//邮箱服务器 mailInfo.setMailServerPort(port);//邮箱端口 mailInfo.setUserName(userName);//发件人邮箱 mailInfo.setPassword(password);//您的邮箱密码 mailInfo.setFromAddress(fAddress);//发件人邮箱 mailInfo.setToAddress(tAddress);//收件人邮箱 String content = "Surname: " + this.surname+"\n" +"Given Name: "+this.givenName+"\n" +"Organization: "+this.organization+"\n" +"Email: "+this.email+"\n" +"Protein Name: "+this.proteinName+"\n" +"Species: "+this.species+"\n" +"Gene Name: "+this.geneName+"\n" +"Uniprot ID: "+this.uniprotID+"\n" +"Molecular Weight: "+this.molecularWeight+"\n" +"Evidence: "+this.evidence+"\n" +"Protein Sequence: "+this.proteinSequence+"\n" +"Protein Function: "+this.proteinFunction+"\n" +"Structure: "+this.structure+"\n" +"Protein-Protein Interaction: "+this.interaction+"\n" +"Protein Mutation: "+this.proteinMutation+"\n" +"Post-translational sites: "+this.ptSites+"\n" +"Function Domain: "+this.functionDomain+"\n" +"Metabolic/signaling Pathway: "+this.pathway+"\n"; mailInfo.setContent(content); //发送邮件 SimpleMailSender sms = new SimpleMailSender(); sms.sendTextMail(mailInfo);//发送文体格式 return SUCCESS; } /*这里写上各个model的getters和setters*/ } |
4.2 配置文件(serverInfo.properties)
配置文件编写很简单,就是等号(=)
两边一一映射,而且不加引号("")
,读取出来都是String
类型。
1 2 3 4 5 6 | MAILSERVERHOST=smtp.mxhichina.com//这里用的阿里云企业邮箱smtp服务器 MAILSERVERPORT=25 USERNAME=系统发件箱地址 PASSWORD=系统发件箱密码 FROMADDRESS=发件箱地址//最好和系统发件箱地址一致 TOADDRESS=收件人邮箱 |
读取配置文件有多种方法,可以参考java读取properties文件方法和对比这篇文章。