简单实现一个快速传输电子书到kindle的小项目
前言
最近翻出来好久没有看的kindle,准备继续我的阅读之路。当然,也是因为发现了一个非常好的获取电子书资源的网站,又燃起了我的阅读兴趣。
然而,往kindle里传输电子书的方式一共有四种:
- 直接在kindle商城购买正版电子书,会同步到kindle上。但是我不买书哦
- 通过连接电脑传输。还得连电脑,可真费劲。
- 给你的kindle发邮件,把电子书带到邮件的附件里,就可以同步到kindle上。这个是很常用的方式,但是邮箱这种东西,就是收垃圾电子邮件的,我这几年都没有主动发过邮件了。
- 在你的iOS、Android版本的kindle应用上打开电子书,也会同步到kindle。我要是用了app了我还用kindle干啥?
所以说,亚马逊这种西方互联网公司,就缺少钻研用户心思的能力(虽然说中国互联网公司钻研的有些过分了……)你在官网上整个上传功能不就好了?这么多年了,我都没有见到过类似的功能。还在用古老的电子邮件方式来传输文件……
诶?那我让发邮件这件事变得容易一些不就行了?写个小项目来实现吧!
快速发邮件,都需要哪些准备?
所以,我们的思路就是,通过代码获取到要传输到kindle的电子书,然后自动发送邮件到kindle的邮箱就好啦。
涉及到的知识点:
- 文件的读取和操作
- 发邮件
常用的语言是Java,就先用Java简单实现一下了,以后再用python试试。
知识点一:文件的读取和操作
我们用File类来获取即可。
整个流程如下:
- 指定我们存放电子书的路径,就以
/Users/xiaobai/Documents/csdn/kindle路径为例吧。 - 通过路径获取到该文件夹下的文件列表。使用
file.listFiles() - 格式的校验(万一混进去不是电子书的奇怪文件呢)
- 遍历文件列表,通过发送邮件发送电子书。其中
mailSendService.send方法在后面会提到 - 将发送成功的电子书移动到已发送文件夹中。使用
file.renameTo(newFile)方法。这里要先创建好/Users/xiaobai/Documents/csdn/kindle/sent这个文件夹哦。
话不多说,上代码:
public void sendKindle() {
// 获取当前路径下的全部文件
File currentPathFile = new File("/Users/xiaobai/Documents/csdn/kindle");
List<File> files = Arrays.asList(currentPathFile.listFiles());
// 过滤留下指定格式的文件
if (CollectionUtils.isEmpty(files)) {
log.info("当前路径下不存在其他的文件");
return;
}
List<File> fileList = files.stream().filter(o -> {
String[] split = o.getName().split("\\.");
return (split.length > 1 && SUFFIX_LIST.contains(split[split.length - 1]));
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(fileList)) {
log.info("未找到指定类型的文件");
return;
}
for (File file : fileList) {
mailSendService.send("xiaobaibai@kindle.cn", file);
File newFile = new File("/Users/xiaobai/Documents/csdn/kindle/sent/" + file.getName());
file.renameTo(newFile);
}
}
知识点二:发邮件
邮箱后台配置
首先你要准备一个邮箱(这不是废话么),之后需要开启邮箱的smtp协议。
以我自己用的163邮箱为例,在设置中开启这两项,如图:

开启之后,会生成一个授权密码,需要保存起来,在发送邮件时需要用这个密码。
依赖引入和配置
至于如何用Java发邮件,我们就直接用Spring Boot提供的邮件组件了。在maven配置中引入spring-boot-starter-mail依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
或者是在初始化Spring Boot项目时,勾选Java Mail Sender

之后,在application.yml文件中,配置如下信息:
spring:
mail:
host: smtp.163.com
# 不用填写端口号
port:
# 发送邮件的邮箱地址,这里是个假的地址哈,实现时需要用真实的邮箱地址
username: sendmailtokindle@163.com
# 刚才在邮箱设置后台生成的授权密码
password: UXXXXXXXXXXXXQ
protocol: smtp
default-encoding: UTF-8
properties:
mail.smtp.auth: true
mail.smtp.starttls.enable: true
mail.smtp.starttls.required: true
mail.smtp.socketFactory.port: 465
mail.smtp.socketFactory.class: javax.net.ssl.SSLSocketFactory
mail.smtp.socketFactory.fallback: false
写代码
做好邮箱的配置,我们就可以写发送邮件的代码了。发邮件的模块如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
@Service
public class MailSendService {
@Autowired
private JavaMailSender mailSender;
@Value("${spring.mail.username}")
private String from;
public void send(String to, File file) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(file.getName());
helper.setText("自动推送kindle书籍:" + file.getName(), false);
FileSystemResource attachment = new FileSystemResource(file);
helper.addAttachment(attachment.getFilename(), attachment);
} catch (MessagingException e) {
e.printStackTrace();
}
mailSender.send(message);
}
}
这里自动注入的JavaMailSender类就是发送邮件的sdk,我们通过创建一个MimeMessageHelper类,来辅助创建一个可以发送附件的MimeMessage对象。这里要注意,如果没有设置text的值,在发送邮件时会因为text为null报错,这是我趟的一个坑。
总结
好啦,最后我们把要发送的电子书放到路径下,然后执行第一步里的sendKindle()方法,就可以自动把电子书发送到kindle的邮箱了,而且也会将发送过的电子书自动移到已发送的文件夹里备份,防止以后重复发送。
之后要做的,就是准备把这个功能打包成一个应用,做成一个可视化的界面,然后直接拖动电子书到界面里就可以直接发邮件出去。等我再研究研究,下一篇文章见了!
简单实现一个快速传输电子书到kindle的小项目的更多相关文章
- 利用Github Pages生成一个快速访问的网址,展示自己的项目
利用Github Pages展示自己的项目 写了个小项目,想要分享出去,一直在用Github管理项目,了解到Github还有Github Pages功能,然后惊喜的发现Github pages可以搭建 ...
- 一个快速检测系统CPU负载的小程序
原理说明 在对服务器进行维护时,有时也遇到由于系统 CPU(利用率)负载过高导致业务中断的情况.服务器上可能运行多个进程,查看单个进程的 CPU 都是正常的,但是整个系统的 CPU 负载可能是异常的. ...
- 详解:基于WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器功能
文件同步传输工具比较多,传输的方式也比较多,比如:FTP.共享.HTTP等,我这里要讲的就是基于HTTP协议的WEB API实现批量文件由一个服务器同步快速传输到其它多个服务器这样的一个工具(简称:一 ...
- 快速传输大数据(tar+lz4+pv)
快速传输大数据(tar+lz4+pv) 如果用传统SCP远程拷贝,速度是比较慢的.现在采用lz4压缩传输.LZ4是一个非常快的无损压缩算法,压缩速度在单核300MB/S,可扩展支持多核CPU.它还 ...
- iTerm2 实现 ssh 自动登录,并使用 Zmodem 实现快速传输文件
原文链接:https://fuckcloudnative.io/posts/iterm2-auto-login/ 对于 YAML 工程师来说,我们经常需要 ssh 登录不同的服务器,每次登录时都要经历 ...
- 在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程)
在浏览器中简单输入一个网址,解密其后发生的一切(http请求的详细过程) 原文链接:http://www.360doc.com/content/14/1117/10/16948208_42571794 ...
- 一个快速、高效的Levenshtein算法实现——代码实现
在网上看到一篇博客讲解Levenshtein的计算,大部分内容都挺好的,只是在一些细节上不够好,看了很长时间才明白.我对其中的算法描述做了一个简单的修改.原文的链接是:一个快速.高效的Levensht ...
- 简单的多对一传输ns2仿真
实验名称:简单的多对一传输仿真 实验目的:1.研究怎么实现多对一传输. 实验步骤: 1.写c++代码并注册报文头. 先说一下多对一传输的方式.最开始,接收端发送控制报文给所有的发送端,告诉他们要发送多 ...
- Win10如何搭建FTP服务器以实现快速传输文件
原文链接地址:http://blog.csdn.net/bai_langtao/article/details/77751447 Win10如何搭建FTP服务器以实现快速传输文件?相信大家在工作或生活 ...
随机推荐
- 【XR-2】伤痕
不难发现,直接漫无目的地构造不是一个好的选择,因为我们并不知道选择四座城市方案的上界是什么,因此下面可以来先分析一下这个方案的上界. 首先可以考虑这使得这四个点的导出子图是强连通的方案数,但是经过尝试 ...
- .exe文件自动重启
echo :杀死进程taskkill /f /im YYTWEB.exe :等待10秒:ping 127.0.0.1 -n 10 start "" "D:\都江堰银 ...
- ubuntu vi 使用
转载请注明来源:https://www.cnblogs.com/hookjc/ 文书编辑器介绍 [VI] vi ( m ) 在大多数的 unix 系统中 ( 包括 linux ) 都内建 vi ( m ...
- vue element InfiniteScroll 无限滚动 入坑记录
select_law_by_tag() { this.laws_loading.is_loading = true; this.laws_loading.no_more = false; this.e ...
- Linux常用命令精华讲解 上部 (下部下回分解)不要催很忙的
Linux常用命令讲解 1.Linux命令基础 2.Linux命令帮助 3.目录与文件的基操 1.Shell是系统中运行的一种特殊程序在用户和内核之间充当"翻译官"的角色,登录li ...
- http的报文结构和状态码总结
1.HTTP报文结构 请求报文 报文由三个部分组成,即开始行.首部行和实体主体.在请求报文中,开始行就是请求行. 响应报文 响应报文的开始行是状态行.状态行包括三项内容,即HTTP的版本,状态码,以及 ...
- Linux vi 命令 – 文本编辑器
vi命令是linux系统字符界面下的最常用的文本编辑器. vi编辑器是所有linux的标准编辑器,用于编辑任何ASCⅡ文本,对于编辑源程序尤其有用.iv编辑器功能非常强大,可以对文本进行创建,查找,替 ...
- Solution Set - Stirling 数相关杂题
<好多题的题解> 「洛谷 P5408」第一类斯特林数·行 根据结论 \[x^{\overline{n}}=\sum_i{n\brack i}x^i, \] 我们只需要求出 \( ...
- Diary -「PKUSC 2021」游记
出游回来自然而然(?)地进入生产低谷的兔子只能写写游记了 qwq. Day -1 实时反馈赛制不是为防止你被数据调戏,而是给你调戏数据的机会. --鲁迅 PKU 一贯的 \(32\) 发提交实 ...
- Solution -「AGC 034C」Tests
\(\mathcal{Description}\) Link. 给定非负整数序列 \(\{l_n\},\{r_n\},\{b_n\},X\),求最小的 \(s\),使得存在非负整数序列 \(\ ...