javamail发送接收的简单demo

2023-11-07

目录结构

目录结构

首先引入文件

 <dependencies>
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
            <version>1.6.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

定义实体类

package com.match.entry;

import lombok.Data;

import java.util.Date;
import java.util.List;

@Data
public class Mail {
    private String userName;//用户名
    private String password;//密码或授权码
    private String host;//端口
    private String protocol;//协议栈
    private int port; //端口
    private boolean SSL;//是否使用ssl
    private boolean auth;//是否验证登录
    private String socketFactory; //socket
    private String fromEmail;//邮件发送者
    private String recipient;//邮箱接收者
    private String subject;//邮件主题
    private Date date;//邮件日期

    private List<MailAttach> mailContentList;//邮件正文

    private List<MailAttach> mailAttachList;//邮件附件
}

定义附件类

package com.match.entry;

import lombok.Data;

@Data
public class MailAttach {

    private String fileName;//附件名
    private String content;//文字
    private boolean pic;//是否是图片,true:是 false:否
    private boolean excel;//是否是excel文件,true:是 false:否
}

发送端

主要配置

package com.match;

import com.match.entry.Mail;
import com.match.entry.MailAttach;
import com.match.util.SendMailUtil;

import java.util.ArrayList;
import java.util.List;

public class SendMailDemo {

    public static void main(String[] args) {
        Mail mail = new Mail();
        mail.setUserName("xxxxxxxxx@aliyun.com");//用户名
        mail.setPassword("xxxxxx");//授权码或密码
        mail.setHost("smtp.aliyun.com");
        mail.setProtocol("smtp");
        mail.setAuth(true);
        mail.setSocketFactory("javax.net.ssl.SSLSocketFactory");
        mail.setPort(465);
        mail.setFromEmail("xxxxxxxxx@aliyun.com");//发送者
        mail.setRecipient("xxxxxxxx@qq.com");//接收者
        mail.setSubject("带附件和带图片的的邮件");

        List<MailAttach> list = new ArrayList<>();
        List<MailAttach> list1 = new ArrayList<>();
        MailAttach attach1 = new MailAttach();
        attach1.setContent("收到请回复,谢谢<br/>");
        attach1.setFileName("1.jpg");
        attach1.setPic(true);
        MailAttach attach2 = new MailAttach();
        attach2.setFileName("1.zip");
        list.add(attach1);
        list.add(attach2);
        list1.add(attach1);
        mail.setMailAttachList(list);
        mail.setMailContentList(list1);
        SendMailUtil.sendMail(mail);
    }
}


mail内容处理

package com.match.util;

import com.match.entry.Mail;
import com.match.entry.MailAttach;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.UnsupportedEncodingException;

public class SendMailUtil {
    private final static String RESOURCE_URL = "src/main/resources/";

