OKHTTP3 --钉钉群机器人 Spring Mail发邮件

public class HttpUtil {

  // 支持直接在String参数中传入文件

  public static final String FILE_LABEL = "file:";

  public static IResponse executeRequest(String url, String param, RequestMethod method,

      Map<String, String> headers) {

    return executeRequest(createDefaultHelper(), url, param, method, headers);

  }

  public static IResponse executeRequest(IHttpHelper httpHelper, String url, String param,

      RequestMethod method, Map<String, String> headers) {

    IResponse response = null;

    if (param != null && param.startsWith(FILE_LABEL)) {

      // 单个文件

      File file = new File(param.substring(FILE_LABEL.length()));

      response = httpHelper.executeRequest(new RequestParam(url, file, method, headers));

    } else {

      JSONObject jsonData = safeParseAsJson(param);

      if (jsonData != null) {

        if (param.contains(FILE_LABEL)) {

          // 参数中包含文件

          HashMap<String, Object> paramMap = new HashMap<String, Object>(5);

          for (Map.Entry<String, Object> entry : jsonData.entrySet()) {

            if (entry.getValue() instanceof String

                && ((String) entry.getValue()).startsWith(FILE_LABEL)) {

              File newFile = new File(((String) entry.getValue()).substring(FILE_LABEL.length()));

              // 转换为File对象

              paramMap.put(entry.getKey(), newFile);

            } else {

              paramMap.put(entry.getKey(), entry.getValue());

            }

          }

          response = httpHelper.executeRequest(new RequestParam(url, paramMap, method, headers));

        } else {

          response = httpHelper.executeRequest(new RequestParam(url, jsonData, method, headers));

        }

      } else {

        response = httpHelper.executeRequest(new RequestParam(url, param, method, headers));

      }

    }

    return response;

  }

  public static IResponse executeRequest(String url, String param, RequestMethod method) {

    return executeRequest(url, param, method, null);

  }

  public static IResponse executeRequest(String url, String param) {

    return executeRequest(url, param, RequestMethod.GET, null);

  }

  public static IResponse executeRequest(String url) {

    return executeRequest(url, null, RequestMethod.GET, null);

  }

  public static IResponse executeRequest(RequestParam param) {

    return executeRequest(createDefaultHelper(), param);

  }

  private static IResponse executeRequest(IHttpHelper httpHelper, RequestParam param) {

    if (param.getParam() != null && param.getParam() instanceof String) {

      return executeRequest(httpHelper, param.getUrl(), (String) param.getParam(),

          param.getMethod(), param.getHeaders());

    } else {

      return httpHelper.executeRequest(param);

    }

  }

  public static IResponse[] executeRequest(RequestParam[] params) {

    if (params != null && params.length > 0) {

      IHttpHelper httpHelper = createDefaultHelper();

      IResponse[] responseArray = new IResponse[params.length];

      for (int i = 0; i < params.length; i++) {

        responseArray[i] = executeRequest(httpHelper, params[i]);

      }

      return responseArray;

    }

    return null;

  }

  public static List<IResponse> executeRequest(List<RequestParam> params) {

    if (params != null && params.size() > 0) {

      IHttpHelper httpHelper = createDefaultHelper();

      ArrayList<IResponse> list = new ArrayList<IResponse>();

      for (int i = 0; i < params.size(); i++) {

        list.add(executeRequest(httpHelper, params.get(i)));

      }

      return list;

    }

    return null;

  }

  public static String executeRequestForText(String url, String param, RequestMethod method,

      Map<String, String> headers) {

    IResponse response = executeRequest(url, param, method, headers);

    return response.parseAsString();

  }

  public static String executeRequestForText(String url, String param, RequestMethod method) {

    return executeRequestForText(url, param, method, null);

  }

  public static String executeRequestForText(String url, String param) {

    return executeRequestForText(url, param, RequestMethod.GET, null);

  }

  public static String executeRequestForText(String url) {

    return executeRequestForText(url, null, RequestMethod.GET, null);

  }

  public static String executeRequestForText(RequestParam param) {

    return createDefaultHelper().executeRequest(param).parseAsString();

  }

  private static OkHttpHelper createOkHttpHelper() {

    return new OkHttpHelper();

  }

  public static IHttpHelper createDefaultHelper() {

    return createOkHttpHelper();

  }

  private static JSONObject safeParseAsJson(String jsonStr) {

    try {

      Object obj = JSON.parseObject(jsonStr);

      if (obj != null && obj instanceof JSONObject) {

        return (JSONObject) obj;

      }

    } catch (Exception e) {

      // e.printStackTrace();

    }

    return null;

  }

}

