使用Java发送qq邮件

邮件发送

环境说明:

  • 建立一个maven工程
  • qq邮箱开启pop3和smtp服务

1. 获取邮箱授权码

打开qq邮箱设置按下图操作

2. 需要的依赖

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

3. 创建一个邮件工具类

package com.gxa.yonghu.util;

import com.sun.mail.util.MailSSLSocketFactory;

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

/**
 * @author 枫叶
 * @version 1.0
 * @date 2020/12/22
 */
public class MailUtil implements Runnable {
    //  发件人账号
    public final static String MAIL_NAME = "发件人账户";
    //  发件人授权码
    public final static String MAIL_CODE = "第一步中获取的授权码";
    // 登录的用户名
    private String username = null;
    // 收件人邮箱
    private String email = null;
    //邮件主题
    private String motif = null;
    //邮件内容
    private String contentText = null;

    public MailUtil(String username, String email, String motif, String content) {
        this.username = username;
        this.email = email;
        this.motif = motif;
        this.contentText = content;
    }

    @Override
    public void run() {
        // 指定发送邮件的主机smtp.qq.com(QQ)|smtp.163.com(网易)  这里需要继续扩展做判断分支处理
        String host = "smtp.qq.com";
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);
        // 打开认证
        properties.setProperty("mail.smtp.auth", "true");

        try {
            //QQ邮箱需要下面这段代码,163邮箱不需要
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            properties.put("mail.smtp.ssl.enable", "true");
            properties.put("mail.smtp.ssl.socketFactory", sf);

            // 1.获取默认session对象
            Session session = Session.getDefaultInstance(properties, new Authenticator() {
                @Override
                public PasswordAuthentication getPasswordAuthentication() {
                    // 发件人邮箱账号、授权码
                    return new PasswordAuthentication(MailUtil.MAIL_NAME, MailUtil.MAIL_CODE);
                }
            });

            // 2.创建邮件对象
            Message message = new MimeMessage(session);

            // 3.设置发件人
            message.setFrom(new InternetAddress(MailUtil.MAIL_NAME));

            // 4.设置收件人
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(email));

            // 5.设置邮件主题
            message.setSubject(motif);

            // 6.设置邮件内容
            String content = "<html><head></head><body>" + contentText + "</body></html>";
            message.setContent(content, "text/html;charset=UTF-8");

            // 7.发送邮件
            // 阻塞方法
            Transport.send(message);
            System.out.println("邮件成功发送!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

4. 发送邮件

这里用servlet做演示,接收一个包含邮箱信息的json

/**
 * @author 枫叶
 * @version 1.0
 * @date 2020/12/22
 */
@WebServlet(value = "/mail/send",name = "mail")
public class MailServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //这里使用了fastJson解析,若不想使用fastJSON可以自己使用自己喜欢的解析方式,fastJSON依赖如下
        /**
         *         <dependency>
         *             <groupId>com.alibaba</groupId>
         *             <artifactId>fastjson</artifactId>
         *             <version>1.2.72</version>
         *         </dependency>
         */
        JSONObject json = JSONObject.parseObject(req.getReader().readLine());
        //获取参数
        String email = json.getString("email");
        System.out.println(json);
        //参数验证
        if (email==null||"".equals(email)){
            resp.getWriter().println(DataResponse.error(400,"参数不足"));
            return;
        }
        
        //其它业务
        
        //创建html邮件内容,只需输入body中的代码
        String content = "<h1>邮件标题</h1>"
                +"邮件内容";
        MailUtil mail = new MailUtil("发件人", email,"邮件主题",content);
        //发送邮件
        new Thread(mail).start();
        resp.getWriter().println(DataResponse.ok());
    }
}

5. 上面用到的返回封装类DataResponse如下

public class DataResponse{
    private final Map<String,Object> result;

    @Override
    public String toString() {
            //这里也用到了fastJSON并且设置了日期的格式化格式
        JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd hh:mm:ss";
        return JSON.toJSONString(result,SerializerFeature.WriteDateUseDateFormat);
    }

    public DataResponse(Integer code,String msg,Object data){
        result = new HashMap<>();
        result.put("code",code);
        result.put("msg",msg);
        result.put("data",data);
    }

    public DataResponse(Integer code,String msg){
        this(code,msg,null);
    }

    public DataResponse() {
        result=new HashMap<>();
    }

    public DataResponse put(String key,Object value){
        result.put(key,value);
        return this;
    }

    public static DataResponse ok(){
        return new DataResponse(200,"成功!");
    }

    public static DataResponse ok(String msg){
        return new DataResponse(200,msg);
    }

    public static DataResponse ok(int code,String msg){
        return new DataResponse(code,msg);
    }
    public static DataResponse ok(String msg,Object data){
        return new DataResponse(200,msg,data);
    }
    public static DataResponse ok(int code,String msg,Object data){
        return new DataResponse(200,msg,data);
    }

    public static DataResponse error(){
        return new DataResponse(500,"服务器错误,操作失败!");
    }

    public static DataResponse error(String msg){
        return new DataResponse(500,msg);
    }

    public static DataResponse error(int code,String msg){
        return new DataResponse(code,msg);
    }

    public Object get(String key){
        return result.get(key);
    }

    public Object getData(){
        return result.get("data");
    }

    public void setCode(int code) {
        result.put("code",code);
    }

    public void setMsg(String msg) {
        result.put("msg",msg);
    }

    public void setData(Object data) {
        result.put("data",data);
    }

}

6. 启动服务发送邮件

原文地址:https://www.cnblogs.com/junlinsky/p/14182774.html