首页 > 其他分享 >邮件

邮件

时间:2024-05-16 21:53:25浏览次数:17  
标签:mail import 发送 邮箱 new 邮件

1、邮件发送原理

1. 电子邮件的发送和接收过程原理图

这里先给出A用户从QQ邮箱发送邮件到B用户163邮箱的图示:

图示的六个步骤分别进行如下的说明:

  ① A用户的电子邮箱为:[email protected],通过邮件客户端软件写好一封邮件,交到QQ的邮件服务器,这一步使用的协议是SMTP;

  ② QQ邮箱会根据A用户发送的邮件进行解析,也就是根据收件地址判断是否是自己管辖的账户,如果收件地址也是QQ邮箱,那么会直接存放到自己的存储空间。这里我们假设收件地址不是QQ邮箱,而是163邮箱,那么QQ邮箱就会将邮件转发到163邮箱服务器,转发使用的协议也是SMTP;

  ③ 163邮箱服务器接收到QQ邮箱转发过来的邮件,也会判断收件地址是否是自己,发现是自己的账户,那么就会将QQ邮箱转发过来的邮件存放到自己的内部存储空间;

  ④ A用户将邮件发送了之后,就会通知B用户去指定的邮箱收取邮件。B用户会通过邮件客户端软件先向163邮箱服务器请求,要求收取自己的邮件;

  ⑤ 163邮箱服务器收到B用户的请求后,会从自己的存储空间中取出B用户未收取的邮件;

  ⑥ 163邮箱服务器取出B用户未收取的邮件后,将邮件发给B用户;最后三步④⑤⑥是B用户收取邮件的过程,使用的协议是POP3;

2. 邮件服务器

用户想要在网上收发邮件,必须要有专门的邮件服务器。邮件服务器我们可以设想为现实生活中的邮局。

如果按功能划分,邮件服务器可以划分为两种类型:

  • SMTP邮件服务器:用来替用户发送邮件和接收外面发送给本地用户的邮件,对应上图的第①、②步。它相当于现实生活中邮局的邮件接收部门(可接收普通用户要投出的邮件和其他邮局投递进来的邮件)。
  • POP3/IMAP邮件服务器:用来帮助用户读取SMTP邮件服务器接收进来的邮件,对应上图的第⑥步。它相当于专门为前来取包裹的用户提供服务的部门。

3. 邮件传输协议

 电子邮件需要在邮件客户端和邮件服务器之间,以及两个邮件服务器之间进行邮件传递,那就必须要遵守一定的规则,这个规则就是邮件传输协议。下面我们分别简单介绍几种协议:

  • SMTP协议:全称为 Simple Mail Transfer Protocol,简单邮件传输协议。它定义了邮件客户端软件和SMTP邮件服务器之间,以及两台SMTP邮件服务器之间的通信规则。
  • POP3协议:全称为 Post Office Protocol,邮局协议。它定义了邮件客户端软件和POP3邮件服务器的通信规则。
  • IMAP协议:全称为 Internet Message Access Protocol,Internet消息访问协议,它是对POP3协议的一种扩展,也是定义了邮件客户端软件和IMAP邮件服务器的通信规则。

2、Java实现邮件发送

1. 准备工作

首先要准备好JavaMail API和Java Activation Framework。即下载这两个的jar包或者使用其依赖。

  • mail-1.4.7.jar
  • activation-1.1.1.jar

发邮件的四个步骤:

  1. 准备包含邮件服务器的网络连接信息的Session对象
  2. 创建代表邮件信息内容的Message对象
  3. 创建Transport对象,连接服务器,发送Message
  4. 关闭连接

主要的四个核心类:

img

2. 实现一个简单的纯文本邮件发送

import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

// 简单邮件:没有附件和图片,纯文本邮件
public class email01 {
    // 要发送邮件,需要开启服务POP3/SMIP
    public static void main(String[] args) throws Exception{

        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp");  //设置邮件发送协议
        prop.setProperty("mail.smtp.auth", "true");   //需要验证用户名密码

        // 用Java发送邮件
        // 1.创建定义整个应用程序所需要的环境信息的Session对象
        // QQ邮箱才有这步
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发送人邮件用户名,授权码
                return new PasswordAuthentication("发件人邮箱地址", "授权码");
            }
        });

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

        // 2.通过session得到transport对象
        Transport transport = session.getTransport();

        // 3.使用邮箱的用户名和授权码连上邮件服务器
        transport.connect("smtp.qq.com", "发件人邮箱地址", "授权码");

        // 4.创建邮件
        //注意需要传递Session
        MimeMessage message = new MimeMessage(session);

        //设置邮件发件人
        message.setFrom(new InternetAddress("发件人邮箱地址"));

        //设置邮件收件人
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱地址"));

        //设置邮件主题
        message.setSubject("HelloWorld!Email");

        message.setContent("<h1 style='color: red'>Hello,Email!</h1>", "text/html;charset=UTF-8");

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

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