public interface IHttpHelper {

  IResponse executeRequest(RequestParam param);

  enum RequestMethod {

    GET, POST, PUT, DELETE

  }

  interface IResponse {

    int status();

    String message();

    boolean isSuccessful();

    long costTime();

    long contentLength();

    InputStream inputStream();

    String parseAsString();

    String header(String name);

  }

  class RequestParam {

    private RequestMethod method;

    private String url;

    private Object param;

    private Map<String, String> headers;

    public RequestParam(String url, Object param, RequestMethod method,

        Map<String, String> headers) {

      this.url = url;

      this.param = param;

      this.method = method;

      this.headers = headers;

    }

    public RequestParam(String url, Object param, RequestMethod method) {

      this(url, param, method, null);

    }

    public RequestParam(String url, Object param) {

      this(url, param, RequestMethod.GET, null);

    }

    public RequestParam(String url) {

      this(url, null, RequestMethod.GET, null);

    }

    public RequestMethod getMethod() {

      return method;

    }

    public void setMethod(RequestMethod method) {

      this.method = method;

    }

    public String getUrl() {

      return url;

    }

    public void setUrl(String url) {

      this.url = url;

    }

    public Object getParam() {

      return param;

    }

    public void setParam(Object param) {

      this.param = param;

    }

    public Map<String, String> getHeaders() {

      return headers;

    }

    public void setHeaders(Map<String, String> headers) {

      this.headers = headers;

    }

  }

}

public class OkHttpHelper implements IHttpHelper {

  private final static String CHAR_SET = "utf-8";

  private final static int CONNECT_TIME_IN_SECOND = 60;

  private final static int WRITE_TIME_IN_SECOND = 60;

  private final static int READ_TIME_IN_SECOND = 60;

  public ConnectionPool connectionPool;

  private OkHttpClient httpClient;

  public OkHttpHelper() {

    init();

  }

  private void init() {

    connectionPool = new ConnectionPool(1, 5L, TimeUnit.SECONDS);

    httpClient = new OkHttpClient.Builder().connectionPool(connectionPool)

        .connectTimeout(CONNECT_TIME_IN_SECOND, TimeUnit.SECONDS)

        .writeTimeout(WRITE_TIME_IN_SECOND, TimeUnit.SECONDS)

        .readTimeout(READ_TIME_IN_SECOND, TimeUnit.SECONDS).cookieJar(new CookieJar() {

          // 增加cookie支持(保持session)

          private HashMap<String, List<Cookie>> cookieMap = new HashMap<String, List<Cookie>>(1);

          public void saveFromResponse(HttpUrl httpUrl, List<Cookie> list) {

            cookieMap.put(httpUrl.host(), list);

          }

          public List<Cookie> loadForRequest(HttpUrl httpUrl) {

            List<Cookie> list = cookieMap.get(httpUrl.host());

            if (list == null) {

              list = new ArrayList<Cookie>();

            }

            return list;

          }

        }).build();

  }

  public OkHttpResponse executeRequest(String url, Object param, RequestMethod method,

      Map<String, String> headers) {

    Request request = makeRequest(url, param, method, headers);

    return executeRequest(request);

  }

  public OkHttpResponse executeRequest(String url, Map<String, Object> params, RequestMethod method,

      Map<String, String> headers) {

    Request request = makeRequest(url, params, method, headers);

    return executeRequest(request);

  }

  public OkHttpResponse executeRequest(String url) {

    return executeRequest(url, null);

  }

  public OkHttpResponse executeRequest(String url, Map<String, Object> params) {

    return executeRequest(url, params, RequestMethod.GET);

  }

  public OkHttpResponse executeRequest(String url, Object param) {

    return executeRequest(url, param, RequestMethod.GET);

  }

  public OkHttpResponse executeRequest(String url, Object param, RequestMethod method) {

    return executeRequest(url, param, method, null);

  }

  public OkHttpResponse executeRequest(String url, Map<String, Object> params,

      RequestMethod method) {

    return executeRequest(url, params, method, null);

  }

  public IResponse executeRequest(RequestParam param) {

    if (param.getParam() != null && param.getParam() instanceof Map) {

      return executeRequest(param.getUrl(), (Map<String, Object>) param.getParam(),

          param.getMethod(), param.getHeaders());

    } else {

      return executeRequest(param.getUrl(), param.getParam(), param.getMethod(),

          param.getHeaders());

    }

  }

  public OkHttpResponse executeRequest(Request request) {

    try {

      Response response = httpClient.newCall(request).execute();

      return new OkHttpResponse(response);

    } catch (IOException e) {

      e.printStackTrace();

      OkHttpResponse res = new OkHttpResponse(null);

      res.setException(e);

      return res;

    }

  }

