基于Java实现收发电子邮件功能

目录
  • 前言
  • 邮件协议
  • 1.首先在邮箱中开启此服务
  • 2.在Java中进行邮件的发送(邮件只包含文本)
  • 3.在Java中进行邮件的发送(邮件包含文本和附件(图片))

前言

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收发电子邮件的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java 基于Jakarta Mail实现收发邮件

    Jakarta Mail API提供了一个独立于平台和协议的框架来构建邮件,完成邮件接收与发送功能.它也包含在Java EE平台中,也可以和Java SE平台一起使用. Jakarta Mail的前生是JavaMail.JavaMail最后一个版本是于2018年8月发布,已经停止更新.新项目应该使用Jakarta Mail. 现在很多邮箱默认关闭smtp,pop3,imap服务,需要在设置中手动开启. 如果邮箱是使用授权码,则需要生成授权码(代替下文中密码),这种方式更安全. 依赖 注意Jaka

  • Java实战之基于swing的QQ邮件收发功能实现

    一.电子邮件详解 假设自己的电子邮件是me@163.com,对方的邮件是you@163.com 我们编写好文件填写好对方文件,点击发送,这些电子邮件就发出去了 而这些电子邮件被称为MUA:Mail User Agent--邮件用户代理. Email发送出去的时候,不是直接到达对方的电脑,而是先发送到MTA:Mail Transfer Agent--邮件传输代理.如:网易 Email到达MTA后,MTA会把Emain投递到邮件的最终目的MDA:Mail Delivery Agent--邮件投递代理

  • java中javamail收发邮件实现方法

    概述 1.邮件相关的标准 厂商所提供的 JavaMail 服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括: SMTP(Simple Mail Transfer Protocol) :即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. POP3(Post Office Protocol – Version 3) :即邮局协议版本 3 ,用于接收电子邮件的标准协议. IMAP(Internet Mail Access Protocol) :即 In

  • java邮件收发功能实现代码

    本文实例为大家分享了邮件收发功能的具体实现代码,供大家参考,具体内容如下 准备工作, 环境搭建: 1. 本地搭建一个邮件服务器   易邮服务器,eyoumailserversetup.exe 2. 新建邮箱账号   张三给李四发邮件.   步骤1:     新建域名: 工具, 服务器设置, 单域名框中输入 itcast.com   步骤2:     新建邮箱账号:  zhangsan@itcast.com                             lisi@itcast.com 3

  • 基于JavaMail API收发邮件的方法

    本文实例讲述了基于JavaMail API收发邮件的方法.分享给大家供大家参考.具体如下: 1.JavaMail API按其功能划分通常可分为如下三大类 (1)创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例对象代表一封电子邮件. (2)发送邮件的API:Transport类是发送邮件的核心API类,它的实例对象代表实现了某个邮件发送协议的邮件发送对象,例如SMTP协议. (3)接收邮件的API:Store类是接收邮件的核心API类,它的实例对象代表实现了某个

  • Java文件上传下载、邮件收发实例代码

    文件上传下载 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type="file" /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:multipart/form-data FileUpload 文件上传功能开发中比较常用,apache也提供了文件上传组件! FileUpload组件: 1. 下载源码 2. 项目中引入jar文件

  • 基于Java实现收发电子邮件功能

    目录 前言 邮件协议 1.首先在邮箱中开启此服务 2.在Java中进行邮件的发送(邮件只包含文本) 3.在Java中进行邮件的发送(邮件包含文本和附件(图片)) 前言 Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能. 传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱.电子邮件与之的发送过程是类似的.电子邮件是从用户电脑的邮件软件(例如:Outlook),发送到邮件服务器上,可能经过若干个

  • 基于java实现画图板功能

    本文实例为大家分享了java实现画图板功能的具体代码,供大家参考,具体内容如下 一.介绍 这个画图板主要实现的功能是画矩形(矩形使用的是一个函数画图的方法,这样画出来的图形比较有特点).椭圆.多变形(先画一条直线,鼠标每点击一个地方就会从上一个点连接到点击的点,当鼠标双击时,双击的点会和终点和起点相连).画线.橡皮以及颜色选择器,效果图如下所示: 二.具体实现 本项目主要使用的是java.swing以及java.awt的画图工具来实现.首先显示窗口的建立,先让主类draw继承javax.swin

  • Java读取文件及基于正则表达式的获取电话号码功能详解

    本文实例讲述了Java读取文件及基于正则表达式的获取电话号码功能.分享给大家供大家参考,具体如下: 1.正则表达式 正则表达式,又称 正规表示法 . 常规表示法 (英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列符合某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些符合某个模式的文本. 用到的一些特殊构造正则表达式的意义解析: ? 当该字符 紧跟在任何一个其他限

  • Java基于堆结构实现优先队列功能示例

    本文实例讲述了Java基于堆结构实现优先队列功能.分享给大家供大家参考,具体如下: package Demo; import java.util.NoSuchElementException; /* * 小顶堆 java使用堆结构实现优先队列 */ public class JPriorityQueue<E> { @SuppressWarnings("hiding") class QueueNode<E> { int capacity; int size; E[

  • Java基于Tcp的基础聊天功能实例

    本文实例讲述了Java基于Tcp的基础聊天功能.分享给大家供大家参考,具体如下: 最基础的聊天,用户端和服务器端每次说一句,而且严格规定了先后到顺序. 服务器端: import java.io.*; import java.net.*; public class ChatServer { public static void main(String[] args) { ServerSocket server = null; try { server = new ServerSocket(1213

  • Java基于NIO实现群聊功能

    本文实例为大家分享了Java基于NIO实现群聊功能的具体代码,供大家参考,具体内容如下 一.群聊服务器 package com.dashu.netty.group_chat; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.*; import java.nio.charset.StandardCharsets; import java.util.Iterator; pu

  • Java基于NIO实现聊天室功能

    本文实例为大家分享了Java基于NIO实现聊天室功能的具体代码,供大家参考,具体内容如下 Sever端 package com.qst.one; import java.io.IOException; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.channels.Channel; import java.nio.channels.SelectableChannel; impor

  • 基于Java实现Avro文件读写功能

    目录 模式(schema) 与其他系统的比较 Java客户端实现 定义一个schema 使用Java代码生成插件生成的User类进行序列化和反序列化 在不生成User类的情况下直接进行序列化和反序列化操作 总结 Apache Avro是一个数据序列化系统.具有如下基本特性: 丰富的数据结构.一种紧凑.快速的二进制数据格式.一个容器文件,用于存储持久数据.远程过程调用 (RPC).与动态语言的简单集成. 代码生成不需要读取或写入数据文件,也不需要使用或实现 RPC 协议. 代码生成作为一种可选的优

  • 基于Java实现简单的邮件群发功能

    目录 pom文件引入第三方依赖 java代码如下 运行测试 pom文件引入第三方依赖 <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4</version> </dependency> <!--lombok--> <dependency> <groupId>

随机推荐