Java代码实现邮件发送

以下是一个简单的邮件发送案例:

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","邮件发送失败");
                            }
                        }
                    }
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值