  protected Request makeRequest(String url, Object param, RequestMethod method,

      Map<String, String> headers) {

    Request.Builder builder = new Request.Builder();

    builder.url(url);

    Headers newHeaders = buildHeader(headers);

    if (newHeaders != null) {

      builder.headers(newHeaders);

    }

    switch (method) {

      case GET:

        if (param != null && param instanceof String) {

          String newUrl = buildUrl(url, (String) param);

          builder.url(newUrl);

        }

        builder.get();

        break;

      case POST:

        builder.post(buildBody(param));

        break;

      case PUT:

        builder.put(buildBody(param));

        break;

      case DELETE:

        if (param == null) {

          builder.delete();

        } else {

          builder.delete(buildBody(param));

        }

        break;

      default:

        break;

    }

    return builder.build();

  }

  protected Request makeRequest(String url, Map<String, Object> params, RequestMethod method,

      Map<String, String> headers) {

    Request.Builder builder = new Request.Builder();

    builder.url(url);

    Headers newHeaders = buildHeader(headers);

    if (newHeaders != null) {

      builder.headers(newHeaders);

    }

    switch (method) {

      case GET:

        String newUrl = buildUrl(url, params);

        builder.url(newUrl);

        builder.get();

        break;

      case POST:

        builder.post(buildBody(params));

        break;

      case PUT:

        builder.put(buildBody(params));

        break;

      case DELETE:

        if (params == null) {

          builder.delete();

        } else {

          builder.delete(buildBody(params));

        }

        break;

      default:

        break;

    }

    return builder.build();

  }

  private Headers buildHeader(Map<String, String> headers) {

    if (!isEmpty(headers)) {

      Headers.Builder builder = new Builder();

      for (Map.Entry<String, String> entry : headers.entrySet()) {

        builder.add(entry.getKey(), entry.getValue());

      }

      return builder.build();

    }

    return null;

  }

  private String buildUrl(String url, Map<String, Object> params) {

    if (url != null && !isEmpty(params)) {

      StringBuilder sb = new StringBuilder(url);

      for (Map.Entry<String, Object> entry : params.entrySet()) {

        if (sb.indexOf("?") == -1) {

          sb.append("?");

        } else {

          sb.append("&");

        }

        sb.append(entry.getKey());

        sb.append("=");

        sb.append(entry.getValue());

      }

      return sb.toString();

    }

    return url;

  }

  private String buildUrl(String url, String param) {

    if (url != null && param != null) {

      StringBuilder sb = new StringBuilder(url);

      if (sb.indexOf("?") == -1) {

        sb.append("?");

      } else {

        sb.append("&");

      }

      sb.append(param);

      return sb.toString();

    }

    return url;

  }

  private RequestBody buildBody(Map<String, Object> params) {

    if (!isEmpty(params)) {

      if (isSimpleFormParam(params)) {

        FormBody.Builder builder = new FormBody.Builder();

        for (Map.Entry<String, Object> entry : params.entrySet()) {

          builder.add(entry.getKey(), entry.getValue().toString());

        }

        return builder.build();

      } else {

        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);

        for (Map.Entry<String, Object> entry : params.entrySet()) {

          Object data = entry.getValue();

          if (isSupportMedia(data)) {

            addSupportMedia(builder, entry.getKey(), data);

          } else {

            builder.addFormDataPart(entry.getKey(), data.toString());

          }

        }

        return builder.build();

      }

    }

