项目实战之网络电话本之发送邮件名片和导出word版个人信息

devtools/2024/11/14 13:16:53/

1、项目介绍

1)项目功能

用户管理:分为管理员、和普通用户,设置不同用户的权限

电话本信息管理:支持管理员和普通用户对电话本的信息进行增删改操作,模糊查询(根据姓名、地址、单位) 

文件批量导入:支持管理员通过excel文件批量导入电话本信息 

分页功能:对电话本信息管理页面支持分页查看 

电话本分组管理:对电话本进行分组,修改、移动、删除 

邮件发送名片功能:支持管理员根据电话本信息向用户发送邮件,邮件内容为个人信息名片和附件 

用户信息导出功能:导出个人用户的用户信息word文档 

2)技术栈描述

前端 html+thymeleaf+jquery+css

后端 Spring Boot + Spring MVC + MyBatis Plus

数据库 MySQL

其他技术 POI Excel 、word文件导入导出、JavaMail API邮件发送

2、邮件发送具体实现

1)导入发送邮件需要的依赖

<!--        邮件发送--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>

2)添加邮件配置的参数(在application.yml配置文件中)

  mail:host: smtp.qq.com  #qq邮件服务器地址 有其他地址username: xxxxxxx@qq.com #发件人邮箱password: rwcafxsrjxfndfee    #授权码default-encoding: UTF-8 #邮件登录字符集编码port: 25 #发件人邮件服务器端口

 授权码的获取:首先登录QQ邮箱>>>登录成功后找到设置>>>然后找到邮箱设置>>>点击账户>>>找到POP3|SMTP服务>>>点击开启(开启需要验证,验证成功后会有一串授权码用于发送邮件使用)>>>验证成功

3)创建邮件发送controller

以发送个人信息为例

    @AutowiredMailUtil mailUtil;/*** 邮件发送名片功能* @param contactId* @param userId* @return*/@RequestMapping("/sendEmailCard")public void sendEmailCard(Integer contactId, Integer userId){Contacts contacts = this.contactsService.getById(contactId);Users user = this.usersService.getById(contacts.getUserId());Integer gender0 = contacts.getGender();String gender = "男";if(gender0==1){gender="女";}String email = contacts.getEmail();String content="<html><body><h1>个人名片</h1><p>姓名:" +user.getUsername()+"</p><p>单位:" +contacts.getCompany()+"</p><p>性别:" +gender+"</p><p>年龄:" +contacts.getAge()+"</p><p>办公电话:" +contacts.getOfficePhone()+"</p><p>传真:" +contacts.getFax()+"</p><p>手机号码:" +contacts.getMobile()+"</p><p>电子邮件:" +contacts.getEmail()+"</p><p>地址:" +contacts.getAddress()+"</p><p>备注:" +contacts.getRemarks()+"</p></body></html>";String imgPath = "D:\\email\\个人信息表.docx";mailUtil.sendAttachmentsMail(email, "主题:电话信息验证", content, imgPath);}

4) 引入邮件发送工具包

