邮件发送学习笔记~


一、邮件发送介绍

  • 要在网络上实现邮件功能,必须要有专门的邮件服务器!

  • 这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中!

  • 传输协议

    • SMTP协议:发送邮件

      • 把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)
    • POP3:接收邮件
      • 把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)
  • 邮件发送准备工作:

    • JavaMail API
    • JavaActivation Framework
    • mail.jar(maven仓库下载即可)
    • activation.jar(maven仓库下载即可)
  • 主要有四个核心类:


二、正戏开始

1、在空项目下新建模块(mail-java),下面建个lib目录,把两个jar包拉进去,Add as Library

2、登录qq邮箱,进入设置–>帐户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务



1、简单邮件发送

package com.xiao;import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;//发送一封简单的邮件(纯文本)
public class MailDemo01 {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.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);//5个步骤//1、创建定义整个应用程序所需的环境信息的Session信息//下面这个QQ才有!!Session session = Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("2675295641@qq.com", "授权码");}});//开启Session的debug模式,可以看到程序发送Email的运行状态session.setDebug(true);//2、通过Session得到transport对象Transport ts = session.getTransport();//3、使用邮箱的用户名和授权码  连接邮件服务器ts.connect("smtp.qq.com","2675295641@qq.com","授权码");//4、创建邮件:写邮件(需要传递Session)MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress("2675295641@qq.com")); //发件人message.setRecipient(Message.RecipientType.TO,new InternetAddress("15007590860@163.com")); //收件人message.setSubject("只包含文本的简单邮件");  //邮件主题message.setContent("<h1 style='color:red'>你好啊!</h1>","text/html;charset=UTF-8");//5、发送邮件ts.sendMessage(message,message.getAllRecipients());//关闭ts.close();}
}

2、带图片+附件–邮件发送


package com.xiao;import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;//嵌入图片的邮件
public class MailDemo02 {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.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);//5个步骤//1、创建定义整个应用程序所需的环境信息的Session信息//下面这个QQ才有!!Session session = Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("2675295641@qq.com", "授权码");}});//开启Session的debug模式,可以看到程序发送Email的运行状态session.setDebug(true);//2、通过Session得到transport对象Transport ts = session.getTransport();//3、使用邮箱的用户名和授权码  连接邮件服务器ts.connect("smtp.qq.com", "2675295641@qq.com", "授权码");//4、创建邮件:写邮件(需要传递Session)MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress("2675295641@qq.com")); //发件人message.setRecipient(Message.RecipientType.TO, new InternetAddress("15007590860@163.com")); //收件人message.setSubject("只包含文本的简单邮件");  //邮件主题//===============复杂邮件内容============//图片数据MimeBodyPart image = new MimeBodyPart();//图片需要经过数据处理...  DataHandler:数据处理DataHandler dh = new DataHandler(new FileDataSource("F:\\IDEA_2020.2\\xxe_Projects\\JavaWeb\\upload-files\\mail-java\\src\\1.jpg"));image.setDataHandler(dh);  //在我们的Body主题中放入这个处理的图片数据image.setContentID("1.jpg");  //给图片设置一个ID,我们在后面可以使用!//准备正文数据MimeBodyPart text = new MimeBodyPart();//cid:通过cid:引用图片text.setContent("这是一封正文带图片<img src='cid:1.jpg'>的邮件","text/html;charset=UTF-8");//准备附件MimeBodyPart body3 = new MimeBodyPart();body3.setDataHandler(new DataHandler(new FileDataSource("F:\\IDEA_2020.2\\xxe_Projects\\JavaWeb\\upload-files\\mail-java\\src\\1.docx")));body3.setFileName("file1.docx");  //设置附件名字//描述数据关系MimeMultipart mm = new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.addBodyPart(body3);mm.setSubType("mixed");//设置到消息中,保存修改message.setContent(mm);  //把最后编辑好的邮件放到消息中message.saveChanges();   //保存修改//===============复杂邮件内容============//5、发送邮件ts.sendMessage(message, message.getAllRecipients());//关闭ts.close();}
}


3、JavaWeb发送邮件

空项目中新建模块(Web-Mail),建的是Maven普通项目,再添加web支持,模块结构如下:

