当前位置: 首页 > news >正文

使用SMTP javamail发送邮件

一、SMTP协议

        SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。使用javamail编写发送程序发送邮件。

以QQ邮箱为例:

需要开启SMTP服务,设置授权码。授权码不是登录密码,授权码是QQ邮箱用于登录第三方客户端/服务的专用密码,适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服务。不同邮箱可能不一样。

还需要服务器地址,QQ 邮箱的服务器地址 (host) 是:

收信服务器 (POP3) : pop.qq.com

发信服务器 (SMTP) : smtp.qq.com

 二、代码编写

 1、配置文件

可以将邮件的账号密码等放入配置文件

#邮件配置,需要修改密码。username:账号,password:密码/授权码,serverUrl:服务器地址,serverPort:服务器端口,sendMail:邮箱
email:username: 1074004100@qq.compassword:serverUrl: smtp.qq.comserverPort: 25sendMail: 1074004100@qq.com

配置对象:

package com.example.demo.config;import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;/*** @author zhanglei* @date : 2023/03/06 14:14* 邮箱配置*/
@Component
@Configuration
@Data
public class EmailConfig {/*** 邮件账号*/@Value("${email.username}")private String username;/*** 邮件密码/授权码*/@Value("${email.password}")private String password;/*** 服务器地址*/@Value("${email.serverUrl}")private String serverUrl;/*** 服务器端口*/@Value("${email.serverPort}")private Integer serverPort;/*** 发送邮箱*/@Value("${email.sendMail}")private String sendMail;}

2、发送方法

参数对象:

package com.example.demo.entity;import lombok.Data;import java.util.List;/*** 邮件内容* @author zhanglei*/
@Data
public class MailContent {/*** 邮件标题*/private String subject;/*** 邮件内容*/private String text;/*** 附件名称*/private List<String> attachmentNameList;/*** 附件地址*/private List<String> attachmentUrlList;/*** 目标邮箱*/private String toEmail;/*** 抄送邮箱*/private String ccEmail;}

发送方法:

package com.example.demo.util;import com.example.demo.config.EmailConfig;
import com.example.demo.entity.MailContent;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;/*** 自定义邮箱发送邮件** @author zhanglei* @version 1.0* @date 2024-03-05 15:08*/
@Component
public class MailSendSmtp {/*** 默认端口号*/public static final Integer MAIL_DEFAULT_PORT = 25;@Autowiredprivate EmailConfig emailConfig;/*{"attachmentNameList": ["附件名.pdf"],"attachmentUrlList": ["https://invtest.nntest.cn/fp/BoRzE95ScXVqSZDehEhBZbz0YyYUFDwZ4Rr8oEuLzBfeM7rFoDSjYRKObeRPOHXyAnrfgbHtf4mz5r3-qvJRvQ.pdf"],"ccEmail": "","subject": "测试邮件","text": "你好,这个测试邮件,请忽略","toEmail": "1953623531.qq.com"}*//*** 发送邮件,自己发送,不使用消息中心** @param mailContent 邮件内容* @throws Exception 异常*/public boolean send(MailContent mailContent) {try {//抄送地址List<String> addresses = new ArrayList<>();addresses.add(mailContent.getToEmail());if (StringUtils.isNotBlank(mailContent.getCcEmail())) {String[] ccs = mailContent.getCcEmail().split(";");for (String addr : ccs) {if (StringUtils.isNotBlank(addr)) {addresses.add(addr);}}}JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();// 设置邮件内容格式javaMailSender.setDefaultEncoding("utf-8");MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);javaMailSender.setHost(emailConfig.getServerUrl());// 设置默认端口,防止使用域名的时候,解析不正确Integer port = emailConfig.getServerPort() == null ? MAIL_DEFAULT_PORT : emailConfig.getServerPort();if (!MAIL_DEFAULT_PORT.equals(port)) {javaMailSender.setPort(port);}javaMailSender.setUsername(emailConfig.getUsername());javaMailSender.setPassword(emailConfig.getPassword());// 如果配置的发送邮箱为空,则使用邮件账号;否则使用发送邮箱helper.setFrom(StringUtils.isBlank(emailConfig.getSendMail()) ? emailConfig.getUsername() : emailConfig.getSendMail());//目标邮箱helper.setTo(mailContent.getToEmail());//邮件内容helper.setText(mailContent.getText(), true);//邮件标题helper.setSubject(mailContent.getSubject());// 增加抄送人if (StringUtils.isNotBlank(mailContent.getCcEmail())) {helper.setCc(addresses.toArray(new String[0]));}//附件,可以是多个,获取文件流if (CollectionUtils.isNotEmpty(mailContent.getAttachmentNameList())) {for (int i = 0; i < mailContent.getAttachmentNameList().size(); i++) {String fileName = mailContent.getAttachmentNameList().get(i);String url = mailContent.getAttachmentUrlList().get(i);byte[] pdfBytes = HttpClientUtil.getRemoteResource(url, 5000);if (pdfBytes != null) {ByteArrayResource pdfResource = new ByteArrayResource(pdfBytes);helper.addAttachment(MimeUtility.encodeText(fileName), pdfResource, "application/pdf");}}}Properties props = new Properties();/*// 增加ssl配置if (mailInfoUtil.isEnableSsl()) {props.put("mail.smtp.auth", "true");props.put("mail.smtp.ssl.enable", "true");}// 增加tsl配置if (mailInfoUtil.isEnableTls()) {props.put("mail.smtp.starttls.enable", "true");props.put("mail.smtp.starttls.required", "true");}*/if (!props.isEmpty()) {Session session = Session.getInstance(props, new javax.mail.Authenticator() {@Overrideprotected javax.mail.PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(emailConfig.getUsername(), emailConfig.getPassword());}});javaMailSender.setSession(session);}// 发送邮件javaMailSender.send(mimeMessage);return true;} catch (Exception e) {return false;}}
}

项目地址:https://gitee.com/itzhl/dynamic-data-source-demo.git

http://www.lryc.cn/news/312964.html

相关文章:

  • Hello C++ (c++是什么/c++怎么学/c++推荐书籍)
  • 最新的前端开发技术(2024年)
  • GCN 翻译 - 2
  • HBase 的安装与部署
  • 236.二叉搜索树的公共祖先
  • 【论文精读】大语言模型融合知识图谱的问答系统研究
  • LabVIEW高精度天线自动测试系统
  • 7.3 支付模块 - 创建订单、查询订单、通知
  • 灵魂指针,教给(一)
  • Linux 开发工具 yum、git、gdb
  • Markdown
  • 【Oracle】oracle中sql给表新增字段并添加注释说明;mysql新增、修改字段
  • 【汇总】pytest简易教程
  • openssl调试记录
  • 3.7练习题解
  • MQ的消费模式-消息是推还是拉
  • 一个平台满足你对测试工具的所有需求
  • 【C语言】【字符串函数】【超详解】【上】!!!
  • 算法沉淀——动态规划之其它背包问题与卡特兰数(leetcode真题剖析)
  • selenium中ChromeDriver配置,一把过,并且教你伪装
  • vue3 + vite 项目可以使用纯Js开发吗?
  • Java EE之线程安全问题
  • 掌握Nodejs高级图片压缩技巧提升web优化
  • C++初阶 类(上)
  • 图片速览 BitNet: 1-bit LLM
  • 金融基础——拨备前利润和拨备后利润介绍
  • 网络编程作业day7
  • 【Vision Pro杀手级应用】3D音乐会/演唱会,非VR视频播放的形式,而是实实在在的明星“全息”形象,在你的面前表演
  • 变频器学习
  • Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】