以下是一个简单的邮件发送案例:
import java.text.SimpleDateFormat;
import com.alibaba.fastjson.JSONObject;
@Value("${mds.push.email}")
String email;
@Value("${mds.push.from}")
String mdsPushFrom;
@Autowired
private HttpUtil httpUtil;
private void emailSending(TaskScheduleConfigVO scheduleConfigVO){
// 调接口发送预警短信
Map<String, Object> map = new HashMap<>(16);
// // 邮件抄送人,多个抄送人 以 ";"分隔
// map.put("cc",adtSysUserList.get(Constants.INT_ZONE).getUserEmail());
// 消息正文
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateTime = new Date();
String formattedDate = formatter.format(dateTime);
map.put("content", "您好,定时任务:" +scheduleConfigVO.getTaskName() + "," +
"已于:" + formattedDate + "自动停止"+ ", 请检查!!!");
// 预先定义好的发出邮箱代码
map.put("from",mdsPushFrom);
// 是否使用html格式
map.put("html",false);
// 标题
map.put("subject","定时任务提醒");
// 邮件接收人,多个接收人 以 ";"分隔
map.put("to",scheduleConfigVO.getRecipient());
ResultVO<String> stringResultVO = httpUtil.postRequest(email,"["+JSONObject.toJSONString(map)+"]");
if (!ObjectUtils.isEmpty(stringResultVO) && ResultCodeEnum.SUCCESS.code().equals(stringResultVO.getCode())) {
if (org.apache.commons.lang3.StringUtils.isNotEmpty(stringResultVO.getData())) {
JSONObject jsonObject = JSONObject.parseObject(stringResultVO.getData());
if ("[]".equals(JSONObject.toJSONString(jsonObject.get("successIds")))) {
log.info("邮件发送失败");
// throw new BizException("4100","邮件发送失败");
}
}
}
}
yaml文件:
mds:
push:
# 发送邮件
email: ${interface-xxxx-host}/mds/push/email
# 发送邮件地址
from: xxx@xxxxx.com
涉及的工具类:
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.pmc.mg.common.enums.ResultCodeEnum;
import com.pmc.mg.common.request.RequestModel;
import com.pmc.mg.common.enums.CodeEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.Instant;
/**
* 请求VO
*
* @author
* @version
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonPropertyOrder({"code", "msg", "data"})
@JsonIgnoreProperties({"reqId", "utc8", "cost"})
public class ResultVO<T> {
private String code;
private String msg;
private T data;
private String reqId;
private Long utc8;
private Long cost;
public static <T> ResultVO<T> fail(CodeEnum codeEnum, String exMsg) {
return ok(codeEnum.code(), exMsg, null);
}
public static <T> ResultVO<T> fail(CodeEnum codeEnum) {
return ok(codeEnum, null);
}
public static <T> ResultVO<T> ok(CodeEnum codeEnum, T data) {
return ok(codeEnum.code(), codeEnum.msg(), data);
}
public static <T> ResultVO<T> ok(String code, String msg, T data) {
return build(code, msg, data);
}
public static <T> ResultVO<T> success(T data) {
return build(ResultCodeEnum.SUCCESS.code(), ResultCodeEnum.SUCCESS.msg(), data);
}
public static <T> ResultVO<T> failed(T data) {
return build(ResultCodeEnum.FAIL.code(), ResultCodeEnum.FAIL.msg(), data);
}
private static <T> ResultVO<T> build(String code, String msg, T data) {
ResultVO<T> resultVO = new ResultVO<>();
resultVO.setCode(code);
resultVO.setMsg(msg);
resultVO.setData(data);
Long endTime = Instant.now().toEpochMilli();
resultVO.setUtc8(endTime);
Long cost = endTime - RequestModel.get().getStartTime();
resultVO.setCost(cost);
RequestModel.get().setCost(cost);
resultVO.setReqId(RequestModel.get().getReqId());
return resultVO;
}
}
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.pmc.mg.common.constant.Constants;
import com.pmc.mg.common.response.RemoteData;
import com.pmc.mg.common.response.ResultVO;
import com.pmc.mg.common.utils.ThreadPoolUtils;
import com.pmc.mg.common.utils.ValidUtil;
import com.pmc.mg.domain.externalinterfacelog.sevice.ExternalInterfaceLogService;
import com.pmc.mg.domain.externalinterfacelog.vo.ExternalInterfaceLogVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
/**
* HttpUtil http 工具类
**/
@Component
@Slf4j
public class HttpUtil {
@Autowired
private RestTemplate restTemplate;
@Autowired
private RestTemplate restTemplateSchedule;
public ResultVO<String> postRequest(String url, String request) {
ExternalInterfaceLogVO logVO = buildApiLogVO(url, request);
ResultVO<String> response = new ResultVO<>();
long start = System.currentTimeMillis();
try {
//发起一个POST请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(request, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logVO.setStatus(Constants.SUCCESS);
if (!ObjectUtils.isEmpty(responseEntity) && responseEntity.getStatusCode().value() == HttpStatus.OK.value()) {
String body = responseEntity.getBody();
response = ResultVO.success(body);
logVO.setApiMessage(ValidUtil.truncateString(body,5000));
}
} catch (Exception e) {
String errorMsg = e.getMessage();
logVO.setStatus(Constants.FAIL);
logVO.setApiResult(errorMsg);
response = ResultVO.failed(errorMsg);
log.error("请求失败:url= {}, request= {},errorMsg={} " , url, request,errorMsg);
}
saveApiLog(logVO, start);
return response;
}
public String postRequestBody(String url, String request) {
ExternalInterfaceLogVO logVO = buildApiLogVO(url, request);
long start = System.currentTimeMillis();
String result = null;
try {
//发起一个POST请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(request, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logVO.setStatus(Constants.SUCCESS);
if (!ObjectUtils.isEmpty(responseEntity) && responseEntity.getStatusCode().value() == HttpStatus.OK.value()) {
String body = responseEntity.getBody();
logVO.setApiMessage(ValidUtil.truncateString(body,5000));
result = body;
}
} catch (Exception e) {
String errorMsg = e.getMessage();
logVO.setStatus(Constants.FAIL);
logVO.setApiResult(errorMsg);
log.error("请求失败:url= {}, request= {},errorMsg={}" , url, request,errorMsg);
}
saveApiLog(logVO, start);
return result;
}
public String postRequestBodySchedule(String url, String request) {
ExternalInterfaceLogVO logVO = buildApiLogVO(url, request);
long start = System.currentTimeMillis();
String result = null;
try {
//发起一个POST请求
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(request, headers);
ResponseEntity<String> responseEntity = restTemplateSchedule.exchange(url, HttpMethod.POST, entity, String.class);
logVO.setStatus(Constants.SUCCESS);
if (!ObjectUtils.isEmpty(responseEntity) && responseEntity.getStatusCode().value() == HttpStatus.OK.value()) {
String body = responseEntity.getBody();
logVO.setApiMessage(ValidUtil.truncateString(body,5000));
result = body;
}
} catch (Exception e) {
String errorMsg = e.getMessage();
logVO.setStatus(Constants.FAIL);
logVO.setApiResult(errorMsg);
log.error("请求失败:url= {}, request= {},errorMsg={}" , url, request,errorMsg);
}
saveApiLog(logVO, start);
return result;
}
public ResultVO<String> postRequestDefineHeader(String url, String request, HttpHeaders headers) {
long start = System.currentTimeMillis();
ExternalInterfaceLogVO logVO = buildApiLogVO(url, request);
ResultVO<String> response = new ResultVO<>();
try {
//发起一个POST请求
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<String> entity = new HttpEntity<>(request, headers);
ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
logVO.setStatus(Constants.SUCCESS);
if (!ObjectUtils.isEmpty(responseEntity) && responseEntity.getStatusCode().value() == HttpStatus.OK.value()) {
String body = responseEntity.getBody();
response = ResultVO.success(body);
logVO.setApiMessage(ValidUtil.truncateString(body,5000));
}
} catch (Exception e) {
String errorMsg = e.getMessage();
response = ResultVO.failed(errorMsg);
logVO.setStatus(Constants.FAIL);
logVO.setApiResult(errorMsg);
log.error("请求失败:url= {}, request= {},errorMsg={} " , url, request,errorMsg);
}
saveApiLog(logVO, start);
return response;
}
private ExternalInterfaceLogVO buildApiLogVO(String url, String request) {
ExternalInterfaceLogVO logVO = new ExternalInterfaceLogVO();
logVO.setApiAddress(url);
logVO.setApiParam(request);
logVO.setInvokeType(Constants.POST_REQUEST);
return logVO;
}
private boolean saveLogFlag(List<String> excludeInterfaces, ExternalInterfaceLogVO vo) {
String apiAddress = vo.getApiAddress();
String status = vo.getStatus();
// 特定的接口,成功的不记录
for (String excludeInterface : excludeInterfaces) {
if (Constants.SUCCESS.equals(status) && apiAddress.endsWith(excludeInterface)) {
return false;
}
}
return true;
}
private void saveApiLog(ExternalInterfaceLogVO logVO,long start) {
long end = System.currentTimeMillis();
long escapedTime = end- start;
logVO.setElapsedTime(escapedTime);
log.info("url = {}, cost= {} ms", logVO.getApiAddress(), escapedTime);
// 异步存入日志表
if (saveLogFlag(Constants.EXCLUDE_INTERFACES,logVO)) {
CompletableFuture.runAsync(() -> saveApiLogToDb(logVO), ThreadPoolUtils.getThreadPool());
}
}
}
发送邮件图片如下:
如果想要格式的是表格类型的,可以进行拼接的形式:
String key = entry.getKey(); // 获取Map条目的键
List<MppIntMatProReqHdVO> value = entry.getValue(); // 获取Map条目的值
StringBuilder htmlContent = new StringBuilder();
htmlContent.append("<!DOCTYPE html><html lang=\"zh\"><head><meta charset=\"UTF-8\">");
htmlContent.append("<title>到料通知</title><style>table {border-collapse: collapse;width: 100%;}");
htmlContent.append("th, td {border: 1px solid #ccc;padding: 3px 5px;text-align: left;line-height: 1.5;min-width: 30px;}");
htmlContent.append("th {background-color: #f5f2f0;font-weight: bold;}");
htmlContent.append("body {box-sizing: border-box;font-family: Arial, sans-serif;}</style></head>");
htmlContent.append("<body><div style=\"margin: 0 auto; max-width: 900px;\">");
htmlContent.append("<p>尊敬的同事,</p>");
htmlContent.append("<p>您好!xxxx").append(key).append("xxx如下,请及时xxx:</p>");
htmlContent.append("<table><thead><tr><th>xxx</th><th>xxxx</th><th>xxxx</th><th>xxxxx</th><th>xxxx</th><th>xxxxx</th></thead>");
htmlContent.append("<tbody>");
// 遍历值的列表
for (MppIntMatProReqHdVO item : value) {
htmlContent.append("<tr>");
htmlContent.append("<td>").append(item.getReqNumber()).append("</td>");
htmlContent.append("<td>").append(item.getMaterialCode()).append("</td>");
htmlContent.append("<td>").append(item.getMaterialModel()).append("</td>");
htmlContent.append("<td>").append(item.getMaterialDesc()).append("</td>");
if (Constants.ZONE.equals(item.getToBePurQty())) {
htmlContent.append("<td>").append(item.getUnitMatReqQty()).append("</td>");
}else{
htmlContent.append("<td>").append(new BigDecimal(item.getUnitMatReqQty()).subtract(new BigDecimal(item.getToBePurQty()))).append("</td>");
}
htmlContent.append("<td>").append(item.getToBePurQty()).append("</td>");
htmlContent.append("</tr>");
}
htmlContent.append("</tbody></table><p>如有任何疑问,请随时与xxx部门联系。</p>\n" +
" <p>祝工作顺利!</p>\n" +
" \n" +
" <p>此致<br>xxxxx部门</p>\n" +
" </div>\n" +
"</body>\n" +
"</html>");
// 调接口发送预警短信
Map<String, Object> map = new HashMap<>(16);
// 邮件抄送人,多个抄送人 以 ";"分隔
map.put("cc",adtSysUserList.get(0).getUserEmail());
// 预先定义好的发出邮箱代码
map.put("from",mdsPushFrom);
// 消息正文
map.put("content",htmlContent.toString());
// 是否使用html格式
map.put("html",true);
// 标题
map.put("subject","内部物料采购");
// 邮件接收人,多个接收人 以 ";"分隔
map.put("to",adtSysUserList.get(0).getUserEmail());
ResultVO<String> stringResultVO = httpUtil.postRequest(email,"["+JSONObject.toJSONString(map)+"]");
if (!ObjectUtils.isEmpty(stringResultVO) && ResultCodeEnum.SUCCESS.code().equals(stringResultVO.getCode())) {
if (StringUtils.isNotBlank(stringResultVO.getData())) {
JSONObject jsonObject = JSONObject.parseObject(stringResultVO.getData());
if ("[]".equals(JSONObject.toJSONString(jsonObject.get("successIds")))) {
log.info("邮件发送失败email: " +email);
log.info("邮件发送失败 map: " +JSONObject.toJSONString(map));
throw new BizException("4100","邮件发送失败");
}
}
}