测试发送成功!

3. 实现文本加图片

package com.fj;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

//发送带有附件的邮件,正文中有图片
public class MailDemo03 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
        properties.setProperty("mail.transport.protocol", "smtp");  //设置邮件发送协议
        properties.setProperty("mail.smtp.auth", "true");   //需要验证用户名密码

        //用Java发送邮件
        //1.创建定义整个应用程序所需要的环境信息的Session对象

        //QQ才有
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发送人邮件用户名,授权码
                return new PasswordAuthentication("发件人邮箱地址", "授权码");
            }
        });

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

        //2.通过session得到transport对象
        Transport transport = session.getTransport();

        //3.使用邮箱的用户名和授权码连上邮件服务器
        transport.connect("smtp.qq.com", "发件人邮箱地址", "授权码");

        //4.创建邮件
        MimeMessage mimeMessage = imageMail(session);

        //5.发送邮件
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());

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

    }

    public static MimeMessage imageMail(Session session) throws MessagingException {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);

        //邮件发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱地址"));

        //邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱地址"));
        //邮件主题
        mimeMessage.setSubject("邮件的主题");

        /*
        编写邮件内容
        1.图片
        2.附件
        3.文本
         */
        //图片
        MimeBodyPart image = new MimeBodyPart();
        image.setDataHandler(new DataHandler(new FileDataSource("图片文件路径")));
        image.setContentID("1.png");//给图片设置一个ID,便于调用

        // 文本
        MimeBodyPart text = new MimeBodyPart();
        // cid就是ContentID的缩写,即这里调用的就是之前给图片设置的ID
        text.setContent("<h1 style='color: red'>Hello</h1><img src='cid:1.png'>", "text/html;charset=UTF-8");

        // 附件
        MimeBodyPart prop = new MimeBodyPart();
        prop.setDataHandler(new DataHandler(new FileDataSource("附件文件路径")));
        prop.setFileName("data.properties");    // 附件设置名字

        MimeBodyPart txt = new MimeBodyPart();
        txt.setDataHandler(new DataHandler(new FileDataSource("附件文件路径")));
        txt.setFileName("");    // 附件设置名字

        //拼装文件正文内容
        MimeMultipart multipart1 = new MimeMultipart();
        multipart1.addBodyPart(image);
        multipart1.addBodyPart(text);
        multipart1.setSubType("related");

        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(multipart1);

        //拼接附件
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(contentText);
        allFile.addBodyPart(prop);
        allFile.addBodyPart(txt);
        allFile.setSubType("mixed");//正文和附件拼接,用mixed

        //放到Message消息中,保存修改
        mimeMessage.setContent(allFile);//将编辑好的数据关系放入message中
        mimeMessage.saveChanges();

        return mimeMessage;
    }
}

4. 实现图片和文本,另外有附件内容

package com.fj;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

