JavaWeb学习——邮件发送

JavaWeb学习——邮件发送

1.邮件发送简介

我们想要实现在网络上邮件发送,就必须有专门的邮件服务器。就像是现实生活中的邮局,负责接受用户递来的邮件,并把邮件送到邮件接受者的邮箱中去。
邮件发送有一个专门的协议叫做SMTP,有了这个协议才能收发邮件。那么一般的邮件服务器地址是smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
电子邮箱的获取需要在邮件服务器上进行申请,比如QQ邮箱。

2.传输协议
  • SMTP协议:邮件发送请求协议
  • POP3协议:邮件接受协议
3.邮件收发原理

在这里插入图片描述

  • ①用户1将邮件发送给QQ服务器
  • ②QQ的SMTP邮件发送服务器将邮件发送给网易的POP3邮件接受服务器
  • ③网易的邮件服务器将接收到的邮件存入用户2的邮件空间内,等待用户读取
  • ④用户2连接到自己的POP3服务器收取邮件
  • ⑤网易的POP3服务器从用户2邮件空间中取出邮件
  • ⑥POP3服务器将邮件取出来给用户2.

注意:现在的邮箱有识别垃圾邮件的功能,如果重复发邮件,多次发送可能会导致收到的邮件直接被邮件服务器放到垃圾箱里去。

4.准备工作

①邮件发送的两个jar包
在这里插入图片描述
在这里插入图片描述
②邮件发送四个核心类

  • Message类:是创建和解析邮件的核心API,他的实例对象代表一封电子邮件。
  • Transport类:是发送邮件的核心类,它的实例对象实现了某个邮件发送协议的邮件发送对象,如:SMTP协议
  • Stroe类:是接收邮件的核心API,它的实力对象代表实现了某个邮件接收的协议的邮件接收对象,如:POP3协议
  • Session类:用于定义整个应用程序所需的环境信息,以及收集客户端与邮件服务器建立网络连接的会话信息,如邮件服务器的主机名,端口号,采用的邮件发送协议和接收协议。Session对象根据这些信息构建用于邮件收发的Transport和Store对象,已经欸客户端创建Message对象时提供信息支持
    在这里插入图片描述

③在QQ邮箱中获取对应的权限
打开QQ邮箱找到邮箱的设置---->账户
在这里插入图片描述
找到服务设置,开启POP3/SMTP服务
在这里插入图片描述
在这里插入图片描述
记住这个授权码
在这里插入图片描述

准备工作好了之后,我们下面就开始准备发送一封简单的邮件

5.使用JavaMail发送一封简单的邮件(发送纯文本)
```
package com.muhan.sendMail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;

public class SendMail {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {

        //第一步:创建配置文件,保存并读取信息
        Properties properties = new Properties();
        //1.设置qq邮件服务器
        properties.setProperty("mail.host","semp.qq.com");
        //2.设置发送协议
        properties.setProperty("mail.transport.protocol","smtp");
        //3.设置用户是否需要验证
        properties.setProperty("mail.stmpt.auth","true");

        //第二步:设置QQ邮箱SSL加密
        //因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要)
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);

        System.out.println("=============准备工作完成===============");

        //第三步:正式开始准备发送邮件
        //1.创建Session会话对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //实现方法,传入发件方的邮箱地址和权限校验码
                return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg");
            }
        });

        //2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了
        session.setDebug(true);

        //3.获取连接对象,通过session对象获取transport对象
        Transport transport = session.getTransport();

        //4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码
        transport.connect("smtp.qq.com","462447812@qq.com","euwawaosjlnobhcg");

        //5.发送邮件(这里为了理清楚逻辑,抽取一个方法调用)
        sendText(session,transport);

        //6.最后关闭连接
        transport.close();
    }

    //发送邮件
    private static void sendText(Session session, Transport transport) throws MessagingException {
        //1.创建邮件对象,传入session
        MimeMessage mimeMessage = new MimeMessage(session);

        //2.设置邮件发送人
        mimeMessage.setFrom(new InternetAddress("462447812@qq.com"));

        //3.设置邮件收件人,可以设置多人,也可以设置自己给自己发(这里我就设置的是自己给自己发)
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));

        //4.设置邮件标题
        mimeMessage.setSubject("Hello 邮件发送");

        //5.设置邮件内容,为防止乱码问题这里参数2将文本类型和字符编码设置
        String msg = "资料已经整理好了,请查收";
        mimeMessage.setContent(msg,"text/html;charset=utf-8");

        //6.发送
        transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
    }
}

```

效果展示:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.发送带图片的邮件

我们要想发送一封带图片的邮件,就得先知道它的原理。在邮件中资源是这样的位置:
在这里插入图片描述
那么在我们Java中也为我们提供了用来组合的类:MimeMultipart;
javax.mail.internet.MimeMultipart是抽象类 Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
在这里插入图片描述
除此之外,Java还为我们提供了一个类:MimeBodyPart
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,MIME:多用途互联网邮件扩展类型。它和MimeMessage类一样都是从Part接口继承过来。就是用来封装消息的类。

package com.muhan.sendMail;

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.security.GeneralSecurityException;
import java.util.Properties;

//图片文本合并发送
public class SendImgMail {
    public static void main(String[] args) throws GeneralSecurityException, MessagingException {

        //第一步:创建配置文件,保存并读取信息
        Properties properties = new Properties();
        //1.设置qq邮件服务器
        properties.setProperty("mail.host","semp.qq.com");
        //2.设置发送协议
        properties.setProperty("mail.transport.protocol","smtp");
        //3.设置用户是否需要验证
        properties.setProperty("mail.stmpt.auth","true");

        //第二步:设置QQ邮箱SSL加密
        //因为我们使用的是QQ邮箱,还要设置SSL加密,加上以下几行代码即可(别的邮箱不需要)
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);

