Java发送(QQ)邮箱、验证码发送
前言
使用Java应用程序发送 E-mail 十分简单,但是首先需要在项目中导入 JavaMail API 和Java Activation Framework (JAF) 的jar包。
菜鸟教程提供的下载链接:
- JavaMail mail.jar 1.4.5
- JAF(版本 1.1.1) activation.jar
1、准备工作
1.1 导包
在基础Java工程中
首先在项目目录下创建libs文件夹后将下载好的jar包复制进去,最后鼠标右击选择添加为库完成jar包的导入操作。

如果是Maven工程,只需要导入相应的坐标即可。
<dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version>
</dependency>
<dependency><groupId>javax.activation</groupId><artifactId>activation</artifactId><version>1.1.1</version>
</dependency>
下面采用基础项目的方式展开。
1.2 开启IMAP/SMTP服务
以QQ邮箱为例

QQ 邮箱通过生成授权码来设置密码:

2、发送一篇简单的E-mail
一些常用邮件服务商的SMTP信息:
- QQ邮箱:SMTP服务器是smtp.qq.com,端口是465/587;
- 163邮箱:SMTP服务器是smtp.163.com,端口是465;
- Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465/587。
2.1 连接
通过JavaMail API连接到SMTP服务器上:
// 收件人电子邮箱
String to = "XXX@qq.com";// 发件人电子邮箱
String from = "XXX@qq.com";//生成的授权码
String password = "*******";// 指定发送邮件的主机为 smtp.qq.com
String host = "smtp.qq.com";  //QQ 邮件服务器// 获取系统属性
Properties properties = System.getProperties();// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);properties.put("mail.smtp.auth", "true");
// 获取默认session对象
Session session = Session.getDefaultInstance(properties,new Authenticator(){public PasswordAuthentication getPasswordAuthentication(){return new PasswordAuthentication(from, password); //发件人邮件用户名、授权码}});// 设置debug模式便于调试:
session.setDebug(true);
2.2 发送
发送邮件时,我们需要构造一个Message对象,然后调用Transport.send(Message)即可完成发送:
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);// Set From: 头部头字段
message.setFrom(new InternetAddress(from));// Set To: 头部头字段
message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));// Set Subject: 头部头字段
message.setSubject("这是邮件主题!","UTF-8");// 设置消息体
message.setText("这是邮件正文","UTF-8");// 发送消息
Transport.send(message);//发送完成后控制台打印输出
System.out.println("Sent message successfully....");
2.3 完整写法
// 文件名 SendEmail.javaimport java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;public class SendEmail
{public static void main(String [] args){// 收件人电子邮箱String to = "XXX@qq.com";// 发件人电子邮箱String from = "XXX@qq.com";//生成的授权码String password = "*******";// 指定发送邮件的主机为 smtp.qq.comString host = "smtp.qq.com";  //QQ 邮件服务器// 获取系统属性Properties properties = System.getProperties();// 设置邮件服务器properties.setProperty("mail.smtp.host", host);properties.put("mail.smtp.auth", "true");// 获取默认session对象Session session = Session.getDefaultInstance(properties,new Authenticator(){public PasswordAuthentication getPasswordAuthentication(){return new PasswordAuthentication(from, password); //发件人邮件用户名、授权码}});// 设置debug模式便于调试:session.setDebug(true);try{// 创建默认的 MimeMessage 对象MimeMessage message = new MimeMessage(session);// Set From: 头部头字段message.setFrom(new InternetAddress(from));// Set To: 头部头字段message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));// Set Subject: 头部头字段message.setSubject("这是邮件主题!","UTF-8");// 设置消息体message.setText("这是邮件正文","UTF-8");// 发送消息Transport.send(message);//发送完成后控制台打印输出System.out.println("Sent message successfully....");}catch (MessagingException mex) {mex.printStackTrace();}}
}如果你想发送一封e-mail给多个收件人,那么使用下面的方法来指定多个收件人ID:
void addRecipients(Message.RecipientType type,Address[] addresses) throws MessagingException
下面是对于参数的描述:
- **type:**要被设置为 TO, CC 或者 BCC,这里 CC 代表抄送、BCC 代表秘密抄送。举例:Message.RecipientType.TO
- addresses: 这是 email ID 的数组。在指定电子邮件 ID 时,你将需要使用 InternetAddress() 方法。
2.4 效果

3、发送一封 HTML E-mail
发送HTML邮件和文本邮件是类似的,只需要把:
message.setText(body, "UTF-8");
改为:
message.setText(body, "UTF-8", "html"); 
一般这个都是以发验证码的为主,所以我仿照Apifox做了个发验证码的页面vericode.html,做的不是很标准。😢

3.1 HTML页面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>博客 邮箱验证码</title><style>.main {margin: 10px auto;width: 520px;border-top: 4px solid #9373EE;padding: 24px 24px 40px;border-radius:0 0 8px 8px;box-shadow: 0px 0px 1px;}.title {margin: 80px auto 32px;font-size: 32px;font-weight: 600;line-height: 45px;letter-spacing: 0px;}.note {margin: 0 auto;font-size: 18px;line-height: 1.4;left: 0px;top: 77px;font-weight: 400;}.code {padding: 16px;text-align: center;background: rgba(147, 115, 238, 0.04);border-radius: 4px;font-weight: 600;font-size: 24px;line-height: 140%;color: #9373EE;margin: 24px 0;letter-spacing: 1px;}.claim ul {margin-top: 34px;margin-bottom: 40px;font-size: 13px;line-height: 1.6;color: #5c5c5c;padding: 25px 0;}.claim ul li {color: rgba(24, 24, 25, 0.42);line-height: 30px;}.footer {font-size: 13px;line-height: 1.6;color: #5c5c5c;padding: 25px 0}.title,.note,.claim,.footer {text-align: center;}</style>
</head>
<body>
<div class="main"><div class="title">博客 邮箱账号验证码</div><div class="note">你正在进行邮箱验证操作,验证码为:</div><div class="code" :data="123456">1EM456</div><div class="claim"><ul style="list-style: none;"><li style="list-style: none;">此验证码 15 分钟内有效</li><li style="list-style: none;">如非本人操作</li><li style="list-style: none;">转给他人将导致账号被盗和个人信息泄漏,谨防诈骗</li></ul></div><div class="footer"><a href="https://blog.csdn.net/qq_62254095?spm=1018.2226.3001.5343" target="_blank" style="color: #9373EE; text-decoration: none;">个人博客</a> - 记录学习的每一分钟</div>
</div>
</body>
</html>
3.2 完整写法
// 文件名 SendHTMLEmail.javaimport java.util.*;
import javax.mail.*;
import javax.mail.internet.*;public class SendHTMLEmail
{public static String vericodeHtml = "<!DOCTYPE html>\n" +"<html lang=\"en\">\n" +"<head>\n" +"    <meta charset=\"UTF-8\">\n" +"    <title>博客 邮箱验证码</title>\n" +"    <style>\n" +"\n" +"        .main {\n" +"            margin: 10px auto;\n" +"            width: 520px;\n" +"\n" +"            border-top: 4px solid #9373EE;\n" +"            padding: 24px 24px 40px;\n" +"            border-radius:0 0 8px 8px;\n" +"            box-shadow: 0px 0px 1px;\n" +"        }\n" +"\n" +"        .title {\n" +"            margin: 80px auto 32px;\n" +"            font-size: 32px;\n" +"            font-weight: 600;\n" +"            line-height: 45px;\n" +"            letter-spacing: 0px;\n" +"\n" +"        }\n" +"\n" +"        .note {\n" +"            margin: 0 auto;\n" +"            font-size: 18px;\n" +"            line-height: 1.4;\n" +"            left: 0px;\n" +"            top: 77px;\n" +"            font-weight: 400;\n" +"        }\n" +"\n" +"        .code {\n" +"            padding: 16px;\n" +"            text-align: center;\n" +"            background: rgba(147, 115, 238, 0.04);\n" +"            border-radius: 4px;\n" +"            font-weight: 600;\n" +"            font-size: 24px;\n" +"            line-height: 140%;\n" +"            color: #9373EE;\n" +"            margin: 24px 0;\n" +"            letter-spacing: 1px;\n" +"        }\n" +"\n" +"        .claim ul {\n" +"            margin-top: 34px;\n" +"            margin-bottom: 40px;\n" +"            font-size: 13px;\n" +"            line-height: 1.6;\n" +"            color: #5c5c5c;\n" +"            padding: 25px 0;\n" +"\n" +"        }\n" +"\n" +"        .claim ul li {\n" +"            color: rgba(24, 24, 25, 0.42);\n" +"            line-height: 30px;\n" +"        }\n" +"\n" +"        .footer {\n" +"            font-size: 13px;\n" +"            line-height: 1.6;\n" +"            color: #5c5c5c;\n" +"            padding: 25px 0\n" +"        }\n" +"        .title,.note,.claim,.footer {\n" +"            text-align: center;\n" +"        }\n" +"    </style>\n" +"</head>\n" +"<body>\n" +"<div class=\"main\">\n" +"    <div class=\"title\">博客 邮箱账号验证码</div>\n" +"    <div class=\"note\">你正在进行邮箱验证操作,验证码为:</div>\n" +"    <div class=\"code\" :data=\"123456\">1EM456</div>\n" +"\n" +"    <div class=\"claim\">\n" +"        <ul style=\"list-style: none;\">\n" +"            <li style=\"list-style: none;\">此验证码 15 分钟内有效</li>\n" +"            <li style=\"list-style: none;\">如非本人操作</li>\n" +"            <li style=\"list-style: none;\">转给他人将导致账号被盗和个人信息泄漏,谨防诈骗</li>\n" +"        </ul>\n" +"    </div>\n" +"\n" +"    <div class=\"footer\">\n" +"        <a href=\"https://blog.csdn.net/qq_62254095?spm=1018.2226.3001.5343\" target=\"_blank\" style=\"color: #9373EE; text-decoration: none;\">个人博客</a> - 记录学习的每一分钟\n" +"    </div>\n" +"</div>\n" +"</body>\n" +"</html>";public static void main(String [] args){// 收件人电子邮箱String to = "XXX@qq.com";// 发件人电子邮箱String from = "XXX@qq.com";// 生成的授权码String password = "XXXX";// 指定发送邮件的主机为 smtp.qq.comString host = "smtp.qq.com";  //QQ 邮件服务器// 获取系统属性Properties properties = System.getProperties();// 设置邮件服务器properties.setProperty("mail.smtp.host", host);properties.put("mail.smtp.auth", "true");// 获取默认的 Session 对象。// 获取默认session对象Session session = Session.getDefaultInstance(properties,new Authenticator(){public PasswordAuthentication getPasswordAuthentication(){return new PasswordAuthentication(from, password); //发件人邮件用户名、授权码}});// 设置debug模式便于调试:session.setDebug(true);try{// 创建默认的 MimeMessage 对象。MimeMessage message = new MimeMessage(session);// Set From: 头部头字段message.setFrom(new InternetAddress(from));// Set To: 头部头字段message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));// Set Subject: 头字段message.setSubject("HTML邮箱验证码2","UTF-8");// 发送 HTML 消息, 可以插入html标签String generatedCode = "B12ACD";   // 假设后台生成的验证码String emailBody = vericodeHtml.replace(":data=\"123456\"", ":data=\"" + generatedCode + "\"").replace("1EM456", generatedCode); //将发送页面的验证码改为后台生成的验证码message.setText(emailBody, "UTF-8", "html");// 发送消息Transport.send(message);System.out.println("Sent message successfully....");}catch (MessagingException mex) {mex.printStackTrace();}}
}**建议:**可以生成一个类专门用来存放String类型的HTML模板,需要用时再导入,这样比较优雅( ̄︶ ̄)↗
3.3 效果图

4、发送带有附件的 E-mail
要在电子邮件中携带附件,我们就不能直接调用message.setText()方法,而是要构造一个Multipart对象:
Multipart multipart = new MimeMultipart();
// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body, "text/html;charset=utf-8");
multipart.addBodyPart(textpart);
// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName(fileName);
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(input, "application/octet-stream")));
multipart.addBodyPart(imagepart);
// 设置邮件内容为multipart:
message.setContent(multipart);
一个Multipart对象可以添加若干个BodyPart,其中第一个BodyPart是文本,即邮件正文,后面的BodyPart是附件。BodyPart依靠setContent()决定添加的内容。
-  如果添加文本,、 用 setContent("...","text/plain;charset=utf-8")添加纯文本,或者用 setContent("...","text/html;charset=utf-8")添加HTML文本。
-  如果添加附件, 需要设置文件名(不一定和真实文件名一致),并且添加一个 DataHandler(),传入文件的MIME类型。二进制文件可以用application/octet-stream,Word文档则是application/msword。
最后,通过setContent()把Multipart添加到Message中,即可发送。
4.1 完整写法
// 文件名 SendFileEmail.java
import java.io.File;
import java.util.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;public class SendFileEmail {public static void main(String[] args) {// 收件人电子邮箱String to = "XXX@qq.com";// 发件人电子邮箱String from = "XXX@qq.com";String password = "*****";// 指定发送邮件的主机为 smtp.qq.comString host = "smtp.qq.com";  //QQ 邮件服务器// 获取系统属性Properties properties = System.getProperties();// 设置邮件服务器properties.setProperty("mail.smtp.host", host);properties.put("mail.smtp.auth", "true");// 获取默认session对象Session session = Session.getDefaultInstance(properties, new Authenticator() {public PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication(from, password); //发件人邮件用户名、授权码}});session.setDebug(true);try {// 创建默认的 MimeMessage 对象。MimeMessage message = new MimeMessage(session);// Set From: 头部头字段message.setFrom(new InternetAddress(from));// Set To: 头部头字段message.addRecipient(Message.RecipientType.TO,new InternetAddress(to));// Set Subject: 头字段message.setSubject("附件发送");// 创建消息部分MimeBodyPart messageBodyPart = new MimeBodyPart();messageBodyPart.setContent("<h2>Hello</h2>这是一封带有附件的<a>Javamail</a>邮箱", "text/html;charset=utf-8");// 创建附件部分MimeBodyPart attachmentPart = new MimeBodyPart();// 使用绝对路径查找文件,直接从项目名开始String filePath =  "java-email/src/kun.jpg";File file = new File(filePath);FileDataSource fds = new FileDataSource(file);attachmentPart.setDataHandler(new DataHandler(fds));//attachmentPart.setDataHandler(new DataHandler(new ByteArrayDataSource(input, "application/octet-stream")));attachmentPart.setFileName(file.getName());// 创建多部分消息Multipart multipart = new MimeMultipart();multipart.addBodyPart(messageBodyPart);multipart.addBodyPart(attachmentPart);// 设置邮件内容为multipart:message.setContent(multipart);//   发送消息Transport.send(message);System.out.println("Sent message successfully....");} catch (MessagingException mex) {mex.printStackTrace();}}
}4.2 效果图

4.3 目录结构

注意:
Maven项目也跟上面相差不大,也可以自己写个工具类简化开发,或者找其他人写好的
发送附件时使用绝对路径,是因为我在使用相对路径是有些错误,找不到文件,不清楚为什么
有知道的大神可以评论给出答案🙂,也欢迎各位找错补充👍
相关文章:
 
Java发送(QQ)邮箱、验证码发送
前言 使用Java应用程序发送 E-mail 十分简单,但是首先需要在项目中导入 JavaMail API 和Java Activation Framework (JAF) 的jar包。 菜鸟教程提供的下载链接: JavaMail mail.jar 1.4.5JAF(版本 1.1.1) activation.jar 1、准备…...
 
PostgresSQL----基于Kubernetes部署PostgresSQL
【PostgresSQL----基于Kubernetes部署PostgresSQL】 文章目录 一、创建SC、PV和PVC存储对象1.1 准备一个nfs服务器1.2 编写SC、PV、PVC等存储资源文件1.3 编写部署PostgresSQL数据库的资源声明文件 二、部署PostgresSQL2.1 部署 PV、PVC等存储对象2.2 部署PostgresSQL数据库2.3…...
 
7 个适合初学者的项目,可帮助您开始使用 ChatGPT
推荐:使用 NSDT场景编辑器快速搭建3D应用场景 从自动化日常任务到预测复杂模式,人工智能正在重塑行业并重新定义可能性。 当我们站在这场人工智能革命中时,我们必须了解它的潜力并将其整合到我们的日常工作流程中。 然而。。。我知道开始使…...
JDBC操作SQLite的工具类
直接调用无需拼装sql 注入依赖 <dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.43.0.0</version></dependency>工具类 import org.sqlite.SQLiteConnection;/*** Author cpf* Dat…...
 
SEO百度优化基础知识全解析(了解百度SEO标签作用)
百度SEO优化的作用介绍: 百度SEO优化是指通过对网站的内部结构、外部链接、内容质量、用户体验等方面进行优化,提升网站在百度搜索结果中的排名,从而提高网站的曝光率和流量。通过百度SEO优化,可以让更多的潜在用户找到你的网站&…...
 
用python实现基本数据结构【03/4】
说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…...
软件测试面试题汇总
测试技术面试题 软件测试面试时一份好简历的重要性 1、什么是兼容性测试?兼容性测试侧重哪些方面? 5 2、我现在有个程序,发现在Windows上运行得很慢,怎么判别是程序存在问题还是软硬件系统存在问题? 5 3、测试的策略…...
 
AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动
产品描述 AP5101C 是一款高压线性 LED 恒流芯片 , 外围简单 、 内置功率管 , 适用于6- 100V 输入的高精度降压 LED 恒流驱动芯片。电流2.0A。AP5101C 可实现内置MOS 做 2.0A,外置 MOS 可做 3.0A 的。AP5101C 内置温度保护功能 ,温度保护点为…...
【大数问题】字符串相减(大数相减)<模拟>
类似 【力扣】415. 字符串相加(大数相加),实现大数相减。 题解 模拟相减的过程,先一直使大数减小数,记录借位,最后再判断是否加负号。(中间需要删除前导0,例如10001-1000000001&am…...
easycode生成代码模板配置
实体: ##引入宏定义 $!define##使用宏定义设置回调(保存位置与文件后缀)$!autoImport import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; i…...
 
【数据结构】堆排序和Top-k问题
【数据结构】堆 堆排序 如果只是将待排数组建立一个大堆或者小堆是无法得到一个升序或者降序的数组,因为对与一个堆,我们没法知道同一层的大小关系。 但是,如果建立了一个大堆,那么堆顶元素一定是这个数组中最大的,…...
经典的生产者和消费者模型问题
典型的生产者-消费者问题,可以使用 Java 中的 java.util.concurrent 包提供的 BlockingQueue 来实现。BlockingQueue 是一个线程安全的队列,它可以处理这种生产者-消费者的场景。以下是一个示例代码: import java.util.concurrent.ArrayBlockingQueue; import java.util.co…...
Java基础:代理
这里写目录标题 什么是代理1.静态代理(委托类、代理类):使用步骤:示例优缺点 2.动态代理(委托类、中介类)2.1 JDK动态代理使用:中介类:示例1:示例2: 2.2 CGLi…...
每日一学——防火墙2
防火墙是一种网络安全设备,用于保护计算机网络免受未经授权的访问、攻击和恶意行为的影响。以下是一些防火墙的基本概念: 防火墙规则:防火墙会根据预先设置的规则来决定允许或拒绝特定的网络流量。这些规则可以指定源 IP 地址、目标 IP 地址、…...
 
Web学习笔记-React(组合Components)
笔记内容转载自 AcWing 的 Web 应用课讲义,课程链接:AcWing Web 应用课。 CONTENTS 1. 创建父组件2. 从上往下传递数据3. 传递子节点4. 从下往上调用函数5. 兄弟组件间传递消息6. 无状态函数组件7. 组件的生命周期 本节内容是组件与组件之间的组合&#…...
 
【strstr函数的介绍和模拟实现——超详细版】
strstr函数的介绍和模拟实现 strstr函数的介绍 资源来源于cplusplus网站 strstr函数声明: char *strstr( const char *str1, const char *str2 ); 它的作用其实就是: 在字符串str1中查找是否含有字符串str2,如果存在,返回str2在…...
 
【Terraform】Terraform自动创建云服务器脚本
Terraform 是由 HashiCorp 创建的开源“基础架构即代码”工具 (IaC) 使用HCL(配置语言)描述云平台基础设施(这里教你使用低级基础设施:交换机、云服务器、VPC、带宽) Terraform提供者…...
 
TCP机制之确认应答及超时重传
TCP因为其可靠传输的特性被广泛使用,这篇博客将详细介绍一下TCP协议是如何保证它的可靠性的呢?这得主要依赖于其确认应答及超时重传机制,同时三次握手四次挥手也起到了少部分不作用,但是主要还是由确认应答和超时重传来决定的;注意:这里的可靠传输并不是说100%能把数据发送给接…...
Openharmony3.2 源码编译(ubuntu 22.04) 过程记录
OS: ubuntu 22.04 x64 1. 下载源码 1.1 安装码云repo工具 sudo apt install python3-pip git-lfsmkdir ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod ax ~/bin/repo pip3 install -i https://repo.huaweicloud.com/repository/p…...
 
PostgreSQL 数据库使用 psql 导入 SQL
最近我们有一个 SQL 需要导入到 PostgreSQL ,但数据格式使用的是用: -- -- TOC entry 7877 (class 0 OID 21961) -- Dependencies: 904 -- Data for Name: upload_references; Type: TABLE DATA; Schema: public; Owner: - --COPY public.upload_refere…...
 
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
 
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
 
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
 
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Mobile ALOHA全身模仿学习
一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...
 
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
 
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
 
RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
