前言

Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能。

传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱。电子邮件与之的发送过程是类似的。电子邮件是从用户电脑的邮件软件(例如:Outlook),发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。

我们把类似Outlook这样的邮件软件称为MUA:Mail User Agent:意思是给用户服务的邮件代理;

邮件服务器称为MTA:Mail Transfer Agent:意思是邮件中转的代理

最终到达的邮件服务器称为MDA:Mail Delivery Agent:邮件到达的代理。

邮件一旦到达MDA,就不在动了。实际上,电子邮件通常就存储在MDA服务器的硬盘上,然后等收件人通过软件或者登录浏览器查看邮件。

邮件协议

常见的邮件协议有:POP3,SMTP,IMAP

POP3:是Post Office Protocol 3 的简称,POP3允许用户从服务器上把邮件存储到本地主机即自己的计算机)上,同时删除保存在邮件服务器上的邮件。

SMTP:全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,帮助每台计算机在发送或中转信件时找到下一个目的地。

SMTP认证,就是要求必须在提供了账户名和密码之后才能登录SMTP服务器,使得那些垃圾邮件的散播者无可乘之机。增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

IMAP:全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。

IMAP和POP3有什么区别?

1.POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。

2.IMAP提供webmail与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。

准备SMTP登录信息

常用邮件服务商的SMTP信息:

·QQ邮箱: SMTP服务器是smtp.qq.com,端口是465 / 587

·163邮箱:SMTP服务器是smtp.163.com,端口是465126邮箱: SMTP服务器是smtp

.126.com,端口是25

.Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465 / 587

准备好SMTP登录信息后,我们首先要把JavaMail相关的依赖Jar包javax.mail-1.6.2.jar加入至当前项目。

jar包:

链接:https://pan.baidu.com/s/1H8pnkVskG8casxIoUCq69Q 提取码:9aym

以126邮箱发送至QQ邮箱为例:

1.首先在邮箱中开启此服务

新增授权密码

2.在Java中进行邮件的发送(邮件只包含文本)

以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。

package com.yy.demo;
 
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
 
/**
 *     创建session会话
 * @author YangYing
 *
 */
public class Demo01 {
    public static void main(String[] args) {
        //SMTP服务器地址
        String smtp = "smtp.126.com";
        
        //邮箱账号和密码
        String userName = "yy0525xxxxx@126.com";
        String password = "xxxxxxxxxxxx";
        
        //SMTP服务器的连接信息
        Properties props = new Properties();
        props.put("mail.smtp.host", smtp);//SMTP主机名
        props.put("mail.smtp.port", "25");//主机端口号
        props.put("mail.smtp.auth", "true");//是否需要用户认证
        props.put("mail.smtp.starttls.enable", "true");//启用TLS加密
        
        //创建Session
        Session session = Session.getInstance(props, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(userName,password);
            }
            
        });
        //开启调试模式
        session.setDebug(true);
        
        System.out.println(session);
        
        
        
    }
 
}

发送邮件

1.先创建一个Session对象

Session session = JavaMailUtil.crateSession();

2.创建邮件对象(Message抽象类的子类)

RecipientType.TO代表发送人

RecipientType.CC代表抄送人

MimeMessage msg = new MimeMessage(session);//传入session
            msg.setFrom(new InternetAddress("yy052xxxx@126.com"));//发件人
            msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//发送人
            msg.setSubject("你好呀","utf-8");

3.邮件正文包含有“html”标签(控制文本的格式)

msg.setText("我<b>是你</b>!","utf-8","html");//<b>标签加粗字体

4.发送

Transport.send(msg);

整体代码如下:

package com.yy.demo;
 
import java.net.InetAddress;
 
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
 
/**
 *     发送邮件
 * @author YangYing
 *
 */