<%--index.jsp--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>注册</title>
</head>
<body><%--通过表单上传文件get:上传文件大小有限制post:无限制--%><form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">用户名:<input type="text" name="username"><br/>密&nbsp;码:<input type="password" name="password"><br/>邮&nbsp;箱:<input type=email name="email"><br/><input type="submit" value="注册"></form>
</body>
</html>
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>4.0.1</version>
</dependency>
<%--info.jsp--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Success</title>
</head>
<body><h1>xxx网站温馨提示</h1>
${message}</body>
</html>
package com.xiao.pojo;import java.io.Serializable;//User实体类
public class User implements Serializable {private String username;private String password;private String email;public User() { }public User(String username, String password, String email) {this.username = username;this.password = password;this.email = email;}public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getPassword() { return password; }public void setPassword(String password) { this.password = password; }public String getEmail() { return email; }public void setEmail(String email) { this.email = email; }@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", email='" + email + '\'' +'}';}
}
package com.xiao.utils;import com.sun.mail.util.MailSSLSocketFactory;
import com.xiao.pojo.User;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;//工具类
//多线程实现用户体验!异步处理
public class SendMail extends Thread {private String from="2675295641@qq.com"; //发件人private String username="2675295641@qq.com"; //用户名private  String password="授权码";  //邮箱的密码private String host="smtp.qq.com"; //发送邮件的服务器地址private User user;public  SendMail(User user){this.user=user;}//重写run方法,在其中发送邮件给指定用户@Overridepublic void run() {try{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.enable", "true");prop.put("mail.smtp.ssl.socketFactory", sf);//1、创建定义整个应用程序所需的环境信息的Session信息//下面这个QQ才有!!Session session = Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("2675295641@qq.com", "授权码");}});//开启Session的debug模式,可以看到程序发送Email的运行状态session.setDebug(true);//2、通过Session得到transport对象Transport ts = session.getTransport();//3、使用邮箱的用户名和授权码  连接邮件服务器ts.connect("smtp.qq.com", "2675295641@qq.com", "授权码");//4、创建邮件:写邮件(需要传递Session)MimeMessage message = new MimeMessage(session);message.setFrom(new InternetAddress("2675295641@qq.com")); //发件人message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人message.setSubject("用户注册邮件");  //邮件主题String info="恭喜您注册成功,您的用户名:"+user.getUsername()+",您的密码:"+user.getPassword()+",请妥善报关,如有问题请联系网站客服!";message.setContent(info,"text/html;charset=UTF-8");message.saveChanges();//5、发送邮件ts.sendMessage(message, message.getAllRecipients());//关闭ts.close();} catch (Exception e) {e.printStackTrace();}}
}
package com.xiao.servlet;import com.xiao.pojo.User;
import com.xiao.utils.SendMail;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;// RegisterServlet
public class RegisterServlet extends HttpServlet {protected void doPost(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方法发送邮件send.start();//这里写run()的话,得等邮件发送完了才跳转,用户体验贼差!!//注册用户request.setAttribute("message","注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!");request.getRequestDispatcher("info.jsp").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { }
}
<!--web.xml中注册servlet-->
<servlet><servlet-name>RegisterServlet</servlet-name><servlet-class>com.xiao.servlet.RegisterServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>RegisterServlet</servlet-name><url-pattern>/RegisterServlet.do</url-pattern>
</servlet-mapping>

多线程效果:点击注册就可以跳转到提示页面按,不必等到发送完成才跳转,用户体验良好!


4、Spring 项目发邮件

新建Spring项目,不勾选啥,就要初始的东西就行!(注意加载后进去项目结构,看看Maven用的是不是着自己的版本,可以在默认全局变量改的,改了就一般不会再莫名变成IDEA自带的Maven!)

#application.properties   后面的值千万别加双引号!!!!!我莫名其妙就加了,出错后才发现了...
spring.mail.username=2675295641@qq.com
spring.mail.password=授权码
spring.mail.host=smtp.qq.com
spring.mail.properties.mail.smtp.enable=true
package com.example.demo;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.test.context.junit4.SpringRunner;
import javax.mail.internet.MimeMessage;
import java.io.File;@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class)
//自动配置注解,解决failed to load applicationcontext
@EnableAutoConfiguration(exclude={DataSourceAutoConfiguration.class})
public class DemoApplication {@AutowiredJavaMailSenderImpl mailSender;@Testpublic void contextLoads() {//发送邮件//收件人//内容SimpleMailMessage message = new SimpleMailMessage();message.setSubject("西开Java");message.setText("Hello");message.setFrom("2675295641@qq.com");message.setTo("15007590860@163.com");mailSender.send(message);}//    @Test
//    public void test2() throws Exception {//        MimeMessage mimeMessage = mailSender.createMimeMessage();
//        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
//
//        helper.setSubject("西开Java");
//        helper.setText("<h1>Hello</h1>",true);
//
//        //附件
//        helper.addAttachment("1.jpg",new File(""));
//
//        helper.setFrom("2675295641@qq.com");
//        helper.setTo("15007590860@163.com");
//
//        mailSender.send(mimeMessage);
//    }
}

启动测试,邮件发送成功!!

邮件发送的学习笔记到此结束,主要记录了使用纯Java、JavaWeb,以及Spring项目实现邮件发送的过程~
继续加油!

邮件发送 --- 纯Java、JavaWeb、Spring三种实现方式相关推荐