        System.out.println("=============准备工作完成===============");

        //第三步:正式开始准备发送邮件
        //1.创建Session会话对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //实现方法,传入发件方的邮箱地址和权限校验码
                return new PasswordAuthentication("462447812@qq.com","bxxovtwbczspbhcg");
            }
        });

        //2.开启Sessin的debug模式,这样就可以在控制台查看程序Email发送的状态了
        session.setDebug(true);

        //3.获取连接对象,通过session对象获取transport对象
        Transport transport = session.getTransport();

        //4.连接服务器,需要传入邮件服务器,发件方的账号和权限校验码
        transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg");

        //5.发送邮件
        sendImgMail(session, transport);


        //6.关闭连接
        transport.close();


    }

    private static void sendImgMail(Session session, Transport transport) throws MessagingException {
        //第一步:创建邮件
        //1创建邮件消息对象
        MimeMessage message = new MimeMessage(session);
        //2设置邮件的基本信息
        message.setFrom(new InternetAddress("462447812@qq.com"));//发件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人
        message.setSubject("图片邮件,请查收");//邮件主题

        //3准备邮件数据
        //3-1准备图片数据
        MimeBodyPart imgBody = new MimeBodyPart();
        //把图片封装成流,参数是本地图片的路径
        DataHandler dataHandler = new DataHandler(new FileDataSource("E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg"));
        imgBody.setDataHandler(dataHandler);
        imgBody.setContentID("1.jpg");//设置图片CID

        //3-2准备正文数据
        MimeBodyPart txtBody = new MimeBodyPart();
        //设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码
        txtBody.setContent("这是一封附带图片的邮件,图片:<img src='cid:1.jpg'>","text/html;charset=UTF-8");

        //4描述数据关系,将图片和文本组合
        MimeMultipart mimeMultipart= new MimeMultipart();
        mimeMultipart.addBodyPart(imgBody);
        mimeMultipart.addBodyPart(txtBody);
        mimeMultipart.setSubType("related");//设置邮件类型为嵌入式

        //5.5将邮件数据设置到邮件消息对象中,并保存修改
        message.setContent(mimeMultipart);
        message.saveChanges();//保存修改
        //6.发送邮件
        transport.sendMessage(message,message.getAllRecipients());
    }
}

效果展示:
在这里插入图片描述
在这里插入图片描述

7.带附件,图片的复合型邮件发送

原理和带图片的邮件发送一样,也是将每一部分封装再组合成一个整体。然后发送

package com.muhan.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.security.GeneralSecurityException;
import java.util.Properties;

//发送文本,图片,附件复合邮件
public class SendAllMail {
    public static void main(String[] args) throws MessagingException, GeneralSecurityException, UnsupportedEncodingException {
        Properties properties = new 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);

        System.out.println("=========准备工作完成===========");

        //开始发送邮件步骤
        //1.创建Session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("462447812@qq.com", "bxxovtwbczspbhcg");//邮箱用户名和密码(授权码)
            }
        });

        //2.开启Session的deBug模式,这样可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //3.通过Session获得Transport对象
        Transport transport = session.getTransport();

        //4.使用邮箱用户名和密码(授权码)连接邮件服务器
        transport.connect("smtp.qq.com","462447812@qq.com","bxxovtwbczspbhcg");


        //5.准备邮件
        //5.1创建邮件消息对象
        MimeMessage message = new MimeMessage(session);

        //5.2设置邮件的基本信息
        message.setFrom(new InternetAddress("462447812@qq.com"));//发件人
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("462447812@qq.com"));//收件人
        message.setSubject("复合邮件,请查收");//邮件主题

        //5.3编写邮件内容
        //5.3.1图片
        MimeBodyPart imgBody = new MimeBodyPart();
        DataHandler dataHandler = new DataHandler(new FileDataSource(
                "E:/IdeaProjects/JavaWeb邮件发送/src/resources/1.jpg"));//封装图片为流
        imgBody.setDataHandler(dataHandler);
        imgBody.setContentID("1.jpg");//设置图片CID

        //5.3.2文本
        MimeBodyPart txtBody = new MimeBodyPart();
        //设置正文内容,并将图片利用html嵌入,参数二为文本类型和字符编码
        txtBody.setContent("这是一封混合邮件,<img src='cid:1.jpg'>","text/html;charset=UTF-8");

        //5.3.3附件
        MimeBodyPart fileBody = new MimeBodyPart();
        fileBody.setDataHandler(new DataHandler(new FileDataSource(
                "E:/IdeaProjects/JavaWeb邮件发送/src/resources/我的文本文件.txt")));//封装附件为流
        //fileBody.setFileName(MimeUtility.encodeText("我的文本文件.txt"));
        //这里是将附件的名称做处理,防止乱码
        String str = new String("我的文本文件.txt".getBytes("UTF-8"),"ISO-8859-1");
        fileBody.setFileName(str);

        //5.4将三部分拼装
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(imgBody);
        allFile.addBodyPart(txtBody);
        allFile.addBodyPart(fileBody);
        allFile.setSubType("mixed");//设置邮件类型为带附件的混合类型

        //6.将整体放入message中,并保存修改
        message.setContent(allFile);
        message.saveChanges();//保存修改

        //7.发送邮件
        transport.sendMessage(message,message.getAllRecipients());

        //8.关闭连接
        transport.close();


    }
}

效果显示:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值