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

作者:无解的黑眼圈 时间:2021-08-23 17:30:14 

前言

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

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

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

我们把类似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加入至当前项目。

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

jar包:

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

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

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

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

新增授权密码

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

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

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

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实现收发电子邮件功能

来源:https://blog.csdn.net/weixin_49187233/article/details/125833487

标签:Java,收发,邮件
0
投稿

猜你喜欢

  • 处理java异步事件的阻塞和非阻塞方法分析

    2023-04-16 05:06:01
  • java图形用户界面实现菜单功能

    2023-11-23 11:50:58
  • springboot+jersey+tomcat实现跨域方式上传文件到服务器的方式

    2023-08-16 10:26:45
  • Unity实现图形相交检测

    2021-09-16 09:31:01
  • Java运行时环境之ClassLoader类加载机制详解

    2022-07-18 04:54:05
  • Java读取txt文件中的数据赋给String变量方法

    2022-08-04 22:32:19
  • SpringBoot 项目瘦身maven/gradle详解

    2021-10-26 04:39:12
  • Java Hutool工具实现验证码生成及Excel文件的导入和导出

    2023-02-04 22:49:32
  • 浅析Java中的异常处理机制

    2021-08-19 05:42:48
  • 一起来学习Java IO的转化流

    2023-11-26 20:38:30
  • 带你重新认识MyBatis的foreach

    2023-11-21 08:44:54
  • String类型传递是值传递,char[]类型传递是引用传递的实现

    2022-06-01 09:33:44
  • C#控制台程序使用Log4net日志组件详解

    2023-02-15 19:44:26
  • MyBatis中使用$和#所遇到的问题及解决办法

    2023-03-25 12:27:55
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    2023-11-16 08:55:50
  • spring如何动态指定具体实现类

    2022-04-13 07:52:21
  • java开发分布式服务框架Dubbo暴露服务过程详解

    2021-07-19 17:59:50
  • Java 创建PDF打印小册子案例

    2023-01-17 04:19:40
  • Android客户端与服务端数据加密传输方案详解

    2023-07-14 13:55:37
  • 不使用Math.random方法生成随机数(随机数生成器)

    2021-11-28 05:08:46
  • asp之家 软件编程 m.aspxhome.com