  1. spring三种注入方式

    设置Spring的作用域 或者使用枚举值设置 单例和多里使用场景 自动注入 @Primary 一个接口有多个实现被spring管理吗,在依赖注入式,spring会不知道注入哪个实现类就会抛出NoUni ...

  2. Java多线程的三种实现方式(重点看Collable接口实现方式)

    1.通过继承Thread类来实现多线程 在继承Thread类之后,一定要重写类的run方法,在run方法中的就是线程执行体,在run方法中,直接使用this可以获取当前线程,直接调用getName() ...

  3. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  4. Spring 三种注入方式

    1.设置注入 先写demo代码 Uer.java public class User {private String username;private String password;public S ...

  5. java支持哪三种注释方式,震撼来袭免费下载!

    One:JVM实践思维图(完整版) Two: 走近Java 概述+ Java技术体系+Java发展史+Java虚拟机家族:(Sun Classic/Exact VM.HotSpot VM.Mobile ...

  6. java下标越界的三种处理方式,数组下标越界,该怎么解决

    数组下标越界 package import_csv; import java.io.BufferedReader; import java.io.FileInputStream; import jav ...

  7. java如何实现定时任务_Java定时任务的三种实现方式

    前言 现代的应用程序早已不是以前的那些由简单的增删改查拼凑而成的程序了,高复杂性早已是标配,而任务的定时调度与执行也是对程序的基本要求了. 很多业务需求的实现都离不开定时任务,例如,每月一号,移动将清 ...

  8. java servlet接口开发_servlet三种实现方式之一实现servlet接口

    servlet有三种实现方式: 1.实现servlet接口 2.继承GenericServlet 3.通过继承HttpServlet开发servlet 第一种示例代码如下(已去掉包名): import ...

  9. JDK/Dubbo/Spring 三种 SPI 机制,谁更好?

    点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...

最新文章

  1. 剑指offer六:旋转数组的最小数字
  2. Nginx服务器之基础学习
  3. #pragma once与 #ifndef的区别 (转)
  4. Java集合之HashSet源码分析
  5. 缓存jQuery对象来提高性能
  6. C++异常处理之terminate函数和set_terminate()函数
  7. 如何用excel计算断色断码_各位小姐姐、小哥哥都是怎么用Excel计算断码率的指标?...
  8. 含指数函数的不定积分方法归纳
  9. 免费域名备案查询接口
  10. 利用人性做大闸蟹,给予客户特殊的身份优越感,思维决定财富!
  11. 网站流量分析的整体思路(大数据)
  12. #2 – Rendering Tiers(WPF渲染级别)
  13. 区块链能否助力版权“突围”?
  14. 《推荐系统实践》 第四章 利用用户标签数据 读书笔记
  15. 群晖网络不通_网络菜鸟入手Synology群晖 DS218+,求问网络安装环境几个问题?
  16. 用阿里云托管服务器怎么托管_云托管就像圣诞老人的4种方式
  17. linux公共基础-初阶
  18. 用 Python 绘制个人足迹地图
  19. 华硕B660重炮手主板核显无法识别硬盘处理方案
  20. OSChina 周日乱弹 —— 我女朋友都放到购物车里都没钱买

热门文章

  1. python模拟键盘输入字符_Python | 根据关键字符串遍历窗口 模拟键盘输入操作
  2. SpringBoot 2 + Spring Security 5 + JWT 的单页应用 Restful 解决方案
  3. python属性和局部变量_python类与对象1
  4. python matplotlib绘制折线图
  5. 服务器可视化_系统管理员不可错过的6款服务器监控工具
  6. android 固定底部导航,如何设置android底部导航栏位置固定在android
  7. wpf指定的元素已经是另一个元素的逻辑子元素。请先将其断开连接。_在60分钟内建立一个无代码应用程序...
  8. python中sorted函数逆序_Python中sorted函数的用法(转)
  9. python 最快 因式分解_python中怎么对一个数进行因式分解?
  10. 计算机组成原理名词解释常用,2018考研408计算机组成原理名词解释(3)