发送邮件浅析
2019-03-05 本文已影响0人
nzdnllm
1.编写javabean,MailInfo.class
package com.xxx.javabean;
public class MailInfo {
//邮箱服务器 如smtp.263.net
private String host ;
//用户邮箱 如**@xxx.com
private String formName ;
//用户授权码 不是用户名密码 可以自行查看相关邮件服务器怎么查看
private String formPassword ;
//消息回复邮箱
private String replayAddress ;
//发送地址
private String toAddress ;
//发送主题
private String subject ;
//发送内容
private String content ;
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public String getFormName() {
return formName;
}
public void setFormName(String formName) {
this.formName = formName;
}
public String getFormPassword() {
return formPassword;
}
public void setFormPassword(String formPassword) {
this.formPassword = formPassword;
}
public String getReplayAddress() {
return replayAddress;
}
public void setReplayAddress(String replayAddress) {
this.replayAddress = replayAddress;
}
public String getToAddress() {
return toAddress;
}
public void setToAddress(String toAddress) {
this.toAddress = toAddress;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
2.配置邮件的发送发和接收方的信息
package com.xxx.servlet;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMultipart;
import com.xxx.javabean.MailInfo;
public class SendJavaHtmlEmail {
//定义发送邮件用户的邮箱信息
private final static String host="邮箱host";
private final static String formName="邮箱账号,如xxx@xx.com";
private final static String password="邮箱密码";
private final static String replayAddress="邮箱账号,如xxx@xx.com";
public static void sendHtmlMail(MailInfo info)throws Exception{
info.setHost(host);
info.setFormName(formName);
info.setFormPassword(password); //授权码~不一定是密码
info.setReplayAddress(replayAddress);
Message message = getMessage(info);
// MiniMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart mainPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart html = new MimeBodyPart();
// 设置HTML内容
html.setContent(info.getContent(), "text/html; charset=utf-8");
mainPart.addBodyPart(html);
// 将MiniMultipart对象设置为邮件内容
message.setContent(mainPart);
Transport.send(message);
}
private static Message getMessage(MailInfo info) throws Exception{
final Properties p = System.getProperties() ;
p.setProperty("mail.smtp.host", info.getHost());
p.setProperty("mail.smtp.auth", "true");
p.setProperty("mail.smtp.user", info.getFormName());
p.setProperty("mail.smtp.pass", info.getFormPassword());
p.setProperty("mail.smtp.port", "465");
p.setProperty("mail.smtp.socketFactory.port", "465");
// 根据邮件会话属性和密码验证器构造一个发送邮件的session
Session session = Session.getInstance(p, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(p.getProperty("mail.smtp.user"),p.getProperty("mail.smtp.pass"));
}
});
//session.setDebug(true);
Message message = new MimeMessage(session);
//消息发送的主题
message.setSubject(info.getSubject());
//接受消息的人
message.setReplyTo(InternetAddress.parse(info.getReplayAddress()));
//消息的发送者
message.setFrom(new InternetAddress(p.getProperty("mail.smtp.user"),"发件者信息,如姓名"));
// 创建邮件的接收者地址,并设置到邮件消息中
message.setRecipients(Message.RecipientType.TO,new InternetAddress().parse(info.getToAddress()));
// 消息发送的时间
message.setSentDate(new Date());
return message ;
}
}
3.发送结果至相关用户邮箱
//配置发送邮件
public void send(String failName,String lineName,JSONObject jsonObject,Map mailMap) throws Exception{
//System.out.println("发送邮件");
//邮件标题
String title ="【"+lineName+"监控报警触发】发生接口异常报警";
//遍历数组打印结果
String content ="<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\">";
content+="<tr><td>所属服务</td>";
content+="<td>用例名称</td>";
content+="<td>运行结果</td>";
content+="<td>运行时间</td>";
content+="<td>错误描述</td></tr>";
int contentCountLine=0,contentCountTester=0;
String contentLine=content,contentTester=content;
for(int i=0;i<jsonObject.getJSONArray("data").size();i++) {
int caseFailCount = Integer.parseInt((String) jsonObject.getJSONArray("data").getJSONObject(i).get("caseFailCount"));
int readFailCount = Integer.parseInt((String) jsonObject.getJSONArray("data").getJSONObject(i).get("readFailCount"));
if(jsonObject.getJSONArray("data").getJSONObject(i).get("failureMessage")!="") {
if(!jsonObject.getJSONArray("data").getJSONObject(i).get("failureMessage").equals("当日首次写入文件失败") ||
!jsonObject.getJSONArray("data").getJSONObject(i).get("failureMessage").equals("无法读取到最近一次执行结果")) {
if(caseFailCount>=3) {
contentCountLine++;
contentLine+="<tr><td>"+lineName+"</td>";
contentLine+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("fileName")+"</td>";
contentLine+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("success")+"</td>";
contentLine+="<td>"+refFormatNowDate(Long.valueOf(jsonObject.getJSONArray("data").getJSONObject(i).get("timedate")+""))+"</td>";
contentLine+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("failureMessage")+"</td></tr>";
}
}else {
if(readFailCount>=3) {
contentCountTester++;
contentTester+="<tr><td>"+lineName+"</td>";
contentTester+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("fileName")+"</td>";
contentTester+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("success")+"</td>";
contentTester+="<td>"+refFormatNowDate(Long.valueOf(jsonObject.getJSONArray("data").getJSONObject(i).get("timedate")+""))+"</td>";
contentTester+="<td>"+jsonObject.getJSONArray("data").getJSONObject(i).get("failureMessage")+"</td></tr>";
}
}
}
}
}
//判断给各业务线相关人员发送邮件
if(contentCountLine>0 && failName.equals("caseFail") ) {
MailInfo infoLine = new MailInfo();
switch (lineName){
case "serverline1":
infoLine.setToAddress(mailMap.get("serverline1").toString()); //发送对象的邮箱
break;
case "serverline2":
infoLine.setToAddress(mailMap.get("serverline2").toString()); //发送对象的邮箱
break;
case "serverline3":
infoLine.setToAddress(mailMap.get("serverline3").toString()); //发送对象的邮箱
break;
case "serverline4":
infoLine.setToAddress(mailMap.get("serverline4").toString()); //发送对象的邮箱
break;
default:
infoLine.setToAddress(mailMap.get("serverline5").toString()); //发送对象的邮箱
break;
}
String finalContentLine="<div>"+lineName+"服务有"+contentCountLine+"个接口发生错误</div><br/>"+contentLine+"</table>";
infoLine.setSubject(title);
infoLine.setContent(finalContentLine);
int lineExceCount=0;
while(lineExceCount<2) {
try {
TimeUnit.SECONDS.sleep(1);
SendJavaHtmlEmail.sendHtmlMail(infoLine);
lineExceCount=2;
} catch (Exception e) {
lineExceCount++;
if(lineExceCount==2) {
loginfo.info("'"+title+"'的邮件发送失败!,邮件服务无法链接");
e.printStackTrace();
}
}
}
}
//判断是否要给测试人员发送邮件
if(contentCountTester>0 && failName.equals("readFail") ) {
MailInfo infoTester=new MailInfo();
infoTester.setToAddress(mailMap.get("test").toString());
String finalContentTester="<div>"+lineName+"服务有"+contentCountTester+"个接口发生错误</div><br/>"+contentTester+"</table>";
infoTester.setSubject(title);
infoTester.setContent(finalContentTester);
int testerExceCount=0;
while(testerExceCount<2) {
try {
TimeUnit.SECONDS.sleep(1);
SendJavaHtFmlEmail.sendHtmlMail(infoTester);
testerExceCount=2;
} catch (Exception e) {
testerExceCount++;
if(testerExceCount==2) {
loginfo.info("给Tester发送的'"+title+"'的邮件发送失败!,邮件服务无法链接");
e.printStackTrace();
}
}
}
}
}
4.其他方法汇总
// 解析csv文件
private ArrayList<String[]> read(String filepath) {
ArrayList<String[]> csvList = new ArrayList<String[]>();
try {
File file = new File(filepath);
FileInputStream fileInput = new FileInputStream(file);
InputStreamReader isr = new InputStreamReader(fileInput, "utf-8");
CsvReader csvReader = new CsvReader(isr);
csvReader.readHeaders();
while (csvReader.readRecord()) {
csvList.add(csvReader.getValues());
}
csvReader.close();
fileInput.close();
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
return csvList;
}
// 读取当前系统日期
public String refFormatNowDate(long timeMill) {
Date nowTime = new Date(timeMill);
SimpleDateFormat sdFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String retStrFormatNowDate = sdFormatter.format(nowTime);
return retStrFormatNowDate;
}
// 获取当日时间戳
public String formatTodayDate() {
Date nowTime = new Date(System.currentTimeMillis());
SimpleDateFormat tdFormatter = new SimpleDateFormat("yyyyMMdd");
String formatStrTodayDate = tdFormatter.format(nowTime);
return formatStrTodayDate;
}