SpringBoot整合JavaMail郵件的兩種方式
更新時間:2024年05月15日 11:13:07 作者:陌殤殤
這篇文章主要介紹了SpringBoot整合JavaMail郵件的兩種方式,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
JavaMail郵件發(fā)送
1.方式一:SpringBoot整合JavaMailSender
1.yml配置提取
application: mail: smtp: #服務(wù)器主機名 host: smtp.qq.com #服務(wù)器端口 port: 465 #你的郵箱地址 username: 5XXXxxxx1@qq.com #你的授權(quán)碼 password: xxxxx #編碼格式 defaultEncoding: utf-8 #是否進行用戶名密碼校驗 auth: true #設(shè)置超時時間 timeout: 20000 #是否啟用ssl ssl-enabled: true
/** * 郵件配置 * @author li */ @Data @ConfigurationProperties(prefix = "application.mail.smtp") public class MailOptionProperties { /** * 服務(wù)器主機名 */ private String host; /** * 服務(wù)器發(fā)送端口 */ private String port; /** * 郵箱地址 */ private String username; /** * 授權(quán)碼 */ private String password; /** * 編碼格式 */ private String defaultEncoding; /** * 是否進行用戶名密碼校驗 */ private String auth; /** * 設(shè)置超時時間 */ private String timeout; /** * ssl啟用 */ private boolean sslEnabled; }
2.config配置
/** * 郵件配置 * @author li */ @Configuration @EnableConfigurationProperties({MailOptionProperties.class}) public class JavaMailConfig { @Autowired private MailOptionProperties mailOptionProperties; @Bean public JavaMailSender javaMailSender() throws GeneralSecurityException { JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); javaMailSender.setHost(mailOptionProperties.getHost()); javaMailSender.setUsername(mailOptionProperties.getUsername()); javaMailSender.setDefaultEncoding(mailOptionProperties.getDefaultEncoding()); javaMailSender.setPassword(mailOptionProperties.getPassword()); Properties properties = new Properties(); //開啟認證 properties.setProperty("mail.smtp.auth", mailOptionProperties.getAuth()); //設(shè)置鏈接超時 properties.setProperty("mail.smtp.timeout", mailOptionProperties.getTimeout()); //啟用調(diào)試 properties.setProperty("mail.debug", "true"); //設(shè)置端口 properties.setProperty("mail.smtp.port", mailOptionProperties.getPort()); //是否啟用ssl if(mailOptionProperties.getSslEnabled()){ //設(shè)置ssl端口 properties.setProperty("mail.smtp.socketFactory.port", mailOptionProperties.getPort()); properties.setProperty("mail.smtp.socketFactory.fallback", "false"); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); //設(shè)置ssl加密 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", mailOptionProperties.getSslEnabled()); properties.put("mail.smtp.ssl.socketFactory", sf); } javaMailSender.setJavaMailProperties(properties); return javaMailSender; } }
3.工具類
import java.io.File; import java.util.Date; import java.util.List; /** * mail郵件消息封裝 * @author li */ @Data public class MailMessage { /** * 收件人郵箱地址集合 */ private List<String> recipient; /** * 抄送人 */ private String [] cc; /** * 密送人 */ private String [] bcc; /** * 發(fā)送時間 */ private Date sendDate; /** * 郵件主題 */ private String subject; /** * 郵件文本內(nèi)容 */ private String text; /** * 是否html格式打開 */ private boolean isHtml = true; /** * 附件集合 */ private List<File> fileList; }
import java.io.InputStream; /** * 文件數(shù)據(jù)封裝 */ @Data public class FileData { private InputStream inputStream; private String fileName; public FileData() { } public FileData(InputStream inputStream, String fileName) { this.inputStream = inputStream; this.fileName = fileName; } }
/** * 郵件發(fā)送工具類 * * @author li * @date 2024-05-14 */ @Component @EnableConfigurationProperties({MailOptionProperties.class}) public class JavaMailOperation { static { //防止附件名太長被截斷 System.getProperties().setProperty("mail.mime.splitlongparameters", "false"); } @Autowired private JavaMailSender javaMailSender; /** * 發(fā)件人郵箱地址 */ @Autowired private MailOptionProperties mailOptionProperties; /** * 郵件發(fā)送 * * @param text 內(nèi)容 * @param subject 標題 * @param emailAddress 收件人 */ public MimeMessageHelper createMessageHelper(MimeMessage message, String subject, String text, String emailAddress) throws Exception { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // 發(fā)件人 messageHelper.setFrom(new InternetAddress(mailOptionProperties.getUsername(), mailOptionProperties.getPersonal(), "UTF-8")); // 收件人郵箱 messageHelper.setTo(new InternetAddress(emailAddress)); // 郵件的主題 messageHelper.setSubject(subject); // 郵件的文本內(nèi)容,true表示文本以html格式打開 messageHelper.setText(text, true); return messageHelper; } /** * 郵件發(fā)送 * * @param text 內(nèi)容 * @param subject 標題 * @param emailAddress 收件人 * @param cc 抄送 * @param bcc 密送 */ public MimeMessageHelper createMessageHelper(MimeMessage message, String subject, String text, String emailAddress, String cc, String bcc) throws Exception { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // 發(fā)件人 messageHelper.setFrom(new InternetAddress(mailOptionProperties.getUsername(), mailOptionProperties.getPersonal(), "UTF-8")); // 收件人郵箱 messageHelper.setTo(new InternetAddress(emailAddress)); //抄送 messageHelper.setCc(cc); //密送(不會在郵件收件人名單中顯示出來) messageHelper.setBcc(bcc); //發(fā)送時間 messageHelper.setSentDate(new Date()); // 郵件的主題 messageHelper.setSubject(subject); // 郵件的文本內(nèi)容,true表示文本以html格式打開 messageHelper.setText(text, true); return messageHelper; } public MimeMessageHelper createMessageHelper(MimeMessage message, String subject, String text, String[] emailAddress) throws Exception { MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // 發(fā)件人 messageHelper.setFrom(new InternetAddress(mailOptionProperties.getUsername(), mailOptionProperties.getPersonal(), "UTF-8")); // 收件人郵箱 messageHelper.setTo(emailAddress); // 郵件的主題 messageHelper.setSubject(subject); // 郵件的文本內(nèi)容,true表示文本以html格式打開 messageHelper.setText(text, true); return messageHelper; } /** * 郵件發(fā)送-單人 * * @param text 內(nèi)容 * @param subject 標題 * @param emailAddress 收件人 */ public void sendMail(String subject, String text, String emailAddress) throws Exception { // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); createMessageHelper(message, subject, text, emailAddress); // 發(fā)送郵件 javaMailSender.send(message); } /** * 郵件發(fā)送-多收件人 * * @param text 內(nèi)容 * @param subject 標題 * @param emailAddress 收件人 */ public void sendMail(String subject, String text, String[] emailAddress) throws Exception { // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); createMessageHelper(message, subject, text, emailAddress); // 發(fā)送郵件 javaMailSender.send(message); } /** * 郵件發(fā)送(帶附件) * * @param text 內(nèi)容 * @param subject 主題 * @param fileName 文件名 * @param inputStream 文件流 * @param emailAddress 收件人 */ public void sendMail(String subject, String text, String fileName, String emailAddress, InputStreamSource inputStream) throws Exception { // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = createMessageHelper(message, subject, text, emailAddress); // 添加附件 messageHelper.addAttachment(fileName, inputStream); // 發(fā)送郵件 javaMailSender.send(message); } /** * 郵件發(fā)送(帶附件) * * @param text 內(nèi)容 * @param subject 標題 * @param file 文件 * @param emailAddress 收件人 */ public void sendMail(String subject, String text, String emailAddress, File file) throws Exception { // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = createMessageHelper(message, subject, text, emailAddress); // 添加附件 messageHelper.addAttachment(file.getName(), file); // 發(fā)送郵件 javaMailSender.send(message); } public void sendMail(String subject, String text, String emailAddress, List<File> files) throws Exception { // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = createMessageHelper(message, subject, text, emailAddress); // 添加附件 for (File file : files) { messageHelper.addAttachment(file.getName(), file); } // 發(fā)送郵件 javaMailSender.send(message); } /** * 發(fā)送freemarker模板格式郵件 * * @param text 內(nèi)容 * @param subject 標題 * @param emailAddress 收件人 * @param files 附件 */ public void sendFreemarkerMail(String subject, String text, String emailAddress, List<File> files) throws Exception { MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = createMessageHelper(message, subject, text, emailAddress); // 構(gòu)建 Freemarker 的基本配置 Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); configuration.setClassLoaderForTemplateLoading(this.getClass().getClassLoader(), "templates"); Template template = configuration.getTemplate("mail.ftl"); // 模板渲染 StringWriter out = new StringWriter(); Map<String, Object> param = new HashMap<>(); param.put("message", "ces"); template.process(param, out); messageHelper.setText(out.toString(), true); // 添加附件 for (File file : files) { messageHelper.addAttachment(file.getName(), file); } javaMailSender.send(message); } public void sendMail(MailMessage mailMessage) { validateParam(mailMessage); try { logger.info("郵件發(fā)送開始。。。。。。。。。。。"); // 創(chuàng)建郵件對象 MimeMessage message = javaMailSender.createMimeMessage(); MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8"); // 發(fā)件人 messageHelper.setFrom(new InternetAddress(mailOptionProperties.getUsername(), mailOptionProperties.getPersonal(), "UTF-8")); //收件人集合 List<String> recipient = mailMessage.getRecipient(); if (CollectionUtils.isNotEmpty(recipient)) { // 收件人郵箱 messageHelper.setTo(recipient.toArray(new String[0])); } //抄送 String[] cc = mailMessage.getCc(); if (cc != null && cc.length > 0) { messageHelper.setCc(cc); } //密送(不會在郵件收件人名單中顯示出來) String[] bcc = mailMessage.getBcc(); if (bcc != null && bcc.length > 0) { messageHelper.setBcc(bcc); } if (ObjectUtils.isNotEmpty(mailMessage.getSendDate())) { //發(fā)送時間 messageHelper.setSentDate(mailMessage.getSendDate()); } //附件 List<File> fileList = mailMessage.getFileList(); if (CollectionUtils.isNotEmpty(fileList)) { for (File file : fileList) { messageHelper.addAttachment(file.getName(), file); } } List<FileData> fileDataList = mailMessage.getFileDataList(); if (CollectionUtils.isNotEmpty(fileDataList)) { for (FileData fileData : fileDataList) { messageHelper.addAttachment(fileData.getFileName(), new InputStreamResource(fileData.getInputStream())); } } // 郵件的主題 messageHelper.setSubject(mailMessage.getSubject()); // 郵件的文本內(nèi)容,true表示文本以html格式打開 messageHelper.setText(mailMessage.getText(), mailMessage.isHtml()); // 發(fā)送郵件 javaMailSender.send(message); logger.info("郵件發(fā)送結(jié)束。。。。。。。。。。。"); } catch (Exception e) { logger.error("郵件發(fā)送失敗。。。。。。。。。。。",e); } } private void validateParam(MailMessage mailMessage) { if (!StringUtils.hasText(mailMessage.getSubject())) { throw new Exception("郵件標題不能為空"); } else if (!StringUtils.hasText(mailMessage.getText())) { throw new Exception("郵件內(nèi)容不能為空"); } else if (mailMessage.getRecipient().isEmpty()) { throw new Exception("收件人不能為空"); } } }
測試
public class Test { protected Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private JavaMailOperation javaMailOperate; @Autowired private RemoteFilesystemConfiguration configuration; @GetMapping("/mail") public void test() throws Exception { logger.info("郵件發(fā)送開始。。。。。。。。。。。"); String subject = "發(fā)送測試"; String text = "郵件內(nèi)容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。"; File file = new File("C:\\Users\\Desktop\\Stream流常用操作.md"); InputStreamSource is = new FileSystemResource(file); javaMailOperate.sendMail(subject,text,file.getName(),"xxx@qq.com",is); logger.info("郵件發(fā)送結(jié)束。。。。。。。。。。。"); } @GetMapping("/free") public void test1() throws Exception { String subject = "發(fā)送測試"; String text = "郵件內(nèi)容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。"; File file = new File("C:\\Users\\Desktop\\Stream流常用操作.md"); javaMailOperate.sendFreemarkerMail(subject,text,"xxx@qq.com", Collections.singletonList(file)); } @GetMapping("/upload") public void test2(MultipartFile multipartFile) throws Exception { String subject = "發(fā)送測試"; String text = "郵件內(nèi)容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。"; String originalFilename = multipartFile.getOriginalFilename(); InputStream is = multipartFile.getInputStream(); InputStreamSource iss = new InputStreamResource(is); javaMailOperate.sendMail(subject,text,originalFilename,"xxx@qq.com",iss); } @GetMapping("/msg") public void test3() throws Exception { File file = new File("C:\\Users\\tjx\\Desktop\\Stream流常用操作.md"); MailMessage mailMessage = new MailMessage(); mailMessage.setRecipient(Collections.singletonList("xxx@qq.com")); mailMessage.setCc(new String[]{"xxx@qq.com"}); mailMessage.setBcc(new String[]{"li5xxxx1@126.com"}); mailMessage.setSendDate(new Date()); mailMessage.setSubject("發(fā)送測試"); mailMessage.setText("內(nèi)容"); mailMessage.setHtml(true); mailMessage.setFileList(Collections.singletonList(file)); javaMailOperate.sendMail(mailMessage); } //流文件測試 @GetMapping("/msg1") public void test4(List<String> urlList) throws Exception { MailMessage mailMessage = new MailMessage(); mailMessage.setRecipient(Collections.singletonList("xxx@qq.com")); mailMessage.setCc(new String[]{"xxxx@qq.com"}); mailMessage.setBcc(new String[]{"xxx@126.com"}); mailMessage.setSendDate(new Date()); mailMessage.setSubject("發(fā)送測試"); mailMessage.setText("內(nèi)容"); FTPClient ftpClient =new FTPClient(); ByteArrayOutputStream out = null; InputStream is = null; try { ftpClient.connect(configuration.getHost(),configuration.getPort()); ftpClient.login(configuration.getUsername(), configuration.getPassword()); ftpClient.setBufferSize(1024); // 設(shè)置文件類型(二進制) ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); out = new ByteArrayOutputStream(); for (String url : urlList) { if(is!=null){ is.reset(); } ftpClient.retrieveFile(url, out); is = new ByteArrayInputStream(out.toByteArray()); List<FileData> fileDataList = Lists.newArrayList(); fileDataList.add(new FileData(is,"測試1.txt")); } javaMailOperate.sendMail(mailMessage); } catch (Exception e) { logger.error("郵件發(fā)送失敗。。。。。。。。。。。",e); }finally { ftpClient.logout(); ftpClient.disconnect(); if (out != null) { out.close(); } if (is != null) { is.close(); } } } }
2.方式二:java直接發(fā)送
<dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
import com.sun.mail.util.MailSSLSocketFactory; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.*; import java.io.File; import java.security.GeneralSecurityException; import java.util.Arrays; import java.util.List; import java.util.Properties; public class MailUtils { public static void sendMail(String email, String emailMsg, List<File> files) throws GeneralSecurityException { // 發(fā)件人電子郵箱 String fromAddress = "xxx@qq.com"; // 指定發(fā)送郵件的主機為 smtp.qq.com QQ 郵件服務(wù)器 String host = "smtp.qq.com"; // 獲取系統(tǒng)屬性 Properties properties = System.getProperties(); //開啟認證 properties.setProperty("mail.smtp.auth", "true"); //啟用調(diào)試 properties.setProperty("mail.debug", "true"); //設(shè)置鏈接超時 properties.setProperty("mail.smtp.timeout", "1000"); //設(shè)置端口 properties.setProperty("mail.smtp.port", "465"); //設(shè)置ssl端口 properties.setProperty("mail.smtp.socketFactory.port", "465"); properties.setProperty("mail.smtp.socketFactory.fallback", "false"); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // 設(shè)置郵件服務(wù)器 properties.setProperty("mail.smtp.host", host); properties.put("mail.smtp.auth", "true"); MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); properties.put("mail.smtp.ssl.enable", "true"); properties.put("mail.smtp.ssl.socketFactory", sf); // 獲取默認session對象 Session session = Session.getDefaultInstance(properties, new Authenticator() { @Override public PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("xxxx@qq.com", "xxx"); //發(fā)件人郵件用戶名、密碼 } }); try { // 創(chuàng)建默認的 MimeMessage 對象 MimeMessage message = new MimeMessage(session); // Set From: 發(fā)件人 message.setFrom(new InternetAddress(fromAddress,"li","UTF-8")); // Set To: 收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress(email)); //設(shè)置郵件主題 message.setSubject("測試","UTF-8"); message.setText("這是一封激活郵件,請<a href='#'>點擊</a>","UTF-8"); // 設(shè)置消息體 String content = "<h1>郵件發(fā)送測試</h1><h3><div style=\"color: red\">" + emailMsg + "</div></h3>"; Multipart multipart = new MimeMultipart(); //郵件正文 BodyPart contentPart = new MimeBodyPart(); //郵件文字 contentPart.setContent(content, "text/html;charset=utf-8"); multipart.addBodyPart(contentPart); if (files!=null&&!files.isEmpty()) { //添加附件 for (File attachment : files) { BodyPart attachmentPart = new MimeBodyPart(); DataSource source = new FileDataSource(attachment); attachmentPart.setDataHandler(new DataHandler(source)); //避免中文亂碼的處理 attachmentPart.setFileName(MimeUtility.encodeWord(attachment.getName())); multipart.addBodyPart(attachmentPart); } } message.setContent(multipart); message.saveChanges(); // 發(fā)送消息 Transport.send(message); System.out.println("Sent message successfully...."); } catch (Exception mex) { mex.printStackTrace(); } } public static void main(String[] args) throws AddressException, MessagingException, GeneralSecurityException { MailUtils.sendMail("xxx@qq.com", "abcdefg", Arrays.asList(new File("C:\\Users\\Desktop\\Stream流常用操作.md"))); } }
附件名稱太長被截斷問題,啟動類添加
System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
到此這篇關(guān)于SpringBoot整合JavaMail郵件的文章就介紹到這了,更多相關(guān)SpringBoot整合JavaMail郵件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mybatis查詢數(shù)據(jù)的項目實現(xiàn)
MyBatis通過XML配置文件或注解,把Java對象映射到對應(yīng)的數(shù)據(jù)庫表中,實現(xiàn)對象關(guān)系和數(shù)據(jù)關(guān)系的互相轉(zhuǎn)換,從而使得Java應(yīng)用程序能夠更簡單的操作和讀取數(shù)據(jù)庫,本文就詳細的介紹一下如何實現(xiàn),感興趣的可以了解一下2023-09-09Spring Cloud Stream整合RocketMQ的搭建方法
本文介紹了如何使用SpringCloudStream整合RocketMQ進行消息傳遞,SpringCloudStream是一個用于構(gòu)建與共享消息系統(tǒng)連接的框架,支持持久pub/sub語義和消費者組,感興趣的朋友跟隨小編一起看看吧2024-11-11