//发送带有附件的邮件,正文中有图片
public class MailDemo03 {
    public static void main(String[] args) throws Exception {
        Properties properties = new Properties();
        properties.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
        properties.setProperty("mail.transport.protocol", "smtp");  //设置邮件发送协议
        properties.setProperty("mail.smtp.auth", "true");   //需要验证用户名密码

        //用Java发送邮件
        //1.创建定义整个应用程序所需要的环境信息的Session对象
        //QQ才有
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发送人邮件用户名,授权码
                return new PasswordAuthentication("发件人邮箱地址", "授权码");
            }
        });

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

        //2.通过session得到transport对象
        Transport transport = session.getTransport();

        //3.使用邮箱的用户名和授权码连上邮件服务器
        transport.connect("smtp.qq.com", "发件人邮箱地址", "授权码");

        //4.创建邮件
        MimeMessage mimeMessage = imageMail(session);

        //5.发送邮件
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());

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

    }

    public static MimeMessage imageMail(Session session) throws MessagingException {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);

        //邮件发件人
        mimeMessage.setFrom(new InternetAddress("发件人邮箱地址"));

        //邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("收件人邮箱地址"));
        //邮件主题
        mimeMessage.setSubject("邮件的主题");

        /*
        编写邮件内容
        1.图片
        2.附件
        3.文本
         */
        //图片
        MimeBodyPart image = new MimeBodyPart();
        image.setDataHandler(new DataHandler(new FileDataSource("图片文件路径")));
        image.setContentID("1.png");//给图片设置一个ID,便于调用

        //文本
        MimeBodyPart text = new MimeBodyPart();
        //cid就是ContentID的缩写,即这里调用的就是之前给图片设置的ID
        text.setContent("<h1 style='color: red'>Hello</h1><img src='cid:1.png'>", "text/html;charset=UTF-8");

        //附件
        MimeBodyPart prop = new MimeBodyPart();
        prop.setDataHandler(new DataHandler(new FileDataSource("附件文件路径")));
        prop.setFileName("data.properties");    //附件设置名字

        MimeBodyPart txt = new MimeBodyPart();
        txt.setDataHandler(new DataHandler(new FileDataSource("附件文件路径")));
        txt.setFileName("");    //附件设置名字

        //拼装文件正文内容
        MimeMultipart multipart1 = new MimeMultipart();
        multipart1.addBodyPart(image);
        multipart1.addBodyPart(text);
        multipart1.setSubType("related");

        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(multipart1);

        //拼接附件
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(contentText);
        allFile.addBodyPart(prop);
        allFile.addBodyPart(txt);
        allFile.setSubType("mixed");//正文和附件拼接,用mixed

        //放到Message消息中,保存修改
        mimeMessage.setContent(allFile);//将编辑好的数据关系放入message中
        mimeMessage.saveChanges();

        return mimeMessage;
    }
}

3、在JavaWeb网站中实现邮件发送

现在很多的网站都提供有用户注册功能,通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现一个这样的功能,用户注册成功之后,就将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。

1. maven项目结构

image-20240516213921448

2. 创建User类

package com.yue.pojo;

public class User {

    private String username;
    private String password;
    private String email;

    public User() {
    }

    public User(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                '}';
    }
}

3. 创建一个发送邮件的工具类Sendmail类

package com.yue.utils;

import com.yue.pojo.User;

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

//网站三秒原则:用户体验
//多线程可以实现用户体验 (异步处理)
public class Sendmail extends Thread{

    private String from = "发送方邮箱";//发送方
    private String username = "发送方邮箱";//邮箱用户名
    private String password = "授权码";//邮箱密码(授权码)
    private String host = "smtp.qq.com";//发送邮件的服务器地址
    private User user;

    public Sendmail(User user){
        this.user = user;
    }

    //重写run方法的实现,在run方法中发送邮件给指定用户
    @Override
    public void run() {

        try {
            
            Properties properties = new Properties();
            properties.setProperty("mail.host", host); //设置QQ邮件服务器
            properties.setProperty("mail.transport.protocol", "smtp"); //设置邮件发送协议
            properties.setProperty("mail.smtp.auth", "true");  //需要验证用户名密码


            //用Java发送邮件
            //1.创建定义整个应用程序所需要的环境信息的Session对象

            //QQ才有
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                    //发送人邮件用户名,授权码
                    return new PasswordAuthentication(username, password);
                }
            });

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

            //2.通过session得到transport对象
            Transport transport = session.getTransport();

            //3.使用邮箱的用户名和授权码连上邮件服务器
            transport.connect(host, username, password);

            //4.创建邮件
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); // 获取到页面邮箱

            //邮件的主题
            message.setSubject("用户注册的邮件");

            String info = "恭喜您注册成功,您的用户名:" + user.getUsername() +
                    ",您的密码:" + user.getPassword() + ",请妥善保管,如有问题联系网站客服";

            message.setContent(info, "text/html;charset=UTF-8");
            message.saveChanges();

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

            // 关闭邮箱
            transport.close();

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

4. 编写RegisterServlet来实现邮件发送功能

package com.yue.servlet;

import com.yue.pojo.User;
import com.yue.utils.Sendmail;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RegisterServlet extends HttpServlet {
    
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收用户请求,封装成对象
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        User user = new User(username, password, email);

        System.out.println(username);
        System.out.println(password);
        System.out.println(email);

        //用户注册成功后,给用户发送一封邮件
        //使用多线程发送邮件,防止出现耗时,和网站注册人数过多的情况
        Sendmail sendmail = new Sendmail(user);
        // 启动线程
        sendmail.start();

        // 注册用户
        req.setAttribute("message", "注册成功,邮件已发送至您的邮箱!");
        req.getRequestDispatcher("info.jsp").forward(req,resp);
    }
}