    /**
     * @param mail
     * @throws Exception
     */
    public static void sendMail(Mail mail) {
        //使用JavaMail发送邮件的5个步骤
        //1、创建session
        Session session = MailSessionUtil.createSessionUtil(mail);
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
//        session.setDebug(false);
        session.setDebug(true);
        //2、通过session得到transport对象
        Transport ts = null;
        try {
            ts = session.getTransport();
            //3、连上邮件服务器
            ts.connect();
            //4、创建邮件
            Message message = createMixedMail(session, mail);
            //5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
        } catch (Exception e) {
            try {
                System.out.println(MimeUtility.encodeText(e.getMessage()));
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                if (ts != null) {
                    ts.close();
                }
            } catch (MessagingException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * @param session
     * @return
     * @throws Exception
     * @Method: createMixedMail
     * @Description: 生成一封带附件和带图片的邮件
     */
    private static MimeMessage createMixedMail(Session session, Mail mail) throws Exception {
        //创建邮件
        MimeMessage message = new MimeMessage(session);

        //设置邮件的基本信息
        message.setFrom(new InternetAddress(mail.getFromEmail()));
        message.setRecipient(Message.RecipientType.TO, new InternetAddress(mail.getRecipient()));
        message.setSubject(mail.getSubject());

        //代表正文的bodypart
        MimeBodyPart content = new MimeBodyPart();
        //设置正文
        MimeMultipart mp1 = setContent(mail);


        //描述关系:正文和附件
        MimeMultipart mp2 = setAttach(mail);
        //添加正文
        if(mp1 != null) {
            content.setContent(mp1);
            mp2.addBodyPart(content);
            mp2.setSubType("mixed");
        }

        message.setContent(mp2);
        message.saveChanges();
//        message.writeTo(new FileOutputStream("E:\\MixedMail.eml"));
        //返回创建好的的邮件
        return message;
    }

    /**
     * 设置邮件正文
     * @param mail
     * @return
     * @throws MessagingException
     */
    private static MimeMultipart setContent(Mail mail) throws MessagingException {

        //正文内容
        if (mail.getMailContentList() != null && !mail.getMailContentList().isEmpty()) {
            //描述关系:正文和图片
            MimeMultipart mp1 = new MimeMultipart();
            mp1.setSubType("related");
            for (MailAttach attach : mail.getMailContentList()) {
                if (attach.getContent() != null) {
                    MimeBodyPart bodyPart = new MimeBodyPart();
                    //设置内容时需要设置图片链接
                    bodyPart.setContent(attach.getContent() + "<img src='cid:" + attach.getFileName() + "'>", "text/html;charset=UTF-8");
                    mp1.addBodyPart(bodyPart);
                }
                if (attach.getFileName() != null) {
                    //设置图片附件
                    MimeBodyPart bodyPart = new MimeBodyPart();
                    DataHandler dh = new DataHandler(new FileDataSource(RESOURCE_URL + attach.getFileName()));
                    bodyPart.setDataHandler(dh);
                    if (attach.isPic()) {
                        bodyPart.setContentID(attach.getFileName());
                    }
                    mp1.addBodyPart(bodyPart);
                }
            }
            return mp1;
        }
        return null;
    }

    /**
     * 设置附件
     * @param mail
     * @return
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    private static MimeMultipart setAttach(Mail mail) throws MessagingException, UnsupportedEncodingException {
        MimeMultipart mp2 = new MimeMultipart();
        //添加附件
        if (mail.getMailAttachList() != null && !mail.getMailAttachList().isEmpty()) {
            for (MailAttach mailAttach : mail.getMailAttachList()) {
                MimeBodyPart attach = new MimeBodyPart();
                if (mailAttach.getFileName() != null) {
                    //附件
                    DataHandler dh = new DataHandler(new FileDataSource(RESOURCE_URL + mailAttach.getFileName()));
                    attach.setDataHandler(dh);
                    attach.setFileName(MimeUtility.encodeText(dh.getName()));
                }
                mp2.addBodyPart(attach);
            }
        }
        return mp2;
    }
}

生成mailsession,用于连接配置


package com.match.util;

import com.match.entry.Mail;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import java.util.Properties;

public class MailSessionUtil {
    /**
     * 生成mail的session
     * @param mail
     * @return
     */
    public static Session createSessionUtil(Mail mail){
        // 创建验证器
        Authenticator auth = new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                // 密码验证
                return new PasswordAuthentication(mail.getUserName(), mail.getPassword());
            }
        };
        /*
         *Properties是一个属性对象,用来创建Session对象
         */
        Properties properties = new Properties();
//        properties.put("mail.pop3.ssl.enable", mail.isSSL());
//        properties.put("mail.pop3.host", mail.getHost());
//        properties.put("mail.pop3.port", mail.getPort());
        properties.setProperty("mail.host", mail.getHost());
        properties.setProperty("mail.transport.protocol", mail.getProtocol());
        properties.setProperty("mail.smtp.auth", mail.isAuth() + "");
        properties.setProperty("mail.smtp.socketFactory.class", mail.getSocketFactory());
        properties.setProperty("mail.smtp.port", mail.getPort() + "");
        properties.setProperty("mail.smtp.socketFactory.port", mail.getPort() + "");
        /*
         *Session类定义了一个基本的邮件对话。
         */
        return Session.getInstance(properties, auth);
    }
}

接收端

package com.match;

import com.match.entry.Mail;
import com.match.util.ReceiveMailUtil;

public class ReceiveMailDemo {



