博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习——邮件发送
阅读量:3942 次
发布时间:2019-05-24

本文共 10732 字,大约阅读时间需要 35 分钟。

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("这是一封附带图片的邮件,图片:","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("这是一封混合邮件,","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();    }}

效果显示:

在这里插入图片描述
在这里插入图片描述

转载地址:http://foiwi.baihongyu.com/

你可能感兴趣的文章
如何在android4.4版本上支持蓝牙发送APK文件
查看>>
Omacp收到network Pin之后,会要求输入Pin码
查看>>
android 4.4 滑动锁屏界面,按menu键可以解锁
查看>>
android 4.4上chromium介绍
查看>>
回调函数
查看>>
usb引脚
查看>>
手机驱动
查看>>
彻底了解指针数组,数组指针,以及函数指针,以及堆中的分配规则
查看>>
Embedded Software Design Engineer
查看>>
MTK网络通信例程
查看>>
手机设计与制造全过程
查看>>
对MTK按键事件的简单分析
查看>>
DM模板使用心得
查看>>
进入和退出屏幕模板程序
查看>>
FileManager模块分析
查看>>
嵌入式及手机开发
查看>>
C语言嵌入式系统编程修炼之道
查看>>
MTK定时器消息机制分析
查看>>
MTK芯片
查看>>
SIM卡与USIM
查看>>