欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java简单的发送邮件

程序员文章站 2022-07-08 12:14:48
...

准备工作

由于我这里主要用的是用QQ发送,所以你得到你的邮箱的专属授权码和打开POP3/SMTP服务

进入自己的qq邮箱,找到设置,然后点账户设置
Java简单的发送邮件
打开下面的第一个
Java简单的发送邮件
复制自己的授权码到一个地方,等会要用的

因为我这里都是用的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种形式的项目文件结构
Java简单的发送邮件

准备工作搞完了

发送纯文本

因为发送纯文本的比较简单,我就直接贴代码了,不用记住,用的时候过来看就行

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项目的结构目录
Java简单的发送邮件

  • 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>
		&nbsp;&nbsp;密码:&nbsp;<input type="password" name="password" required="required" placeholder="请输入密码"><br>
		&nbsp;&nbsp;邮箱:&nbsp;<input type="email" name="email" required="required" placeholder="请输入邮箱"><br><br>
		&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
		<input type="submit" value="注册">&nbsp;&nbsp;&nbsp;<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种不同实现方式,往后我会发布用框架实现邮件发送,代码更加精简

或许在以后的学习中用不到这些底层的东西了吧,写个博客留个记录