Java邮件传输(QQ邮箱)实现

邮件传输

(若要实战,javaweb/SSM直接查看第5点,spring boot直接查看第6点)

邮件收发原理

在这里插入图片描述

1.A通过SMTP协议链接到SMTP服务器,然后发送一封邮件给网易邮件服务器
2.网易分析发现需要去QQ的邮件服务器,通过SMTP协议将邮件转投给QQ的SMTP服务器
3.QQ将接收到的邮件存储在xxx@qq.com这个邮件账号的控件中
4.B通过Pop3协议连接到Pop3服务器收取邮件
5.从xxx@qq.com这个邮件账号的空间中取出邮件
6.Pop3服务器将取出来的邮件送到B用户手中

【注意】有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试

用Java发送E-mail十分简单,首先需要准备JavaMail API和Java Activation Framework

得到两个jar或者maven依赖

  • mail.jar

  • activation,jar

 <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>

JavaMail 是sun公司为方便Java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如SMTP,POP3,IMAP还有MIME等。

我们在编写程序时,记住四个核心类,就很容易编写出Java邮件处理程序。

在这里插入图片描述

简单邮件:没有附件和图片,纯文本邮件
复杂邮件:有附件和图片
要发送邮件需要获得协议和支持!开启POP3/SMTP

开发前准备-QQ邮箱

1.开启服务

在这里插入图片描述

2.完成相关验证得到授权码

在这里插入图片描述

3.Java代码实现(只能发送简单邮件-只传输文本,不能发送带附件的邮件)

/**
 * @author B0
 * @create 2022 10 05 9:40
 * @description
 */
public class MailDemo {
    public static void main(String[] args) throws Exception {
        //封装配置信息
        Properties properties = new Properties();//实例化配置文件,也可以在外面写xxx.properties文件再引入配置
        properties.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器
        properties.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户名密码

        //关于QQ邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",sf);

        //使用JavaMail发送邮件的5个步骤
            //QQ才有!其他邮箱就不用

        //1.创建定义整个应用程序所需的环境信息的Session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名、授权码
                return new PasswordAuthentication("自己QQ邮箱@qq.com", "此处修改为自己的授权码");
            }
        });
        //开启session的debug模式,这样就可以查看程序发送Email的运行状态
        //session.setDebug(true);
        //2.通过session得到transport对象
        Transport ts = session.getTransport();
        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","自己QQ邮箱@qq.com"","此处修改为自己的授权码");
        //4.创建邮件:写邮件
            //注意需要传递session
        MimeMessage message = new MimeMessage(session);
        //指明邮件发件人
        message.setFrom(new InternetAddress("自己QQ邮箱@qq.com""));
        //指明邮件的收件人,现在的发件人和收件人是一样,就是给自己发邮件
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("目标QQ邮箱@qq.com""));
       //邮件的标题
        message.setSubject("此处自定义标题");
        //邮件的文本内容,第二个参数代表前面文本支持html标签,字符编码为utf-8
        message.setContent("<h1 style='color:red'>你好啊!</h1>","text/html;charset=UTF-8");
        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();
    }
}
MIME(多用途互联网邮件拓展类型)

多用途互联网邮件扩展,它是一个互联网标准,在1992年最早应用于电子邮件系统,但后来也应用到浏览器服务器会将它们发送的多媒体数据的类型告诉浏览器,而通知手段就是说明该多媒体数据的MIME类型,从而让浏览器知道接收到的信息哪些是MP3文件,哪些是Shockwave文件等等。

MimeBodyPart类

javax.mail.internet.MimeBodyPart类表示的时一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。

MimeMultipart类

javax.mail.internet.MimeMultipart;是抽象类Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
在这里插入图片描述

4.Java代码实现(复杂邮件内容-文本加图片)

public class MailDemo {
    public static void main(String[] args) throws Exception {
        //封装配置信息
        Properties properties = new Properties();//实例化配置文件,也可以在外面写xxx.properties文件再引入
        properties.setProperty("mail.host","smtp.qq.com");//设置QQ邮件服务器
        properties.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
        properties.setProperty("mail.smtp.auth","true");//需要验证用户名密码

        //关于QQ邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",sf);

        //使用JavaMail发送邮件的5个步骤
            //QQ才有!其他邮箱就不用

        //1.创建定义整个应用程序所需的环境信息的Session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名、授权码
                return new PasswordAuthentication("自己QQ邮箱@qq.com"", "自己授权码");
            }
        });
        //开启session的debug模式,这样就可以查看程序发送Email的运行状态
        session.setDebug(true);
        //2.通过session得到transport对象
        Transport ts = session.getTransport();
        //3.使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","自己QQ邮箱@qq.com"","自己授权码");
        //4.创建邮件:写邮件
            //注意需要传递session
        MimeMessage message = new MimeMessage(session);
        //指明邮件发件人
        message.setFrom(new InternetAddress("自己QQ邮箱@qq.com""));
        //指明邮件的收件人,现在的发件人和收件人是一样,就是给自己发邮件
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("目标QQ邮箱"));
       //邮件的标题
        message.setSubject("此处自定义标题");
        //邮件的内容
        //==================================================
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理...DataHandler:使用数据处理器处理图片
        DataHandler dh = new DataHandler(new FileDataSource("图片绝对地址"));
        image.setDataHandler(dh);//在我们的Body中放入这个处理的图片数据
        image.setContentID("bz.png");//给图片设置ID(随意设置),我们在后面可以使用!
        //准备正文数据
        MimeBodyPart text = new MimeBodyPart();
        //此处cid对应上面setContentID设置的id属性
        text.setContent("这是一封邮件正文带图片<img src='cid:bz.png'>的邮件","text/html;charset=UTF-8");
        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");//mixed
        //设置到消息中保存修改
        message.setContent(mm);//把最后编辑好的邮件放到消息中
        message.saveChanges();//保存
        //==================================================
        //message.setContent("<h1 style='color:red'>hello!</h1>","text/html;charset=UTF-8");
        //5.发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //6.关闭连接
        ts.close();
    }
}