public class Demo02 {
    public static void main(String[] args) {
        try {
            //1.创建Session会话
            Session session = JavaMailUtil.crateSession();
            
            //2.创建邮件对象(Message抽象类的子类)
            MimeMessage msg = new MimeMessage(session);//传入session
            msg.setFrom(new InternetAddress("yy0525xxx@126.com"));//发件人
            msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//收件人
            msg.setSubject("你好呀","utf-8");
            
            //邮件正文包含有“html”标签(控制文本的格式)
            msg.setText("我<b>是你</b>!","utf-8","html");
            
            //3.发送
            Transport.send(msg);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
 
}

3.在Java中进行邮件的发送(邮件包含文本和附件(图片))

在上面代码基础上

1.设置邮件内容

邮件正文内容

内容类型:设置字符编码集

BodyPart textBodyPart = new MimeBodyPart();
            StringBuilder body = new StringBuilder();
            body.append("<h1>xz</h1>");
            body.append("<img src=\"cid:zhanzi\"/>");//通过内容ID引用附件图片
            textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");

2.邮件附件内容 

BodyPart imgBodyPart = new MimeBodyPart();
            imgBodyPart.setFileName("xz.jpg");//附件名称
 
            imgBodyPart.setDataHandler(//读取附件内容
                    new DataHandler(
                            new ByteArrayDataSource(
                                    Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信图片_20200228144031.jpg")),
                                    "application/octet-stream")));
            
            imgBodyPart.setHeader("Content-ID", "<zhanzi>");//设置内容ID

3.组合正文 附件

邮件内容

Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textBodyPart);
            multipart.addBodyPart(imgBodyPart);
            
            msg.setContent(multipart);

4.发送

Transport.send(msg);

5.整体代码

JavaMailUtil类是一个封装的类,可重复利用

package com.yy.demo;
 
import java.util.Properties;
 
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
 
public class JavaMailUtil {
    public static Session crateSession() {
        //SMTP服务器地址
                String smtp = "smtp.126.com";
                
                //邮箱账号和密码
                String userName = "yy05xxxxxx@126.com";
                String password = "xxxxxxxxxxxx";
                
                //SMTP服务器的连接信息
                Properties props = new Properties();
                props.put("mail.smtp.host", smtp);//SMTP主机名
                props.put("mail.smtp.port", "25");//主机端口号
                props.put("mail.smtp.auth", "true");//是否需要用户认证
                props.put("mail.smtp.starttls.enable", "true");//启用TLS加密
                
                //创建Session
                Session session = Session.getInstance(props, new Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(userName,password);
                    }
                    
                });
                //开启调试模式
                session.setDebug(true);
                
                return session;
    }
 
}
package com.yy.demo;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
 
import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
 
public class Demo04 {
    public static void main(String[] args) {
        try {
            //创建Session
            Session session = JavaMailUtil.crateSession();
            
            //创建邮件对象
            MimeMessage msg = new MimeMessage(session);//传入session
            msg.setFrom(new InternetAddress("yy05250915@126.com"));//发件人
            msg.setRecipient(RecipientType.TO, new InternetAddress("2452845234@qq.com"));
            msg.setSubject("我还是你!","utf-8");
            
            //设置邮件内容
            //邮件正文内容
            //内容类型:设置字符编码集
            BodyPart textBodyPart = new MimeBodyPart();
            StringBuilder body = new StringBuilder();
            body.append("<h1>xz</h1>");
            body.append("<img src=\"cid:zhanzi\"/>");//通过内容ID引用附件图片
            textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
            
            //邮件附件内容
            BodyPart imgBodyPart = new MimeBodyPart();
            imgBodyPart.setFileName("xz.jpg");//附件名称
 
            imgBodyPart.setDataHandler(//读取附件内容
                    new DataHandler(
                            new ByteArrayDataSource(
                                    Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信图片_20200228144031.jpg")),
                                    "application/octet-stream")));
            
            imgBodyPart.setHeader("Content-ID", "<zhanzi>");//设置内容ID
            
            //组合正文 附件
            //邮件内容
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(textBodyPart);
            multipart.addBodyPart(imgBodyPart);
            
            msg.setContent(multipart);
            
            //发送
            Transport.send(msg);
            
        } catch (MessagingException | IOException e) {
            e.printStackTrace();
        }
    }
 
}

邮件内容

以上就是基于Java实现收发电子邮件功能的详细内容,更多关于Java收发电子邮件的资料请关注Devmax其它相关文章!