    public static void main(String[] args) {
        Mail mail = new Mail();
        mail.setUserName("xxxxxxx@qq.com");//用户名
        mail.setPassword("xxxxxxxxxxxx");//授权码或密码
//        mail.setPort(995);//端口
//        mail.setHost("pop.qq.com");//QQ邮箱的pop3服务器
//        mail.setProtocol("pop3");//使用pop3协议
        mail.setPort(993);//端口
        mail.setHost("imap.qq.com");//QQ邮箱的pop3服务器
        mail.setProtocol("imap");//使用pop3协议
        mail.setSSL(true);//使用SSL加密
        mail.setAuth(true);
        mail.setSocketFactory("javax.net.ssl.SSLSocketFactory");
        //read 本地已经读过的邮件数,pop3与imap均不支持对邮件操作
        ReceiveMailUtil.recipient(mail,1176);
    }


}

接收内容处理

这里处理为只接收excel

package com.match.util;

import com.match.entry.Mail;
import com.match.entry.MailAttach;

import javax.mail.*;
import javax.mail.internet.MimeUtility;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.*;

public class ReceiveMailUtil {
    private final static String FILE_URL = "E:\\";
    private final static String excel2003L = ".xls";    //2003- 版本的excel
    private final static String excel2007U = ".xlsx";   //2007+ 版本的excel

    /**
     * @param mail
     * @param read 已经读到的邮件数目
     * @return
     */
    public static List<Mail> recipient(Mail mail, Integer read) {
        Session session = MailSessionUtil.createSessionUtil(mail);
        session.setDebug(false);
        /*
         * Store类实现特定邮件协议上的读、写、监视、查找等操作。
         * 通过Store类可以访问Folder类。
         * Folder类用于分级组织邮件,并提供照Message格式访问email的能力。
         */
        Store store = null;
        Folder folder = null;
        List<Mail> receiveList = new ArrayList<>();
        try {
            store = session.getStore(mail.getProtocol());
            store.connect(mail.getUserName(), mail.getPassword());

            folder = store.getFolder("INBOX");
            folder.open(Folder.READ_WRITE);//打开收件箱
//            folder.open(Folder.READ_ONLY);//打开收件箱
            // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
            int unread = folder.getUnreadMessageCount();
            System.out.println("未读邮件数: " + unread);
//            // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
            System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
            System.out.println("新邮件: " + folder.getNewMessageCount());
//            // 获得收件箱中的邮件总数
            System.out.println("邮件总数: " + folder.getMessageCount());


            int size = folder.getMessageCount();//获取邮件数目
            //获取邮件
            for (int i = read + 1; i <= size; i++) {
                Message message = folder.getMessage(i);
                //解析邮件内容
                String from = message.getFrom()[0].toString();
                String subject = message.getSubject();
                Date date = message.getSentDate();
                Mail receiveMail = new Mail();
                if (!(message.getContent() instanceof String)) {
                    parseMultipart((Multipart) message.getContent(), receiveMail);
                }
                receiveMail.setFromEmail(getSubChinese(from));
                receiveMail.setSubject(subject);
                receiveMail.setDate(date);
                receiveList.add(receiveMail);
            }

            System.out.println("接收成功!");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (folder != null) {
                    folder.close(false);
                }
                if (store != null) {
                    store.close();
                }
            } catch (Exception e) {
                System.out.println("接收失败!");
                e.printStackTrace();
            }
        }

        System.out.println("接收完毕!");
        return receiveList;
    }

    /**
     * 对复杂邮件的解析
     *
     * @param multipart
     * @param receiveMail
     * @throws MessagingException
     * @throws IOException
     */
    private static Mail parseMultipart(Multipart multipart, Mail receiveMail) throws MessagingException, IOException {

        List<MailAttach> contentList = new ArrayList<>();
        List<MailAttach> attachList = new ArrayList<>();
        int count = multipart.getCount();
//        System.out.println("count =  " + count);
        for (int idx = 0; idx < count; idx++) {
            BodyPart bodyPart = multipart.getBodyPart(idx);
            MailAttach attach = new MailAttach();
//            System.out.println(bodyPart.getContentType());
            if (bodyPart.isMimeType("text/plain")) {
                attach.setContent(bodyPart.getContent().toString());
                contentList.add(attach);
//                System.out.println("plain................." + bodyPart.getContent());
            } else if (bodyPart.isMimeType("text/html")) {
                attach.setContent(bodyPart.getContent().toString());
                contentList.add(attach);
//                System.out.println("html..................." + bodyPart.getContent());
            } else if (bodyPart.isMimeType("multipart/*")) {
                Multipart mpart = (Multipart) bodyPart.getContent();
                parseMultipart(mpart, receiveMail);
            } else if (bodyPart.isMimeType("application/octet-stream")) {
                String disposition = bodyPart.getDisposition();
//                System.out.println(disposition);
                if (disposition.equalsIgnoreCase(BodyPart.ATTACHMENT)) {
                    saveFile(bodyPart, attach);
                    attachList.add(attach);
                }
            } else if (bodyPart.isMimeType("image/jpeg")) {
                saveFile(bodyPart, attach);
                attach.setPic(true);
                attachList.add(attach);
            }

        }
        if (!contentList.isEmpty()) {
            receiveMail.setMailContentList(contentList);
        }
        if (!attachList.isEmpty()) {
            receiveMail.setMailAttachList(attachList);
        }
        return receiveMail;
    }