5.Java代码实现(发送用户注册信息或验证码)

5.1.邮件工具类编写(使用线程)
public class SendEmail extends Thread{
    //用于给用户发送邮件的邮箱
    private String from = "xxx@qq.com";
    //邮箱的用户名
    private String username = "xxx@qq.com";
    //邮箱的密码(自己的授权码)
    private String password = "授权码";
    //发送邮件的服务器地址
    private String host = "smtp.qq.com";
    private User user;
    public SendEmail(User user){
        this.user = user;
    }
    //重写run方法的,在线程中发送邮件给指定的用户
    @Override
    public void run() {
        try {
            //封装配置信息
            Properties properties = new Properties();//实例化配置文件,也可以在外面写xxx.properties文件再引入配置
            properties.setProperty("mail.host",host);//设置QQ邮件服务器
            properties.setProperty("mail.transport.protocol","smtp");//设置邮件发送协议
            properties.setProperty("mail.smtp.auth","true");//需要验证用户名密码

            //关于QQ邮箱,还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable","true");
            properties.put("mail.smtp.ssl.socketFactory",sf);

            //使用JavaMail发送邮件的5个步骤
            //QQ才有!其他邮箱就不用

            //1.创建定义整个应用程序所需的环境信息的Session对象
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication(username, password);
                }
            });
            //开启session的debug模式,这样就可以查看程序发送Email的运行状态
            //session.setDebug(true);
            //2.通过session得到transport对象
            Transport ts = session.getTransport();
            //3.使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host,username,password);
            //4.创建邮件:写邮件
            //注意需要传递session
            MimeMessage message = new MimeMessage(session);
            //指明邮件发件人
            message.setFrom(new InternetAddress(from));
            //指明邮件的收件人,现在的发件人和收件人是一样,就是给自己发邮件
            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");
            //5.发送邮件
            ts.sendMessage(message,message.getAllRecipients());
            //6.关闭连接
            ts.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
5.2.servlet调用
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //设置字符编码
    resp.setContentType("text/html;charset=utf-8");
    //接收用户请求,封装成对象
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String email = req.getParameter("email");
    User user = new User(username, password, email);
    //用户注册成功之后,给用户发送一封邮件
    //我们使用线程来专门发送邮件,防止出现耗时,和网站注册人数过多的情况
    SendEmail send = new SendEmail(user);
    //启动线程,线程启动之后就会执行run方法发送邮件
    send.start();
    //注册用户
    req.setAttribute("message","注册成功,已经发送一封注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到!!");
    //请求转发到info.jsp页面
    req.getRequestDispatcher("info.jsp").forward(req,resp);
}

6.spring boot代码实现

6.1加入邮件传输依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
6.2 properties配置文件编写
#邮件邮箱
spring.mail.username=自己邮箱@qq.com
#邮箱授权码
spring.mail.password=自己授权码
#配置主机
spring.mail.host=smtp.qq.com
#配置安全连接
spring.mail.properties.mail.smtp.ssl.enable = true
6.3发送邮件类实现——方式一

进入初始化的test目录找到应用入口编写以下代码

@Autowired
JavaMailSenderImpl mailSender;
@Test
void contextLoads() {
    //发送邮件
    //收件人
    //内容
    SimpleMailMessage message = new SimpleMailMessage();//封装简单消息
    //设置主题
    message.setSubject("验证码");
    //设置内容
    message.setText("Hello");
    //设置发送者邮箱
    message.setFrom("xxx@qq.com");
    //设置目标邮箱
    message.setTo("zzz@qq.com");
    mailSender.send(message);

}
6.4 发送邮件类实现——方式二
    @Autowired
    JavaMailSenderImpl mailSender;
	@Test
    public void test2() throws Exception {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //使用消息发送帮助器发送消息
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
        helper.setSubject("验证码");
        helper.setText("Hello",true);//true参数代表前面的内容支持html
        //发送邮件时加单个附件,加多个附件多使用几个addAttachment方法
        helper.addAttachment("1.png",new File("D:\\DevTools\\JetBrains\\Project\\Java\\demo\\src\\main\\resources\\static\\1.png"));
//        helper.addAttachment("2.jpg",new File(""));
//        helper.addAttachment("3.jpg",new File(""));
        helper.setFrom("xxx@qq.com");
        helper.setTo("zzz@qq.com");
        mailSender.send(mimeMessage);
    }

资料来源:B站UP--遇见狂神说、百度文库
  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值