5. 在web.xml注册RegisterServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    
    <servlet>
        <servlet-name>RegisterServlet</servlet-name>
        <servlet-class>com.yue.servlet.RegisterServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RegisterServlet</servlet-name>
        <url-pattern>/RegisterServlet.do</url-pattern>
    </servlet-mapping>
    
</web-app>

6. 创建index.jsp注册页面和info.jsp温馨提示页面

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
  <title>注册</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
  用户名:<input type="text" name="username" /><br>
  密码:<input type="password" name="password" /><br>
  邮箱:<input type="text" name="email" /><br>
  <input type="submit" value="注册">
</form>

</body>
</html>

info.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>温馨提示</h1>
${message}
</body>
</html>

启动tomcat!

标签:mail,import,发送,邮箱,new,邮件
From: https://www.cnblogs.com/magicYue/p/18196820

相关文章

  • Cisco Secure Email Virtual Gateway 15.5.1 GD - 电子邮件安全
    CiscoSecureEmailVirtualGateway15.5.1GD-电子邮件安全AsyncOSforESA15GeneralDeployment(GD)请访问原文链接:CiscoSecureEmailVirtualGateway15.5.1GD-电子邮件安全,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCiscoSecureEmail提供高级......
  • Jenkins-邮件配置
    Jenkins-邮件配置1.插件配置2.凭据配置,配置发件人的地址和密码3.系统配置3.1JenkinsLocation配置发件人邮箱3.2ExtendedE-mailNotification配置3.3邮件通知......
  • kettle从入门到精通 第五十九课 ETL之kettle 邮件发送多个附件,使用正则轻松解决
    问题场景:一个朋友说他用kettle将生成好的多个文件(a.xls和b.xls,文件在data目录下)发送给客户,但是data目录下还有其他的文件,他如果指定data目录发送会把data目录下面的所有文件都作为附件进行发送,显然不符合要求,所以他当时的临时解决方法是创建个临时目录,里面只放a.xls和b.xls两个......
  • 在Linux中,如何配置邮件服务器?
    配置邮件服务器是一个复杂的过程,涉及到多个组件的安装和配置。以下是在Linux中配置邮件服务器的一般步骤,这里以使用Postfix作为MTA(邮件传输代理),Dovecot作为IMAP服务器,以及使用MySQL作为数据库的示例:1.安装必要的软件安装Postfix、Dovecot和MySQL(或其他数据库服务器)。对于基于D......
  • 有研究表明,90% 的企业攻击始于钓鱼邮件
    电子邮件是重要的通信方式之一。电子邮件几乎可以立即发送到目标地址,这使得信息传递变得非常迅速,无论接收者位于世界的哪个角落,只要有互联网连接,他们都可以收到电子邮件,与社交媒体或即时通讯应用相比,电子邮件通常更受重视和信任。近日,安全人员研究表明,过去30天,62%的恶意文件通过......
  • springboot使用log4j监控日志发送邮件
    实现log4j发送邮件功能大致流程:1、开启邮箱SMTP服务,获取SMTP登录密码2、引入javax.mail、javax.activation依赖3、配置log4j文件,指定邮件发送方和接收方以及发送方账号密码等4、重写SMTPAppender(不重写也能实现邮件发送功能)开启邮箱SMTP服务这里以qq邮......
  • 大型外企都在用的邮件大附件系统,究竟哪里好?
    外企的业务往来复杂,内部沟通频繁,且普遍采用邮件作为沟通方式,外企一般使用的邮件系统多种多样,但其中一些较为常见和广泛使用的包括ZohoMail和Outlook等。Outlook作为微软旗下的全球主流电子邮件服务提供商之一,也拥有大量的外企用户。Outlook具有强大的邮件管理功能,能够方便地管......
  • python教程6.6-发送邮件smtplib
    实现步骤: Python对SMTP⽀持有smtplib和email两个模块,email负责构造邮件,smtplib负责发送邮件,它对smtp协议进⾏了简单的封装。简单代码示例:发送html格式的邮件:在html中插入图片: ......
  • 邮件的发送
    邮件发送和接收的协议SMTP协议(SimpleMailTransferProtocol)属于TCP/IP协议族。控制信件的中转方式,帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器是遵循SMTP协议的发送邮件服务器。POP3协议(PostOfficeProtocol-Version3)属于TCP/IP协议族。......
  • phpcms发送邮件
     pc_base::load_sys_func('mail');sendmail($email,'您好,点击链接注册账号','注册账号请点击链接:'."<ahref=".$addr.">".$addr."</a>");会得到一个授权码(很重要)  下面代码,就是一个普通的类/***发送邮件*@p......