使用javax.mail实现邮件的简单发送
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.0</version> <relativePath/> </parent> <groupId>com.mail</groupId> <artifactId>mail-service</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!--tomcat容器--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency> <!--邮件发送相关依赖三个--> <dependency> <groupId>commons-beanutils</groupId> <artifactId>commons-beanutils</artifactId> <version>1.9.4</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency> <!--引入junit单元测试依赖--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> <finalName>qiuxie</finalName> </build> </project>
package com.mail;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:45
*/
@SpringBootApplication
public class MailApplication {
public static void main(String[] args) {
SpringApplication.run(MailApplication.class,args);
}
}
server.port=8081 china.com:smtp.china.com soim.net:freemail.soim.com bjmail.net:bjmail.net 263.net.cn:263.net.cn gz168.net:email.gz168.net mailbox.com.cn:email.com.cn yes100.com:smtp.yes100.com mail.bodachina.com:mail.bodachina.com foxmail.com.cn:smtp.foxmail.com.cn email.com.cn:www.email.com.cn tom.com:smtp.tom.com peoplemail.com.cn:smtp.peoplemail.com.cn kali.com.cn:smtp.kali.com.cn x263.net:smtp.x263.net ccidnet.com:smtp.ccident.com 7119.net:smtp.7119.net public.guangzhou.gd.cn:public.guangzhou.gd.cn yahoo.com.ar:smtp.mail.yahoo.com.ar yahoo.com.au:smtp.mail.yahoo.com.au yifan.net:yifan.net yahoo.es:smtp.mail.yahoo.es yahoo.co.kr:smtp.mail.yahoo.co.kr yahoo.no:smtp.mail.yahoo.no tt.zj.cn:smtp.email.com.cn netease.com:smtp.netease.com yahoo.com.tw:smtp.mail.yahoo.com.tw softhome.net:smtp.SoftHome.net 363.net:smtp.363.net cfe21.com:www.cfe21.com sina.com:smtp.sina.com.cn hnet.com.cn:smtp.email.com.cn yahoo.com.br:smtp.mail.yahoo.com.br fengyun.net:freemail.fengyun.net newstar.com.cn:smtp.email.com.cn yahoo.co.jp:smtp.mail.yahoo.co.jp chinaxian.com:www.email.com.cn china183.com:mail.china183.com yahoo.fr:smtp.mail.yahoo.fr yahoo.com:smtp.mail.yahoo.com bodachina.com:smtp.bodachina.com freemail.online.tj.cn:freemail.online.tj.cn gzpublic.guangzhou.gd.cn:gzpublic.guangzhou.gd.cn dfworld.net:mail.dfworld.net dl163.com:www.dl163.com yahoo.com.cn:smtp.mail.yahoo.com.cn 21cn.com:smtp.21cn.com fd21.com:smtp.fd21.com sohu.com:smtp.sohu.com elawchina.com:smtp.elawchina.com citiz.net:smtp.citiz.net fugao.net:smtp.email.com.cn gzyp21.net:gzyp21.net freemail.nx.cninfo.net:freemail.nx.cninfo.net btamail.net.cn:btamail.net.cn 263.net:smtp.263.net gzboy.com:www.email.com.cn yahoo.com.mx:smtp.mail.yahoo.com.mx yahoo.ca:smtp.mail.yahoo.ca etang.com:smtp.etang.com 371.net:smtp.371.net wx88.net:mail.wx88.net km169.net:email.km169.net 990.net:990.net 163.com:smtp.163.com 139.com:smtp.139.com yeah.net:smtp.yeah.net myrice.com:smtp.myrice.com sh163.net:mail.sh163.net yahoo.se:smtp.mail.yahoo.se 2888.com:2888.com mybada.net:smtp.mybada.net yahoo.de:smtp.mail.yahoo.de elong.com:smtp.elong.com yahoo.dk:smtp.mail.yahoo.dk chinese.com:smtp.chinese.com 20520.com:smtp.20520.com 777.net.cn:mail.777.net.cn cmmail.com:smtp.cmmail.com cnuninet.com:smtp.bj.cnuninet.com focus.com.cn:smtp.focus.com.cn eazier.com:smtp.eazier.com yesky.com:smtp.yesky.com mweb.com.cn:smtp.mweb.com.cn cww.com:smtp.china.com 100m.hl.cninfo.net:100m.hl.cninfo.net online.sh.cn:smtp.citiz.net 21cn.net:smtp.21cn.net yahoo.it:smtp.mail.yahoo.it cityhot.com:citymail.cityhot.com 163.net:smtp.163.net dg.163mail.net:dg.163mail.net soyou.net:smtp.soyou.net w4f.com:smtp.email.com.cn alibaba.com:smtp.alibaba.com wocall.com:wocall.com kzinfo.net:mail.kzinfo.net yahoo.com.hk:smtp.mail.yahoo.com.hk nethao.com:freemail.nethao.com tonghua.com.cn:smtp.tonghua.com.cn fm365.com:mail.fm365.com 88998.com:202.100.222.86 yahoo.co.uk:smtp.mail.yahoo.co.uk telekbird.com.cn:smtp.telekbird.com.cn 2911.net:smtp.2911.net 8848.net:smtp.8848.net guohao.com:guohao.com
package com.mail.entity;
import lombok.Data;
import java.util.Date;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:54
*/
@Data
public class MimeMessageDTO {
/**
* 变量名 subject: TODO 邮件标题
*/
private String subject;
/**
* 变量名 sentDate: TODO 邮件日期
*/
private Date sentDate;
/**
* 变量名 text: TODO 邮件内容
*/
private String text;
/**
* 目标邮箱
*/
private String targetAddress;
}
package com.mail.service;
import com.mail.entity.MimeMessageDTO;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:49
*/
public interface SendMailsService {
/**
* 邮件测试
* @param mimeMessageDTO
*/
void sendMail(MimeMessageDTO mimeMessageDTO);
}
package com.mail.service.impl;
import com.mail.entity.MimeMessageDTO;
import com.mail.service.SendMailsService;
import com.mail.util.MailUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:52
*/
@Service
@Slf4j
public class SendMailsServiceImpl implements SendMailsService {
/**
* 邮件测试
*
* @param mimeMessageDTO
*/
@Override
public void sendMail(MimeMessageDTO mimeMessageDTO) {
//用户邮箱地址
String userName = "123@163.com";
//授权码
String password = "123";
// 发送单邮件
if (MailUtil.sendGroupEmail(userName, password, mimeMessageDTO.getTargetAddress(), mimeMessageDTO)) {
log.info("邮件发送成功!");
} else {
log.info("邮件发送失败!!!");
}
}
}
package com.mail.util;
import com.mail.entity.MimeMessageDTO;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.List;
import java.util.Properties;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:56
*/
@Slf4j
@Data
public class MailUtil {
/**
* 变量名 userName: TODO 邮箱用户名
*/
private String userName;
/**
* 变量名 password: TODO 邮箱地址
*/
private String password;
/**
* 变量名 smtpHost: TODO 邮箱smtp地址,发送地址
*/
private String smtpHost;
/**
* 变量名 targetAddress: TODO 目标邮箱地址
*/
private String targetAddress;
/**
* 发送单邮件
* @param userName
* @param password
* @param targetAddress
* @param mimeDTO
* @return
*/
public static boolean sendEmail(String userName,String password,String targetAddress,
MimeMessageDTO mimeDTO){
return publicsendEmail(userName,password,targetAddress,mimeDTO,false,null);
}
/**
* 发送单邮件(附件)
* @param userName
* @param password
* @param targetAddress
* @param mimeDTO
* @param filepath 文件本地绝对路径
* @return
*/
public static boolean sendEmailByFile(String userName,String password,String targetAddress,
MimeMessageDTO mimeDTO,List<String> filepath){
return publicsendEmail(userName,password,targetAddress,mimeDTO,true,filepath);
}
/**
* 群发邮件
* @param userName
* @param password
* @param targetAddress 多个邮件发送地址,以,分隔
* @param mimeDTO
* @return
*/
public static boolean sendGroupEmail(String userName,String password,String targetAddress,
MimeMessageDTO mimeDTO){
return publicsendEmail(userName,password,targetAddress,mimeDTO,true,null);
}
/**
* 群发邮件 (附件)
* @param userName
* @param password
* @param targetAddress 多个邮件发送地址,以,分隔
* @param mimeDTO
* @param filepath 文件本地绝对路径
* @return
*/
public static boolean sendGroupEmailByFile(String userName,String password,String targetAddress,
MimeMessageDTO mimeDTO,List<String> filepath){
return publicsendEmail(userName,password,targetAddress,mimeDTO,true,filepath);
}
/**
* 邮件发送基础方法
* @param userName
* @param password
* @param targetAddress
* @param mimeDTO
* @param isGroup
* @param filepath
* @return
*/
private static boolean publicsendEmail(String userName,String password,String targetAddress,
MimeMessageDTO mimeDTO,boolean isGroup,List<String> filepath){
Properties props = makeMailProperties(userName);
String hostname= SMTPUtil.simpleMailSender(userName);
Session session = Session.getInstance(props, new PopupAuthenticator(userName, password));
session.setDebug(false);
try {
Transport ts = session.getTransport();
ts.connect(hostname,userName,password);
Message message =!isGroup?createEmail(session,userName,targetAddress,mimeDTO)
:createEmailByGroupAndFile(session,userName,
targetAddress,mimeDTO,filepath==null?null:filepath);
ts.sendMessage(message,message.getAllRecipients());
ts.close();
} catch (Exception mex) {
mex.printStackTrace();
return false;
}
return true;
}
/**
* 创建邮件信息
* @param userName
* @return
*/
private static Properties makeMailProperties(String userName){
Properties props = new Properties();
String hostname=SMTPUtil.simpleMailSender(userName);
log.info("hostname:{}",hostname);
props.put("mail.smtp.host", hostname);
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
if(hostname.indexOf(".qq.com")!=-1){
props.setProperty("mail.smtp.socketFactory.port", "465");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
}
return props;
}
/**
* 创建邮件
* @Author Casper
* Create_time:2015年10月17日 下午7:45:57
* description:
*/
private static Message createEmail(Session session,String userName,String regMail,MimeMessageDTO mimeDTO){
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(userName));
message.setRecipient(Message.RecipientType.TO, new InternetAddress(regMail));
message.setSubject(mimeDTO.getSubject());
message.setContent(mimeDTO.getText(),"text/html;charset=UTF-8");
message.saveChanges();
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
/**
* 创建群发带附件
* @return
*/
private static Message createEmailByGroupAndFile(Session session,String userName,
String regMail,MimeMessageDTO mimeDTO,List<String> filepath){
MimeMessage message = new MimeMessage(session);
try {
message.setFrom(new InternetAddress(userName));
// 创建收件人列表
if (regMail != null && regMail.trim().length() > 0) {
String[] arr = regMail.split(",");
int receiverCount = arr.length;
if (receiverCount > 0) {
InternetAddress[] address = new InternetAddress[receiverCount];
for (int i = 0; i < receiverCount; i++) {
address[i] = new InternetAddress(arr[i]);
}
message.setRecipients(Message.RecipientType.TO, address);
}
}
// 后面的BodyPart将加入到此处创建的Multipart中
Multipart mp = new MimeMultipart();
// 附件操作
if (filepath != null && filepath.size() > 0) {
for (String filename : filepath) {
MimeBodyPart mbp = new MimeBodyPart();
// 得到数据源
FileDataSource fds = new FileDataSource(filename);
// 得到附件本身并至入BodyPart
mbp.setDataHandler(new DataHandler(fds));
// 得到文件名同样至入BodyPart
mbp.setFileName(fds.getName());
mp.addBodyPart(mbp);
}
MimeBodyPart mbp = new MimeBodyPart();
mbp.setText(mimeDTO.getText());
mp.addBodyPart(mbp);
// 移走集合中的所有元素
filepath.clear();
// Multipart加入到信件
message.setContent(mp);
} else {
// 设置邮件正文
// message.setText(mimeDTO.getText());
message.setContent(mimeDTO.getText(),"text/html;charset=UTF-8");
}
message.setSubject(mimeDTO.getSubject());
message.saveChanges();
} catch (MessagingException e) {
e.printStackTrace();
}
return message;
}
}
package com.mail.util;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:59
*/
public class PopupAuthenticator extends Authenticator {
private String username = null;
private String password = null;
public PopupAuthenticator(String user, String pass) {
this.username = user;
this.password = pass;
}
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
}
package com.mail.util;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @Description:
* @Author: Yourheart
* @Create: 2023/1/29 10:59
*/
public class SMTPUtil {
/**
* 方法名: SimpleMailSender 功能描述: TODO 简单的smtp生成,大部分是有用的,建议自己建立smtp库....
*
* @param: @param userName
* @param: @return
* @return: String
*/
public static String simpleMailSender(String userName) {
return "smtp." + getHost(userName);
}
/**
* @Title: getSMTPAddress @Description: TODO (这里用一句话描述这个方法的作用) @param @param
* userName @param @return 设定文件 @return String 返回类型 @throws
*/
public static String getSMTPAddress(String userName) {
String smtpAddress = null;
Properties props = new Properties();
try {
//InputStream in = SMTPUtil.class.getResourceAsStream("/mail.properties");
InputStream in = SMTPUtil.class.getResourceAsStream("application.properties");
props.load(in);
// 读取properties的内容
smtpAddress = props.getProperty(getHost(userName).trim());
// 没有获取到
if (smtpAddress == null) {
// 生成简单得
smtpAddress = simpleMailSender(userName);
}
} catch (IOException e) {
e.printStackTrace();
}
return smtpAddress;
}
/**
* @Title: getHost @Description: TODO 得到 邮箱@后面得字符 @param @param
* userName @param @return 设定文件 @return String 返回类型 @throws
*/
public static String getHost(String userName) {
return userName.split("@")[1];
}
}
package com.mail;
import com.mail.entity.MimeMessageDTO;
import com.mail.service.SendMailsService;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Date;
import static org.junit.Assert.*;
@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class MailApplicationTest {
@Autowired
private SendMailsService sendMailsService;
@Test
public void main() {
StringBuilder stringBuilders = new StringBuilder();
stringBuilders.append("345@163.com");
MimeMessageDTO mimeDTO = new MimeMessageDTO();
mimeDTO.setSentDate(new Date());
mimeDTO.setTargetAddress(stringBuilders.toString());
mimeDTO.setSubject("测试邮件");
mimeDTO.setText("干嘛呢");
sendMailsService.sendMail(mimeDTO);
}
}
以上就是javax.mail实现邮件发送的全部代码部分
浙公网安备 33010602011771号