    return null;

  }

  private RequestBody buildBody(Object param) {

    if (param != null) {

      if (param instanceof JSONObject || param instanceof JSONArray) {

        String json = null;

        if (param instanceof JSONObject) {

          json = ((JSONObject) param).toJSONString();

        } else {

          json = ((JSONArray) param).toJSONString();

        }

        return RequestBody.create(MediaType.parse("application/json"), json);

      } else if (param instanceof String) {

        return RequestBody.create(MediaType.parse("text/plain"), (String) param);

      } else if (param instanceof File) {

        File file = (File) param;

        return RequestBody.create(parseMediaTypeByFileName(file), file);

      }

    }

    return null;

  }

  private boolean isEmpty(Map map) {

    return map == null || map.isEmpty();

  }

  private void addSupportMedia(MultipartBody.Builder builder, String name, Object object) {

    if (object instanceof JSONObject || object instanceof JSONArray) {

      String str = JSON.toJSONString(object);

      builder.addFormDataPart(name, str);

    } else if (object instanceof File) {

      File file = (File) object;

      RequestBody fileBody = RequestBody.create(parseMediaTypeByFileName(file), file);

      builder.addFormDataPart(name, file.getName(), fileBody);

    }

  }

  private MediaType parseMediaTypeByFileName(File file) {

    String fileName = file.getName().toLowerCase();

    if (fileName.endsWith(".png")) {

      return MediaType.parse("image/png");

    } else if (fileName.endsWith(".jpg")) {

      return MediaType.parse("image/jpeg");

    } else if (fileName.endsWith(".bmp")) {

      return MediaType.parse("application/x-bmp");

    } else if (fileName.endsWith(".gif")) {

      return MediaType.parse("image/gif");

    } else if (fileName.endsWith(".mp3")) {

      return MediaType.parse("audio/mp3");

    } else if (fileName.endsWith(".mp4")) {

      return MediaType.parse("video/mpeg4");

    }

    return MediaType.parse("application/octet-stream");

  }

  private boolean isSupportMedia(Object object) {

    if (object != null) {

      if (object instanceof JSONObject || object instanceof JSONArray || object instanceof File) {

        return true;

      }

    }

    return false;

  }

  private boolean isSimpleFormParam(Map<String, Object> params) {

    if (!isEmpty(params)) {

      for (Map.Entry<String, Object> entry : params.entrySet()) {

        Object data = entry.getValue();

        if (isSupportMedia(data)) {

          return false;

        }

      }

    }

    return true;

  }

  public static class OkHttpResponse implements IResponse {

    private Response mResponse;

    private String mResonseText;

    private Exception mException;

    private long mContentLength = -1;

    public OkHttpResponse(Response response) {

      mResponse = response;

    }

    public Exception getException() {

      return mException;

    }

    public void setException(Exception msg) {

      mException = msg;

    }

    public int status() {

      if (mResponse == null) {

        if (mException != null) {

          return -2;

        }

      } else {

        return mResponse.code();

      }

      return -1;

    }

    public String message() {

      if (mResponse == null) {

        if (mException != null) {

          return mException.getMessage() == null ? mException.getClass().getName()

              : mException.getMessage();

        }

      } else {

        return mResponse.message();

      }

      return null;

    }

    public boolean isSuccessful() {

      return mResponse == null ? false : mResponse.isSuccessful();

    }

    public long costTime() {

      return mResponse == null ? -1

          : mResponse.receivedResponseAtMillis() - mResponse.sentRequestAtMillis();

    }

    public long contentLength() {

      if (mResonseText == null) {

        return (mResponse == null || mResponse.body() == null) ? -1

            : mResponse.body().contentLength();

      } else {

        return mContentLength;

      }

    }

    public InputStream inputStream() {

      if (mResponse != null && mResponse.body() != null) {

        return mResponse.body().byteStream();

      }

      return null;

    }

    public String parseAsString() {

      if (mResonseText == null) {

        if (mResponse != null && mResponse.body() != null) {

          try {

            mResonseText = mResponse.body().string();

            if (mResonseText != null && mContentLength == -1) {

              mContentLength = mResonseText.getBytes().length;

            }

          } catch (IOException e) {

            e.printStackTrace();

          }

        }

      }

      return mResonseText;

    }

    public String header(String name) {

      if (mResponse != null) {

        return mResponse.header(name);

      }

      return null;

    }

    public Response getRawResponse() {

      return mResponse;

    }

  }

}

public interface SendService {

  public String atDingTalk(String msg, String atMobiles[], String url, boolean isAtAll);

  public String linkDingTalk(String text, String title, String picUrl, String link, String url);

  public String markdownDingTalk(String text, String title, String[] atMobiles, boolean isAtAll,

      String url);

  String actionCardDingTalk(String text, String title, String singleTitle, String singleURL,

      String url, String hideAvatar, String btnOrientation);

  String allActionCardDingTalk(String text, String title, String btns, String url,

      String hideAvatar, String btnOrientation);

  String sendMobileMsg(String json, String mid, String[] mobile, String msg);

  String sendSimpleMail(String to, String subject, String content) throws Exception;

}

@Service

public class SendServiceImpl implements SendService {

  @Autowired

  private JavaMailSender mailSender;

  @Value("${mail.fromMail.addr}")

  private String from;

  @Override

  public String atDingTalk(String message, String atMobiles[], String url, boolean isAtAll) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    List<String> msgList = new ArrayList<String>();

    JSONObject msg = new JSONObject();

    Map<String, Object> text = new HashMap<String, Object>();

    msg.put("msgtype", "text");

    text.put("content", message);

    text.put("isAtAll", isAtAll);

    msg.put("text", text);

    if (atMobiles == null) {

      msgList.add("");

    } else {

      for (String s : atMobiles)

        msgList.add(s);

    }

