一.原理

1.首先介绍一下邮件传输协议的概念:(以下图片来自百度百科)

1.POP3协议:


java怎么向qq群发消息 java 发送qq消息_jsp


2.SMTP协议:

java怎么向qq群发消息 java 发送qq消息_jsp_02

简单来说,POP3协议是用来存储用户发来的邮件,而SMTP协议则用于用户发送邮件之间的传输。

邮件发送的原理如下图:


java怎么向qq群发消息 java 发送qq消息_web_03

A用户要给B用户发一封邮件,收件人是B,地址为…@163.com,A点击发送后,邮件会首先上传至QQ服务器,然后通过SMTP协议发送至网易服务器,并提醒B用户取信,B用户登录自己的邮箱账户后,网易服务器便会通过POP3协议将邮件发送给B,完成邮件传输。


二.实现步骤

1.创建一个maven项目


java怎么向qq群发消息 java 发送qq消息_servlet_04


2.需要导入commons-fileupload包,pom文件配置如下

<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>


3.编写前端页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/MailDemo01" method="post">
    请输入你要发送的邮箱地址:<input type="email" name="email">
    <input type="submit">
</form>
</body>
</html>

效果如下:


java怎么向qq群发消息 java 发送qq消息_servlet_05


4.编写servlet

这里方便起见,将功能实现写在了servlet里,可以编写实体类进行servlet的请求转发来完成,当然也可以使用原生java类来编写,但需要导入上面所述的jar包就可以实现。


我的目录配置如下:


java怎么向qq群发消息 java 发送qq消息_http_06

别忘了配置相应的web.xml

<servlet>
    <servlet-name>MailDemo01</servlet-name>
    <servlet-class>com.zovz.mail.MailDemo01</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>MailDemo01</servlet-name>
    <url-pattern>/MailDemo01</url-pattern>
</servlet-mapping>

源码如下:

package com.zovz.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Properties;

public class MailDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String from = "xxx@qq.com";//发件人邮箱
        final String username = "xxx@qq.com";//发件人的用户名
        final String password = "xxxxxxx";//发件人的授权码
        String host = "smtp.qq.com";//服务器
        String receiveUser = req.getParameter("email");//设置收件人的邮箱地址,从前端页面传送回来的email

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

            //QQ邮箱还需要设置SSL加密
            MailSSLSocketFactory sf = new MailSSLSocketFactory();

            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);

            //使用javamail发送邮件的五个步骤

            //1.创建session
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    //发件人的用户名,授权码
                    return new PasswordAuthentication(username, password);
                }
            });

            //查看程序发送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(receiveUser));

            //邮件标题
            message.setSubject("hello");

            //邮件的内容
            message.setContent("<h1>你好</h1>", "text/html;charset=UTF-8");

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

            //关闭
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

邮箱的授权码在邮箱的设置里,以QQ邮箱为例,在设置–>用户里面,开启服务,就能获取到对应的授权码。

java怎么向qq群发消息 java 发送qq消息_jsp_07

以上的代码只能负责纯文本的传输,如果想要加上图片,word文档等附件,需要加上格外的代码,如下。

将文件放在src目录下:


java怎么向qq群发消息 java 发送qq消息_servlet_08

源码如下:

//邮件标题
            message.setSubject("hello");

//-->图片

            //准备图片数据
            MimeBodyPart img = new MimeBodyPart();
            //图片需要经过处理
            DataHandler dataHandler = new DataHandler(new FileDataSource("xxx"));//-->这里放入图片的绝对地址
            
            //在img中放入这个处理过的图片数据
            img.setDataHandler(dataHandler);
            img.setContentID("1.jpg");//cid

            //准备正文数据
            MimeBodyPart text = new MimeBodyPart();
            text.setContent("<h1>你好</h1><img src='cid:1.jpg'>", "text/html;charset=UTF-8");

//-->附件

            //准备附件数据
            MimeBodyPart word = new MimeBodyPart();
            DataHandler dataHandler1 = new DataHandler(new FileDataSource("xxx"));//-->这里放入文件的绝对地址
            word.setDataHandler(dataHandler1);
            word.setFileName("文件.word");


            //文本和图片内嵌成功-->
            MimeMultipart allfile = new MimeMultipart();
            allfile.addBodyPart(img);
            allfile.addBodyPart(text);
            allfile.addBodyPart(word);
            allfile.setSubType("mixed");//当有邮件有附件时,需要设置为"mixed"


            //设置到消息中,保存修改
            message.setContent(allfile);
            message.saveChanges();

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

            //关闭
            transport.close();

最后启动tomcat服务器,输入收件人的地址,点击提交就可以看到邮件啦!

java怎么向qq群发消息 java 发送qq消息_web_09