基于Java实现收发电子邮件功能的更多相关文章

  1. 如何在iOS中的电子邮件的HTML正文中嵌入图像

    我正在尝试将图像包含在从iPad发送的HTML电子邮件的正文中.这似乎不可能.我曾尝试使用CID方法,但似乎在iOS中无法获取/设置附件的CID.我也尝试用src=“data:image/png;base64,blahblahblah”嵌入图像.撰写邮件时,它似乎有效,但收到邮件时没有任何内容.有任何想法吗?

  2. ios – UIDocumentInteractionController不显示邮件选项

    对于任何文件,最好指定UTI类型:例:

  3. 用Swift写一个发送邮件的iOS用户反馈

    为了接收用户反馈,很多iOS应用都会在设置页面中,加入发送邮件功能——尤其当应用是由个人开发者开发时。table_view_cel下一步是建立这个TableView的Controller。首先先写个函数,来配置发邮件的视窗。鉴于这种发送邮件的方式,要求用户已经在设备上至少添加有一个邮箱,所以对没有设置邮箱的用户,还应予以提示。到这里,一个调用UITableViewController的iOS邮件反馈就基本写完了。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实

  4. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  7. Java实现世界上最快的排序算法Timsort的示例代码

    Timsort 是一个混合、稳定的排序算法,简单来说就是归并排序和二分插入排序算法的混合体,号称世界上最好的排序算法。本文将详解Timsort算法是定义与实现,需要的可以参考一下

  8. Java日期工具类的封装详解

    在日常的开发中,我们难免会对日期格式化,对日期进行计算,对日期进行校验,为了避免重复写这些琐碎的逻辑,我这里封装了一个日期工具类,方便以后使用,直接复制代码到项目中即可使用,需要的可以参考一下

  9. Java设计模式之模板方法模式Template Method Pattern详解

    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角——模板方法模式

  10. Java 中 Class Path 和 Package的使用详解

    这篇文章主要介绍了Java 中 Class Path和Package的使用详解,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下

随机推荐

  1. 基于EJB技术的商务预订系统的开发

    用EJB结构开发的应用程序是可伸缩的、事务型的、多用户安全的。总的来说,EJB是一个组件事务监控的标准服务器端的组件模型。基于EJB技术的系统结构模型EJB结构是一个服务端组件结构,是一个层次性结构,其结构模型如图1所示。图2:商务预订系统的构架EntityBean是为了现实世界的对象建造的模型,这些对象通常是数据库的一些持久记录。

  2. Java利用POI实现导入导出Excel表格

    这篇文章主要为大家详细介绍了Java利用POI实现导入导出Excel表格,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  3. Mybatis分页插件PageHelper手写实现示例

    这篇文章主要为大家介绍了Mybatis分页插件PageHelper手写实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. (jsp/html)网页上嵌入播放器(常用播放器代码整理)

    网页上嵌入播放器,只要在HTML上添加以上代码就OK了,下面整理了一些常用的播放器代码,总有一款适合你,感兴趣的朋友可以参考下哈,希望对你有所帮助

  5. Java 阻塞队列BlockingQueue详解

    本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景,通过实例代码介绍了Java 阻塞队列BlockingQueue的相关知识,需要的朋友可以参考下

  6. Java异常Exception详细讲解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等

  7. Java Bean 作用域及它的几种类型介绍

    这篇文章主要介绍了Java Bean作用域及它的几种类型介绍,Spring框架作为一个管理Bean的IoC容器,那么Bean自然是Spring中的重要资源了,那Bean的作用域又是什么,接下来我们一起进入文章详细学习吧

  8. 面试突击之跨域问题的解决方案详解

    跨域问题本质是浏览器的一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据。那怎么解决这个问题呢?接下来我们一起来看

  9. Mybatis-Plus接口BaseMapper与Services使用详解

    这篇文章主要为大家介绍了Mybatis-Plus接口BaseMapper与Services使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  10. mybatis-plus雪花算法增强idworker的实现

    今天聊聊在mybatis-plus中引入分布式ID生成框架idworker,进一步增强实现生成分布式唯一ID,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

返回
顶部