    text.put("atMobiles", msgList);

    Object jsonObject = JSON.parse(msg.toString());

    IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);

    System.out.println("===" + r.parseAsString());

    return r.parseAsString();

  }

  @Override

  public String linkDingTalk(String text, String title, String picUrl, String messageUrl,

      String url) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    JSONObject msg = new JSONObject();

    JSONObject link = new JSONObject();

    msg.put("msgtype", "link");

    link.put("title", title);

    link.put("picUrl", picUrl);

    link.put("messageUrl", messageUrl);

    link.put("text", text);

    msg.put("link", link);

    Object jsonObject = JSON.parse(msg.toString());

    IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);

    System.out.println("===" + r.parseAsString());

    return r.parseAsString();

  }

  @Override

  public String markdownDingTalk(String text, String title, String[] atMobiles, boolean isAtAll,

      String url) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    List<String> msgList = new ArrayList<String>();

    JSONObject msg = new JSONObject();

    JSONObject markdown = new JSONObject();

    msg.put("msgtype", "markdown");

    markdown.put("text", text);

    markdown.put("title", title);

    if (atMobiles == null) {

      markdown.put("atMobiles", "");

    } else {

      for (String s : atMobiles)

        msgList.add(s);

      markdown.put("atMobiles", msgList.toString());

    }

    markdown.put("isAtAll", isAtAll);

    msg.put("markdown", markdown);

    Object jsonObject = JSON.parse(msg.toString());

    IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);

    System.out.println("===" + r.parseAsString());

    return r.parseAsString();

  }

  @Override

  public String actionCardDingTalk(String text, String title, String singleTitle, String singleURL,

      String url, String hideAvatar, String btnOrientation) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    JSONObject msg = new JSONObject();

    JSONObject actionCard = new JSONObject();

    msg.put("msgtype", "actionCard");

    actionCard.put("text", text);

    actionCard.put("title", title);

    actionCard.put("singleTitle", singleTitle);

    actionCard.put("singleURL", singleURL);

    actionCard.put("hideAvatar", hideAvatar);

    actionCard.put("btnOrientation", btnOrientation);

    msg.put("actionCard", actionCard);

    Object jsonObject = JSON.parse(msg.toString());

    IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);

    System.out.println("===" + r.parseAsString());

    return r.parseAsString();

  }

  @Override

  public String allActionCardDingTalk(String text, String title, String btns, String url,

      String hideAvatar, String btnOrientation) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    JSONObject msg = new JSONObject();

    JSONObject actionCard = new JSONObject();

    msg.put("msgtype", "actionCard");

    actionCard.put("text", text);

    actionCard.put("title", title);

    actionCard.put("btns", btns);

    actionCard.put("httpHelper", httpHelper);

    actionCard.put("btnOrientation", btnOrientation);

    msg.put("actionCard", actionCard);

    Object jsonObject = JSON.parse(msg.toString());

    IResponse r = httpHelper.executeRequest(url, jsonObject, RequestMethod.POST);

    System.out.println("===" + r.parseAsString());

    return r.parseAsString();

  }

  @Override

  public String sendMobileMsg(String json, String mid, String[] mobile, String msg) {

    OkHttpHelper httpHelper = new OkHttpHelper();

    List<String> mobileList = new ArrayList<String>();

    boolean flag = true;

    for (String s : mobile)

      mobileList.add(s);

    for (String i : mobileList) {

      try {

        httpHelper.executeRequest("http://www.noahedu.com/sendMsgXiaoxuetong/api/sendmsg?json="

            + json + "&mid=" + mid + "&mobile=" + i + "&msg=" + msg);

      } catch (Exception e) {

        flag = false;

        break;

      }

    }

    if (flag) {

      return "发送成功";

    } else {

      return "发送失败";

    }

  }

  @Override

  public String sendSimpleMail(String to, String subject, String content) throws Exception {

    SimpleMailMessage message = new SimpleMailMessage();

    message.setFrom(from);

    message.setTo(to);

    message.setSubject(subject);

    message.setText(content);

    try {

      mailSender.send(message);

    } catch (Exception e) {

      e.printStackTrace();

      return "发送失败";

    }

    return "发送成功";

  }

}

spring.mail.host=smtp.xxx.com

[email protected]

spring.mail.password=xxx

spring.mail.default-encoding=UTF-8

[email protected]

spring.mail.properties.mail.smtp.starttls.enable=flase

spring.mail.properties.mail.smtp.starttls.required=flase

猜你喜欢

转载自blog.csdn.net/weixin_42851893/article/details/84838540
今日推荐