    /**
     * 保存文件到本地
     *
     * @param bodyPart
     * @param attach
     * @throws MessagingException
     * @throws IOException
     */
    private static void saveFile(BodyPart bodyPart, MailAttach attach) throws MessagingException, IOException {

        String fileName = getSubChinese(bodyPart.getFileName());
        boolean flag = isExcelFile(fileName);
        if (flag) {
            fileName = newFileName(fileName);
            InputStream is = bodyPart.getInputStream();
            String fileUrl = FILE_URL + fileName;
            copy(is, new FileOutputStream(fileUrl));
            attach.setFileName(fileUrl);
        } else {
            attach.setFileName(fileName);
        }
        attach.setExcel(flag);
    }

    /**
     * 转码
     *
     * @param str
     * @return
     */
    private static String getSubChinese(String str) {
        String rtnStr;
        try {
            if(str==null)
                return null;
            rtnStr = new String(str.getBytes(StandardCharsets.ISO_8859_1));
            if (rtnStr.contains("=")) {
                rtnStr = MimeUtility.decodeText(str);
            }
        } catch (UnsupportedEncodingException e) {
            rtnStr = str;
            e.printStackTrace();
        }
//        System.out.println(rtnStr);
        return rtnStr;
    }

    /**
     * 文件拷贝,在用户进行附件下载的时候,可以把附件的InputStream传给用户进行下载
     *
     * @param is
     * @param os
     * @throws IOException
     */
    private static void copy(InputStream is, OutputStream os) throws IOException {
        byte[] bytes = new byte[1024];
        int len;
        while ((len = is.read(bytes)) != -1) {
            os.write(bytes, 0, len);
        }
        if (os != null)
            os.close();
        is.close();
    }

    /**
     * 判断是否为excel
     *
     * @param fileName
     */
    private static boolean isExcelFile(String fileName) {
        if(fileName==null)
            return false;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if (excel2003L.equals(fileType) || excel2007U.equals(fileType)) {
            return true;
        }
        return false;
    }

    /**
     * 保存文件增加时间戳表示
     *
     * @param fileName
     * @return
     */
    private static String newFileName(String fileName) {
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);
        fileName = fileName.substring(0, index);
        fileName = fileName + Calendar.getInstance().getTimeInMillis() + fileType;
        return fileName;
    }
}