package com.qcby.onlinephonebook.util;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;/*** <p><p/>** @Author: porridge* @Date:2022/3/30 10:17*/
@Component
public class MailUtil {@Value("${spring.mail.username}")String from;@AutowiredJavaMailSender mailSender;//简单邮件public void sendSimpleMail(String to, String subject, String content){SimpleMailMessage message = new SimpleMailMessage();message.setFrom(from); //发件人message.setTo(to);//收件人message.setSubject(subject); //标题message.setText(content);   //文件内容try {mailSender.send(message);System.out.println("简单邮件发送成功!");} catch (Exception e){System.out.println("发送简单邮件时发生异常!"+e);}}//html格式邮件public void sendHtmlMail(String to, String subject, String content){MimeMessage message = mailSender.createMimeMessage();try {//true表示需要创建一个multipart messageMimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);mailSender.send(message);System.out.println("html邮件发送成功!");} catch (MessagingException e) {System.out.println("发送html邮件时发生异常!"+e);}}//带附件的邮件public void sendAttachmentsMail(String to, String subject, String content, String filePath){MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource file = new FileSystemResource(new File(filePath));String fileName = filePath.substring(filePath.lastIndexOf(File.separator));helper.addAttachment(fileName, file);mailSender.send(message);System.out.println("带附件的邮件已经发送。");} catch (MessagingException e) {System.out.println("发送带附件的邮件时发生异常!" + e);}}//带静态资源的邮件public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId){MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);FileSystemResource res = new FileSystemResource(new File(rscPath));helper.addInline(rscId, res);mailSender.send(message);System.out.println("嵌入静态资源的邮件已经发送。");} catch (MessagingException e) {System.out.println("发送嵌入静态资源的邮件时发生异常!" + e);}}
}

发送成功样例

 

3、word导出具体实现

1)实现思路

①组装数据

②获取根目录,创建模板文件

③将模板文件写入到根目录

④编译模板,渲染数据

⑤写入到指定目录位置,临时文件

⑥提供前端下载

⑦删除临时文件

2)导入word导出需要的依赖

<!--            word导出--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.10.0</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>

3)在项目resource目录下创建word模板

word模板如下:

 根据需要,{{}}里面写入需要写入的参数名

4)创建word导出的controller

