使用Java发送邮件(JavaMail的使用)

邮箱相关的概念

邮件收发协议

发送邮件协议:SMTP(简单邮件传输协议)
接收邮件协议:①IMAP(Internet邮件访问协议)②POP3 (邮局协议版本3)

接收邮件协议IMAP和POP有什么区别?
POP协议允许电子邮件客户端下载服务器上的邮件,但是在电子邮件客户端的操作(如:移动邮件、标记已读等),不会反馈到服务器上。
IMAP协议允许电子邮件客户端下载服务器上的邮件,电子邮件客户端的操作都会反馈到服务器上,也就是说,IMAP是“双向”的。

邮件客户端

网页版:使用浏览器登录邮件进行邮件收发
软件版(邮箱可以长时间保持在线状态,随时收发邮件):QQ邮箱,outlook等。

邮件服务器

邮件服务器:提供邮件收发服务的服务器,包括邮件发送服务器和邮件接收服务器。
邮箱服务器的域名:163邮箱的后缀为163.com,QQ的为qq.com,这个就是域名

网易邮箱(163邮箱)发送/接收邮件服务器地址:

  • SMTP服务器: smtp.163.com
  • POP3服务器: pop.163.com
  • IMAP服务器: imap.163.com

QQ邮箱发送/接收邮件服务器地址:

  • SMTP服务器(端口465或587):smtp.qq.com

  • POP3服务器(端口995):pop.qq.com

    QQ邮箱帮助中心

邮件收发简要过程

在这里插入图片描述

有的邮箱客户端,可能要我们自己去收信,请求收件服务器得到邮件。
在这里插入图片描述在这里插入图片描述

使用Java发送邮件(JavaMail的使用)

1.jar包相关

Oracle技术网/Java/ javamail

JavaMail参考实现及jar包下载
在这里插入图片描述

2.使用案例

这里使用一个找的封装了发送邮件的工具类MailUtils测试,使用第三方邮件客户端,即写的java程序,以QQ邮箱账号发送邮件,在网易的网页版客户端接收这封邮件。
在这里插入图片描述

  • 发送邮件工具类MailUtils
/**
 * 发送邮件工具类
 */
public final class MailUtils {
	private MailUtils(){}
	/**
	 * 发送邮件
	 * @param email 收件人的邮箱地址
	 * @param subject 邮件主题
	 * @param emailMsg 邮件内容
	 */
	public static void sendMail(String email, String subject, String emailMsg)
			throws AddressException, MessagingException {
		// 1.[连接发件服务器]创建一个程序与发件人的 发送邮件服务器会话对象 Session
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "SMTP");//邮件发送协议
		props.setProperty("mail.host", "smtp.qq.com");//邮件发送服务器的地址(如QQ邮箱的发件服务器地址SMTP服务器: smtp.qq.com)
		props.setProperty("mail.smtp.auth", "true");//指定验证为true

		// 创建验证器
		Authenticator auth = new Authenticator() {
			public PasswordAuthentication getPasswordAuthentication() {
				//发件人的用户名(不带后缀的,如QQ邮箱的@qq.com不用写)和授权码(这里一般不使用密码,为避免密码泄露,用授权码代替密码登录第三方邮件客户端)
				//授权码:用于登录第三方邮件客户端的专用密码。  第三方邮件客户端:如这个java程序。
				return new PasswordAuthentication("QQ邮箱地址不带@qq.com", "开启POP3/SMTP服务得到的授权码");
			}
		};

		Session session = Session.getInstance(props, auth);

		
		// 2.[创建一封邮件]创建一个Message,它相当于是邮件内容
		Message message = new MimeMessage(session);
		message.setFrom(new InternetAddress("创建验证器时你用的用户名@qq.com")); // 设置发送者的邮箱地址
		message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 设置发送方式与接收者
		message.setSubject(subject);//邮件主题
		message.setContent(emailMsg, "text/html;charset=utf-8");//设置邮件的内容

		// 3.[发送邮件]创建 Transport用于将邮件发送
		Transport.send(message);
	}
}
  • 测试类MailTest
public class MailTest {
   @Test
    public void test1(){
       try {
       /**
		 * @param email 收件人的邮箱地址
	 	 * @param subject 邮件主题
	 	 * @param emailMsg 邮件内容
	 	*/
           MailUtils.sendMail("网易邮箱地址@163.com","欢迎回来","哈喽");
       } catch (Exception e) {
           e.printStackTrace();
       }
   }
}

运行后在网易的网页版客户端接收的邮件:
在这里插入图片描述

3.使用案例中相关说明

授权码说明:

QQ邮箱获取授权码

网易邮箱获取授权码:
在这里插入图片描述

在这里插入图片描述

案例:简易的定时发送生日邮件功能(Listener+定时器+使用java发送邮件)

发布了48 篇原创文章 · 获赞 18 · 访问量 2945

猜你喜欢

转载自blog.csdn.net/qq_45615417/article/details/104457838