gitee代码地址:https://gitee.com/leftbehindmatches/javamail-demo.git

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javamail发送接收的简单demo 的相关文章

  • 上传进度条 Java Servlet?

    我想使用 servlet 显示上传进度条 我尝试过Ajax iFrame 技术 页面没有重新加载 文件也被上传 但是 进度条没有出现 有没有可用于 javaservlts 的 jQuery 进度插件 Thanks 我强烈推荐jQuery 上
  • 方法返回类型前的 是什么意思?

    下面的方法返回一个List组成T类型元素 public
  • Kafka - 如何同时使用过滤器和过滤器?

    我有一个 Kafka 流 它从一个主题获取数据 并且需要将该信息过滤到两个不同的主题 KStream
  • 无法使用 datastax java 驱动程序通过 UDT 密钥从 cassandra 检索

    我正在尝试使用用户定义的类型作为分区键将对象存储在 cassandra 中 我正在使用 datastax java 驱动程序进行对象映射 虽然我能够插入到数据库中 但无法检索该对象 如果我更改分区键以使用非 udt 例如文本 我就能够保存和
  • 未装饰窗户的 Windows Snap 功能?

    有谁知道如何允许未装饰的窗户使用此功能 唯一的选择就是重新实施它 有任何想法吗 谢谢 可停靠可能是唯一的JToolBar http docs oracle com javase tutorial uiswing components too
  • Java中Gson、JsonElement、String比较

    好吧 我想知道这可能非常简单和愚蠢 但在与这种情况作斗争一段时间后 我不知道发生了什么 我正在使用 Gson 来处理一些 JSON 元素 在我的代码中的某个位置 我将 JsonObject 的 JsonElements 之一作为字符串获取
  • 使用 JDBC 连接到 PostgreSql 的本地实例

    我在 Linux 机器上有一个正在运行的 PostgreSql 本地实例 当我使用psql来自 shell 的命令我成功登录 没有任何问题 我需要通过 JDBC 连接到 PostgreSql 但我不知道我到底应该传递什么url参数为Driv
  • 为什么解析这个 JSON 会抛出错误?

    我正在尝试解析这个 JSONObject query yahoo count 1 results rate Name USD INR id USDINR Time 12 19pm Date 10 31 2015 Bid 65 405 Ask
  • 如何自定义舍入形式

    我的问题可能看起来很简单 但仍然无法得到有效的东西 我需要自定义 Math round 舍入格式或其他格式以使其工作如下 如果数字是 1 6 他应该四舍五入到 1 如果大于或等于 1 7 他应该四舍五入到 2 0 对于所有其他带有 6 的小
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • java实现excel价格、收益率函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 带 getClassLoader 和不带 getClassLoader 的 getResourceAsStream 有什么区别?

    我想知道以下两者之间的区别 MyClass class getClassLoader getResourceAsStream path to my properties and MyClass class getResourceAsStre
  • 什么是 Java2D 处理程序线程?

    我创建了一个使用 Hibernate 的示例 java 应用程序 当我进行线程转储时 我观察到一个名为 Java2D Disposer 的奇怪线程 有人能告诉我该线程的功能吗 AWT 系统中的某些实体需要最终确定以释放资源 最突出的例子是j
  • 使用 DBCP 配置 Tomcat

    在闲置一段时间 几个小时 后 我们收到了 CommunicationsException 来自 DBCP 错误消息 在异常中 位于这个问题的末尾 但我没有看到任何配置文件中定义的 wait timeout 我们应该看哪里 在 tomcat
  • Java 的“&&”与“&”运算符

    我使用的示例来自 Java Herbert Schildt 的完整参考文献 第 12 版 Java 是 14 他给出了以下 2 个示例 如果阻止 第一个是好的 第二个是错误的 因此发表评论 public class PatternMatch
  • GAE 无法部署到 App Engine

    我正在尝试从 Eclipse 发布 Web 应用程序 我在 GAE 上创建了四个项目 可以通过登录我的帐户并查看控制台来查看它们 我已经改变了appengine web xml到项目的应用程序 ID 如果我将其更改为 GAE 上第一个创建的