/*** 个人信息word导出* @param response*/@RequestMapping("/exportWord")public void exportWord(Integer contactId, Integer userId, HttpServletResponse response) {Contacts contacts = this.contactsService.getById(contactId);String gender = "男";if(contacts.getGender()==1){gender = "女";}//1.组装数据Map<String, Object> params = new HashMap<>();params.put("name",contacts.getName());params.put("company", contacts.getCompany());params.put("gender", gender);params.put("age", contacts.getAge());params.put("officePhone", contacts.getOfficePhone());params.put("fax", contacts.getFax());params.put("mobile", contacts.getMobile());params.put("email", contacts.getEmail());params.put("address", contacts.getAddress());params.put("remarks", contacts.getRemarks());//2.获取根目录,创建模板文件String path = copyTempFile("word/info.docx");String fileName = System.currentTimeMillis() + ".docx";String tmpPath = "D:\\email\\" + fileName;try {//3.将模板文件写入到根目录//4.编译模板,渲染数据XWPFTemplate template = XWPFTemplate.compile(path).render(params);//5.写入到指定目录位置FileOutputStream fos = new FileOutputStream(tmpPath);template.write(fos);fos.flush();fos.close();template.close();//6.提供前端下载down(response, tmpPath, fileName);} catch (Exception e) {e.printStackTrace();} finally {//7.删除临时文件File file = new File(tmpPath);file.delete();File copyFile = new File(path);copyFile.delete();}}/*** 用于将文件下载到客户端* @param response* @param filePath  文件路径* @param realFileName  文件名称*/private void down(HttpServletResponse response, String filePath, String realFileName) {String percentEncodedFileName = null;try {percentEncodedFileName = percentEncode(realFileName);} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}StringBuilder contentDispositionValue = new StringBuilder();contentDispositionValue.append("attachment; filename=").append(percentEncodedFileName).append(";").append("filename*=").append("utf-8''").append(percentEncodedFileName);response.addHeader("Access-Control-Allow-Origin", "*");response.addHeader("Access-Control-Expose-Headers", "Content-Disposition,download-filename");response.setHeader("Content-disposition", contentDispositionValue.toString());response.setHeader("download-filename", percentEncodedFileName);try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(filePath));// 输出流BufferedOutputStream bos = new BufferedOutputStream(response.getOutputStream());) {byte[] buff = new byte[1024];int len = 0;while ((len = bis.read(buff)) > 0) {bos.write(buff, 0, len);}} catch (Exception e) {e.printStackTrace();}}/*** 百分号编码工具方法* @param s 需要百分号编码的字符串* @return 百分号编码后的字符串*/public static String percentEncode(String s) throws UnsupportedEncodingException {String encode = URLEncoder.encode(s, StandardCharsets.UTF_8.toString());return encode.replaceAll("\\+", "%20");}/*** 复制模板文件用于写入,得到临时路径* @param s  模板文件的路径* @return*/private String copyTempFile(String s) {InputStream inputStream = getClass().getClassLoader().getResourceAsStream(s);String tempFileName = System.getProperty("user.home") + "/" + "info.docx";File tempFile = new File(tempFileName);try {FileUtils.copyInputStreamToFile(inputStream, tempFile);} catch (IOException e) {throw new RuntimeException(e);}return tempFile.getPath();}

导出成功样例:


http://www.ppmy.cn/devtools/6455.html

相关文章

Ubuntu22.04下opencv4.9.0环境的搭建

目录 1、更新系统包列表:2、安装依赖项:3、下载 OpenCV 源代码:4、编译和安装 OpenCV:5、配置环境变量:6、测试1、更新系统包列表: 在终端中执行以下命令,以确保系统包列表是最新的: sudo apt update2、安装依赖项: 安装构建 OpenCV 所需的依赖项: sudo apt inst…

【GIS教程】ArcGIS做日照分析(附练习数据下载)

我国对住宅日照标准的规定是:冬至日住宅底层日照不少于1小时或大寒日住宅层日照不少于2小时(通常以当地冬至日正午12时的太阳高度角作为依据)。因冬至日太阳高度角最低&#xff0c;照射范围最小&#xff0c;如果冬至日12&#xff1a;00建筑物底层能够接收到阳光&#xff0c;那么…

基于SpringBoot+Vue的无人仓库管理系统 免费获取源码

项目源码获取方式放在文章末尾处 项目技术 数据库&#xff1a;Mysql5.7/8.0 数据表&#xff1a;8张 开发语言&#xff1a;Java(jdk1.8) 开发工具&#xff1a;idea 前端技术&#xff1a;vue 后端技术&#xff1a;SpringBoot 功能简介 (有文档) 项目获取关键字&#x…

[C语言][数据结构][链表] 双链表的从零实现!

目录 零.必备知识 0.1 一级指针 && 二级指针 0.2 双链表节点的成员列表 a. 数据 b. 后驱指针 c. 前驱指针 0.3 动态内存空间的开辟 一. 双链表的实现与销毁 1.1 节点的定义 1.2 双向链表的初始化 && 创建新节点 1.3 尾插 1.4 头插 1.5 尾删 1.6 头删 1…

关于机器学习/深度学习的一些事-答知乎问(六)

如何使用频率域变换对序列数据进行增强&#xff1f; 时频变换是常见的信号分析思路&#xff0c;同样可用于数据增强。在频率域添加噪声是方法之一。比如可以对传感器信号应用短时傅里叶变换STFT得到具有时序关系的谱特征&#xff0c;再在谱特征上应用两种数据增强方法。一是对…

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3&#xff0c;可以直接利用python输出。

关于外网java后端服务访问内网minio中间件,因连接minio超时,启动失败问题

注&#xff1a;服务器情况&#xff1a;2台服务器&#xff0c;内网服务器包含&#xff08;activemq、minio、nginx、redis、mysql、后端java服务&#xff09;。外网服务器只有后端java服务&#xff0c;访问内网的中间件&#xff08;内网服务器开放了部分指定端口&#xff09; 问…

vscode远程ubuntu16安装失败

vscode1.85版本之后不支持ubuntu16了&#xff0c;需要的同学&#xff0c;可下载1.85便携版使用。https://github.com/microsoft/vscode/issues/203967#issuecomment-1923440629 下载地址&#xff1a;https://vscode.download.prss.microsoft.com/dbazure/download/stable/8b377…