根据贺卡图片,依据工作时限是否满足周年纪念,填入对应员工姓名,将生成的图片以邮件形式推送该员工邮箱。
贺卡模型图片 model.jpg [本地测试 或 上传到 文件服务器 测试]
//每日同步符合周年纪念的人员
public void dailyAnniversaryOfUser(){
//查询所有在职人员
List userList = userService.getAllUserCond();
// 当日时间
LocalDate now = LocalDate.now();
//
for (UserInfouser : list) {
Timestamp joinStamp= user.getJoinDate();
if (Objects.nonNull(entryDate)) {
LocalDate joinDate = joinStamp.toLocalDateTime().toLocalDate();
if (now.isEqual(joinDate.plusYears(1))) {
processMethord(1, user);
} else if (now.isEqual(joinDate.plusYears(5))) {
processMethord(5, user);
} else if (now.isEqual(joinDate.plusYears(10))) {
processMethord(10, user);
} else if (now.isEqual(joinDate.plusYears(15))) {
processMethord(15, user);
} else if (now.isEqual(joinDate.plusYears(20))) {
processMethord(20, user);
}
}
}
}
//抽取的处理数据的方法
private void processMethord(Integer num, UserInfo user) {
log.info("进入处理部分===============人为{}", user.getUserName());
AnniversaryEnum ae = AnniversaryEnum.getFromNum(num);
ByteArrayOutputStream baos = null;
try {
//获取对应的图片地址
BufferedImage image = ImageIO.read(new URL("http://162.217.3.16:9090/file/anniversary/" + ae.getName()));
Graphics2D g2d = image.createGraphics();
// 因为linux上且 docker打包无宋体,改为 Noto CJK 字体
g2d.setFont(new Font("Noto Sans CJK SC", Font.BOLD, 42));
g2d.setColor(Color.black);
// 根据图片坐标添加文字
g2d.drawString(user.getUserName(), ae.getX(), ae.getY());
g2d.dispose();
//转为byte[]
baos = new ByteArrayOutputStream();
// 使用ImageIO将BufferedImage写入ByteArrayOutputStream
ImageIO.write(image, "jpg", baos);
baos.flush();
byte[] imageBytes = baos.toByteArray();// 返回字节数组
DataSource dataSource = new ByteArrayDataSource(imageBytes, "image/jpeg");
//注意:image1 图片定位的作用,邮件发送要找到位置填入图片
String htmlTemplate = "
";
// 邮件标题
String subject = "祝您入职" + ae.getLetter() + "周年快乐~!";
if (isTestEnvir()) {
subject = subject + "----测试环境";
}
sendMailService.sendHtmlMailWithPic(subject, htmlTemplate, null, dataSource, Arrays.asList(user.getEmail()).toArray(new String[0]));
} catch (Exception e) {
log.info("贺卡错误信息为={}", e.getMessage());
throw new RuntimeException(e.getMessage());
} finally {
try {
if (baos != null) {
baos.close(); // 关闭流
}
} catch (IOException e) {
log.error("关闭ByteArrayOutputStream时出错", e);
}
}
}
涉及的枚举类
@Getter
public enum AnniversaryEnum {
YEAR_ANNIVERSARY_1("1zn.jpg", 95, 440, 1,"一"),
YEAR_ANNIVERSARY_5("5zn.jpg", 55, 433, 5,"五"),
YEAR_ANNIVERSARY_10("10zn.jpg", 278, 240, 10,"十"),
YEAR_ANNIVERSARY_15("15zn.jpg", 285, 240, 15,"十五"),
YEAR_ANNIVERSARY_20("20zn.jpg", 280, 240, 20,"二十"),
;
//名称
private final String name;
//x轴
private final Integer x;
//y轴
private final Integer y;
private final Integer num;
// 数字对应的大写
private final String letter;
AnniversaryEnum(String name, Integer x, Integer y, Integer num,String letter) {
this.name = name;
this.x = x;
this.y = y;
this.num = num;
this.letter = letter;
}
private static Map map = Arrays.stream(AnniversaryEnum.values()).collect(Collectors.toMap(AnniversaryEnum::getNum, Function.identity()));
/**
* 通过范围获取枚举
*
* @param num 号码
*/
public static AnniversaryEnum getFromNum(Integer num) {
return map.get(num);
}
邮件代码
public void sendHtmlMailWithPic(String subject, String text, String cc, DataSource dataSource, String... tos) {
try {
javaMailSender.setHost(host);
javaMailSender.setPort(Integer.parseInt(port));
javaMailSender.setUsername(username);
javaMailSender.setPassword(password);
javaMailSender.setDefaultEncoding("UTF-8");
Properties p = new Properties();
p.setProperty("mail.smtp.ssl.enable", "false");
p.setProperty("mail.smtp.socketFactory.port", "25");
p.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
javaMailSender.setJavaMailProperties(p);
MimeMessage mimeMailMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMailMessage, true, "utf-8");
messageHelper.setFrom(username);
messageHelper.setTo(tos);
if (cc != null) {
messageHelper.setCc(cc);
}
messageHelper.setSubject(subject);
messageHelper.setText(text, true);
// "image1" 是你用来引用图片的 cid
messageHelper.addInline("image1", dataSource);
javaMailSender.send(mimeMailMessage);
} catch (MessagingException e) {
log.error("邮件发送失败: " + e.getMessage(), e);
// 可以选择抛出一个自定义异常或进行其他处理
throw new RuntimeException("邮件发送失败", e);
}
}
public static void main(String[] args) {
try {
BufferedImage image = ImageIO.read(new File("C:\\Users\\runing\\Desktop\\pic\\1zn.jpg"));
Graphics2D g2d = image.createGraphics();
g2d.setFont(new Font("Noto Sans CJK SC", Font.BOLD, 42));
g2d.setColor(Color.black);
// 设置文字额色1添加文字
g2d.drawString("测试人名", 95, 440);
ImageIO.write(image, "jpg", new File("C:\\Users\\runing\\Desktop\\pic\\test1.jpg"));
g2d.dispose();
System.out.println("图像处理完成,已保存为test1.jpg");
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
最简单方法——图片,鼠标右键——打开方式——画图
打开图片如下图,假设 绿线上 红圈位置 为文字起始位置!,鼠标在那里看左下角有x,y轴的像素坐标!