随机推荐

  • AR-虚实融合文献阅读整理(一)

    一 增强现实中虚实融合中光照一致性的研究 http xueshu baidu com s wd paperuri 3A 28e867ba9c51b7d137175268533e46399d 29 filter sc long sign tn
  • PCIe专题学习——2.5(Flow control缓存架构及信用积分)

    之前我们讲了对PCIe的一些基础概念作了一个宏观的介绍 了解了PCIe是一种封装分层协议 packet based layered protocol 主要包括事务层 Transaction layer 数据链路层 Data link lay
  • Ubuntu的gcc卸载与安装

    1 卸载旧版本gcc sudo apt get remove gcc 2 添加软件源 sudo add apt repository ppa ubuntu toolchain r test 3 更新 sudo apt get update
  • FIR与IIR滤波器

    H z 有分母的就是IIR 因为有自环 递归型 一个冲激响应会一直在系统里循环 H z 没有分母的就是FIR 因为没有自环 非递归型 一个冲激响应不会在系统里一直循环 通过H Z 也可简单判断 一般FIR滤波器的系统函数无分母 IIR滤波器
  • 网络爬虫-----初识爬虫

    目录 1 什么是爬虫 1 1 初识网络爬虫 1 1 1 百度新闻案例说明 1 1 2 网站排名 访问权重pv 2 爬虫的领域 为什么学习爬虫 2 1 数据的来源 2 2 爬虫等于黑客吗 2 3 大数据和爬虫又有啥关系 2 4 爬虫的领域 前
  • 用户态和内核态的区别

    一 操作系统需要两种CPU状态 内核态 Kernel Mode 运行操作系统程序 操作硬件 用户态 User Mode 运行用户程序 二 指令划分 特权指令 只能由操作系统使用 用户程序不能使用的指令 举例 启动I O 内存清零 修改程序状
  • 数字电路的时序分析

    记录一下时序分析的学习 首先搞清楚以下时序分析时用到的名词 记录一下时序分析的学习 1 什么是setup time和hold time 为什么需要setup time和hold time 2 时序路径是什么 有哪些时序路径 3 如何分析时序
  • node编写C++扩展文件并引入到项目方案总结

    插入模块 通过Addon实现可扩展接口 可以将C 插入到前端项目中 编写扩展文件 编译扩展 调用扩展 参考 在项目中引入本地模块 1 使用 npm install module1 2 直接修改 package json 字段 增加依赖 3
  • layUI基本使用——布局

    layui特点 1 layui属于轻量级框架 简单美化 是用于开发后端模式 它在服务端页面上有非常好的效果 2 layui是提供给后端开发人员的ui框架 基于DOM驱动 layui的使用 引入layui的核心css文件 引入layui的he
  • 深度学习学习笔记(一):深度学习在图像和视频的应用

    深度学习在图像和视频的应用 文章目录 深度学习在图像和视频的应用 一 图像 视频处理 1 超分辨率问题 2 图像去噪 3 图像增强 3 1 弱光照增强 3 2 动态范围增强 4 质量评价 二 图像 视频压缩 2 1 传统压缩编码框架 2 2
  • java的BigDecimal也会存在丢失精度的问题

    先说结论 务必使用BigDecimal valueOf 1 01 或者使用 new BigDecimal 1 01 而不要使用new BigDecimal 1 01 查看源码可以知道 BigDecimal valueOf double va
  • 七校联合NewStarCTF 公开赛赛道WEEK2 web wp

    也不知道是不是公开赛和内部赛是不是同一套题 week1的题挺简单的 这里小记一下week2的题目 如有侵权立刻删除 Word For You 2 Gen 这题很简单就带过一下吧 报错注入就行 1 updatexml 1 concat 0x7
  • 数据挖掘 决策树算法 ID3 通俗演绎

    决策树是对数据进行分类 以此达到 预测的目的 该决策树方法先根据训练集数据形成决策树 如果该树不能对所有对象给出正确的分类 那么选择一些例外加入到训练集数据中 重复该过程一直到形成正确的决策集 决策树代表着决策集的树形结构 决策树由决策结点
  • Openwrt下设置程序开机自动启动

    转自http www cnyubin com p 364 今天在使用Openwrt时 需要将scp到上面的程序设置为开机自动启动 按照Linux下设置自动启动的方法并不有效 后来在官方wiki下发现了介绍文章 具体可见Openwrt下htt
  • Epoll图解

    图解 Epoll怎么实现的 51CTO COM epoll详解 Ineffable 的博客 CSDN博客 epoll详解
  • Nginx健康检查

    0 背景 服务治理的一个重要任务是感知服务节点变更 完成服务自动注册及异常节点的自动摘除 这就需要服务治理平台能够 及时 准确的感知service节点的健康状况 1 方案概述 Nginx 提供了三种HTTP服务健康检查方案供用户选择 1 T
  • 三面阿里被挂,竟获内推名额,历经 5 面拿下口碑 offer...

    每一个互联网人心中都有一个大厂梦 百度 阿里巴巴 腾讯是很多互联网人梦寐以求的地方 而我也不例外 但是 BAT 等一线互联网大厂并不是想进就能够进的 它对人才的技术能力和学历都是有一定要求的 所以除了学历以外 我们的技术和能力都要过硬才行
  • win10微信打电话对方听不到你的声音,你能听到对方声音

    1 隐私权限 开始 设置 隐私 麦克风 更改 开启权限 2 禁用占用问题 右键电脑右下角小喇叭 声音 声音控制面板 录制 分别右键下面的几个选项 启用麦克风 立体声混音等 然后分别双击下面的麦克风 立体声等选项 高级 独占前面的v取消 确定
  • 拯救小tim【最短路】

    题目链接 这里有一个坑点 譬如说 我们从S出发的时间 不是刚好卡着第一个的 起始点 没准出发的第一步 没有卡起始点 而是在后面的到达其他点的时候卡了起始点这样的情况 所以我们应该从0 max BegTim的来枚举起点时间 然后跑Dijkst
  • javamail发送接收的简单demo

    目录结构 首先引入文件