Java简单的发送邮件
程序员文章站
2022-07-08 12:14:48
...
java邮件发送
准备工作
由于我这里主要用的是用QQ发送,所以你得到你的邮箱的专属授权码和打开POP3/SMTP服务
进入自己的qq邮箱,找到设置,然后点账户设置
打开下面的第一个
复制自己的授权码到一个地方,等会要用的
因为我这里都是用的maven项目做的,所以也要导入相应的依赖,普通项目导入jar包就行,前3个都是用的一个项目
- mail-1.4.7.jar
- activation-1.1.1.jar
在pom.xml文件中导入相应的依赖
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
下面是我前3种形式的项目文件结构
准备工作搞完了
发送纯文本
因为发送纯文本的比较简单,我就直接贴代码了,不用记住,用的时候过来看就行
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.sun.mail.util.MailSSLSocketFactory;
//发送一封简单的邮件(只含文本内容)
public class MailSend {
public static void main(String[] args) throws Exception {
// 这里展示单纯的文本类邮件发送
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //根据不同的邮箱来的,这里是QQ邮箱的主机名
prop.setProperty("mail.transport.protocol", "smtp");//连接协议
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上下面的代码就可以了
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true"); // 设置是否使用ssl安全连接
prop.put("mail.smtp.ssl.socketFactory", sf);
/*
* 使用JavaMail发送邮件的5个步骤
*/
// 1.创建定义整个应用程序所需要的环境信息的Session
// 这个是QQ邮箱才有的,其他邮箱可以不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
// 发件人邮件用户名、授权码
return new PasswordAuthentication("自己的qq邮箱", "自己的授权码");
}
});
// 开启Session的debug模式,(可以不开),开启的话就可以查看到程序发送Email的运行状态
// 就是说,在你的控制台里面会输出一些信息
session.setDebug(true);
// 2、通过session得到transport对象
Transport ts = session.getTransport();
// 3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "自己的qq邮箱", "自己的授权码");
// 4、创建邮件
// 创建邮件对象(需要传递Session)
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
message.setFrom(new InternetAddress("自己的qq邮箱"));
// 指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的qq邮箱"));
// 邮件的标题
message.setSubject("只含文本的邮件");
// 邮件的文本内容
message.setContent("<h1>你好啊!</h1>", "text/html;charset=UTF-8");
message.saveChanges();//保存修改
// 5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭连接
ts.close();
}
}
发送文本带图片
这个和上面的基本一样,只有发送内容不同
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import com.sun.mail.util.MailSSLSocketFactory;
public class SendMailWithImg {
public static void main(String[] args) throws Exception {
// 这里展示带图片的邮件发送
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
// 使用JavaMail发送邮件的5个步骤
// 1.创建定义整个应用程序所需要的环境信息的Session
// 这个也是QQ才有的,其他邮箱可以不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
// 发件人邮件用户名、授权码
return new PasswordAuthentication("自己的qq邮箱", "自己的授权码");
}
});
// 开启Session的debug模式,(可以不开)这样就可以查看到程序发送Email的运行状态
// 就是说在你的控制台里面会输出一些信息
session.setDebug(true);
// 2、通过session得到transport对象
Transport ts = session.getTransport();
// 3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "自己的qq邮箱", "自己的授权码");
// 4、创建邮件
// 创建邮件对象(需要传递Session)
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
message.setFrom(new InternetAddress("自己的qq邮箱"));
// 指明邮件的收件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的qq邮箱"));
// 邮件的标题
message.setSubject("含图片的邮件");
// 准备图片数据
// MimeBodyPart代表一块一块的资源内容
MimeBodyPart image = new MimeBodyPart();
// 图片需要经过数处理,DataHandler,不然会乱码
DataHandler dh = new DataHandler(new FileDataSource("target/classes/表白图片1.jpg"));
// 在我们的Body中放入这个图片处理数据
image.setDataHandler(dh);
// 给图片设置一个ID,我们后面可以使用,就是下面的src里面可以直接用
image.setContentID("x.jpg");
// 准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封带图片<img src='cid:x.jpg'>的邮件", "text/html;charset=UTF-8");
// 数据描述关系
// 用MimeMultipart封装前面的一块一块的内容
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
// 设置到消息中,保存修改
message.setContent(mm);
message.saveChanges();
// 5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
// 关闭连接
ts.close();
}
}
发送文本带图片及附件
这个稍为复杂一丢丢,我把那个文件内容的步骤写成了一个方法,其他位置还是一摸一样的
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import com.sun.mail.util.MailSSLSocketFactory;
public class SendMailWithOther {
public static void main(String[] args) throws Exception {
// 这里展示文本,图片,附件的邮件发送
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com");
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上以下代码即可
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
// 使用JavaMail发送邮件的5个步骤
// 1.创建定义整个应用程序所需要的环境信息的Session
// 这个也是QQ才有的,其他邮箱可以不用
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
// 发件人邮件用户名、授权码
return new PasswordAuthentication("自己的qq邮箱", "自己的授权码");
}
});
// 开启Session的debug模式,(可以不开)这样就可以查看到程序发送Email的运行状态
// 就是说在你的控制台里面会输出一些信息
session.setDebug(true);
// 2、通过session得到transport对象
Transport ts = session.getTransport();
// 3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com", "自己的qq邮箱", "自己的授权码");
// 4. 连接上之后我们需要发送邮件
MimeMessage mimeMessage = imageMail(session);
// 5、发送邮件
ts.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
// 6.关闭连接
ts.close();
}
private static MimeMessage imageMail(Session session) throws AddressException, MessagingException {
// 消息的固定信息
MimeMessage message = new MimeMessage(session);
// 指明邮件的发件人
message.setFrom(new InternetAddress("自己的qq邮箱"));
// 指明邮件的收件人,可以同时发送很多人,这里我们就发给自己
message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人的qq邮箱"));
// 邮件的标题
message.setSubject("我也不知道要发送什么给你了 ");
/*
* 编写邮件内容 图片 附件 文本
*/
// 图片
MimeBodyPart body1 = new MimeBodyPart();
// 图片需要经过数处理,DataHandler,不然会乱码
DataHandler dh = new DataHandler(new FileDataSource("target/classes/表白图片1.jpg"));
// 在我们的Body中放入这个图片处理数据
body1.setDataHandler(dh);
// 给图片设置一个ID,我们后面可以使用,就是下面的src里面可以直接用
body1.setContentID("x.jpg");
// 文本
MimeBodyPart body2 = new MimeBodyPart();
body2.setContent("这是一封带图片<img src='cid:x.jpg'>的邮件", "text/html;charset=UTF-8");
// 附件
MimeBodyPart body3 = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("target/classes/db.properties"));
body3.setDataHandler(dh2);
body3.setFileName("db.properties");// 给附件设置名字,可以随便取
MimeBodyPart body4 = new MimeBodyPart();
DataHandler dh3 = new DataHandler(new FileDataSource("target/classes/xxx.txt"));
body4.setDataHandler(dh3);
body4.setFileName("db.xxx.txt");// 给附件设置名字,可以随便取
// 拼装邮件正文内容 下面的拼装可以根据自己的喜好来吧
MimeMultipart multipart1 = new MimeMultipart();
multipart1.addBodyPart(body1);
multipart1.addBodyPart(body2);
multipart1.setSubType("related"); // 文本和图片内嵌
// new MimeBodyPart().setContent(multipart1); //将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(multipart1);
// 拼接附件
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(body3); // 附件
allFile.addBodyPart(body4); // 附件
allFile.addBodyPart(contentText);// 正文
allFile.setSubType("mixed"); // 正文和附件都存在邮件中,所有类型设置为mixed;
// 放到Message消息中
message.setContent(allFile);
message.saveChanges();// 保存修改
return message;
}
}
用JavaWeb实现网页注册成功给用户发送邮件
这个maven项目的结构目录
- web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>WebToSendMail</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<description></description>
<display-name>RegisterServlet</display-name>
<servlet-name>RegisterServlet</servlet-name>
<servlet-class>servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>RegisterServlet</servlet-name>
<url-pattern>/RegisterServlet.do</url-pattern>
</servlet-mapping>
</web-app>
- pom.xml
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!--自动生成实体类的get set 有参构造 无参构造/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
-
首页 index.jsp
注册页面有点随便,哈哈
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/RegisterServlet.do" method="post">
用户名:<input type="text" name="username" required="required" placeholder="请输入用户名"> <br>
密码: <input type="password" name="password" required="required" placeholder="请输入密码"><br>
邮箱: <input type="email" name="email" required="required" placeholder="请输入邮箱"><br><br>
<input type="submit" value="注册"> <input type="reset" value="重置">
</form>
</body>
</html>
- 注册成功后跳转的页面 info.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册成功</title>
</head>
<body>
<!--${}获取注册成功后传来的信息-->
<h1>XXX网站温馨提示:</h1>${message}
</body>
</html>
- User.java
package pojo;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
@Data // 自动生成get和set方法
@AllArgsConstructor // 有参构造
@NoArgsConstructor // 无参构造
public class User implements Serializable{
private String username;
private String password;
private String eamil;
}
- RegisterServlet.java
package servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pojo.User;
import utils.SendMail;
/**
* Servlet implementation class RegisterServlet
*/
//脚手架
public class RegisterServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 接受前端用户的请求,封装成对象
String username = request.getParameter("username");
String password = request.getParameter("password");
String email = request.getParameter("email");
User user = new User(username, password, email);
// 用户注册成功周,给用户发送一封邮件
// 我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况
SendMail send = new SendMail(user);
// 启动线程,线程启动后就会自动执行run方法来发送邮件
new Thread(send).start();
// 注册用户
request.setAttribute("message", "注册成功,我们已经给您发送了一封带了注册幸喜的电子邮件,注意查收!!!");
request.getRequestDispatcher("info.jsp").forward(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
- SendMail.java
package utils;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.sun.mail.util.MailSSLSocketFactory;
import pojo.User;
//用户体验
//多线程实现用户体验! 异步处理
public class SendMail implements Runnable {
// 用于给用户发送邮件的邮箱
private String from = "自己的qq邮箱";
// 用于给用户发送邮件的用户名
private String username = "自己起个用户名吧";
// 用于给用户发送邮件的邮箱密码(授权码)
private String password = "自己的授权码";
// 发送邮件的服务器地址,这里是QQ
private String host = "smtp.qq.com";
private User user;
public SendMail(User user) {
this.user = user;
}
// 重写run方法的实现,在run方法中发送邮件给指定的用户
@Override
public void run() {
try {
Properties prop = new Properties();
prop.setProperty("mail.host", host);
prop.setProperty("mail.transport.protocol", "smtp");
prop.setProperty("mail.smtp.auth", "true");
// 关于QQ邮箱,还要设置SSL加密,加上下面的代码就可以了
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true"); // 设置是否使用ssl安全连接
prop.put("mail.smtp.ssl.socketFactory", sf);
// 1.创建定义整个应用程序所需要的环境信息的Session
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication() {
// 发件人邮件用户名、授权码
return new PasswordAuthentication("自己的qq邮箱", "自己的授权码");
}
});
// 开启Session的debug模式,(可以不开),开启的话就可以查看到程序发送Email的运行状态
// 就是说,在你的控制台里面会输出一些信息
session.setDebug(true);
// 2、通过session得到transport对象
Transport ts = session.getTransport();
// 3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect(host, username, password);
// 4、创建邮件
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress(from));// 邮件的发件人
message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEamil()));// 邮件的收件人
message.setSubject("XX网站用户注册");// 邮件的标题
String info = "恭喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword()
+ ".<hr>请妥善保管,如有问题,请自行解决!!";// 要发的文本信息
message.setContent(info, "text/html;charset=utf-8");// 邮件的文本内容打包
message.saveChanges();//保存修改
// 5、发送邮件
ts.sendMessage(message, message.getAllRecipients());
ts.close();// 关闭资源
} catch (GeneralSecurityException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
以上就是用java实现简单的邮件发送的4种不同实现方式,往后我会发布用框架实现邮件发送,代码更加精简
或许在以后的学习中用不到这些底层的东西了吧,写个博客留个记录
下一篇: Jmeter操作3 关联