• 使用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. 启动服务发送邮件

  • 相关阅读:
    c#添加托盘图标右键后显示菜单选项
    mysql workbench修改字段报错
    mysql增删改查语句
    连接win7的mysql很慢解决方法
    uvm_cmdline_processor
    cadence help文件库调出指令 :cdnshelp
    设置开机自动运行vncserver
    Vector bit-select and part-select addressing verilog片选写法
    Verilog三段式状态机描述
    同步FIFO学习
  • 原文地址:https://www.cnblogs.com/junlinsky/p/14182774.html
Copyright © 2020-2023  润新知