简单实现一个快速传输电子书到kindle的小项目

前言

最近翻出来好久没有看的kindle,准备继续我的阅读之路。当然,也是因为发现了一个非常好的获取电子书资源的网站,又燃起了我的阅读兴趣。

然而,往kindle里传输电子书的方式一共有四种:

  1. 直接在kindle商城购买正版电子书,会同步到kindle上。但是我不买书哦
  2. 通过连接电脑传输。还得连电脑,可真费劲。
  3. 给你的kindle发邮件,把电子书带到邮件的附件里,就可以同步到kindle上。这个是很常用的方式,但是邮箱这种东西,就是收垃圾电子邮件的,我这几年都没有主动发过邮件了。
  4. 在你的iOS、Android版本的kindle应用上打开电子书,也会同步到kindle。我要是用了app了我还用kindle干啥?

所以说,亚马逊这种西方互联网公司,就缺少钻研用户心思的能力(虽然说中国互联网公司钻研的有些过分了……)你在官网上整个上传功能不就好了?这么多年了,我都没有见到过类似的功能。还在用古老的电子邮件方式来传输文件……

诶?那我让发邮件这件事变得容易一些不就行了?写个小项目来实现吧!

快速发邮件,都需要哪些准备?

所以,我们的思路就是,通过代码获取到要传输到kindle的电子书,然后自动发送邮件到kindle的邮箱就好啦。

涉及到的知识点:

  1. 文件的读取和操作
  2. 发邮件

常用的语言是Java,就先用Java简单实现一下了,以后再用python试试。

知识点一:文件的读取和操作

我们用File类来获取即可。

整个流程如下:

  1. 指定我们存放电子书的路径,就以/Users/xiaobai/Documents/csdn/kindle路径为例吧。
  2. 通过路径获取到该文件夹下的文件列表。使用file.listFiles()
  3. 格式的校验(万一混进去不是电子书的奇怪文件呢)
  4. 遍历文件列表,通过发送邮件发送电子书。其中mailSendService.send方法在后面会提到
  5. 将发送成功的电子书移动到已发送文件夹中。使用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邮箱为例,在设置中开启这两项,如图:

img

开启之后,会生成一个授权密码,需要保存起来,在发送邮件时需要用这个密码。

依赖引入和配置

至于如何用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

img

之后,在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的邮箱了,而且也会将发送过的电子书自动移到已发送的文件夹里备份,防止以后重复发送。

之后要做的,就是准备把这个功能打包成一个应用,做成一个可视化的界面,然后直接拖动电子书到界面里就可以直接发邮件出去。等我再研究研究,下一篇文章见了!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 《Effective STL》是由Scott Meyers所撰写的一本介绍STL(标准模板库)的经典电子。STL是C++程序员广泛使用的一组通用模板类和函数,用于实现许多常见的数据结构和算法。 这本电子以一种深入、系统的方式介绍了STL,旨在帮助读者在使用STL时编写更高效、更健壮的代码。中涵盖了STL的各个方面,包括容器(如vector、list、map等)、迭代器、算法、函数对象等。作者通过丰富的代码示例和详细的解释,展示了如何正确地使用STL,并避免常见的陷阱和错误。 Kindle是Amazon推出的一款电子阅读器,可以通过Kindle设备或Kindle应用程序在各种设备上阅读电子。对于《Effective STL》这样的电子,使用Kindle进行阅读有以下几个优点。 首先,Kindle具有便携性。使用Kindle设备或Kindle应用程序,读者可以随时随地阅读电子,在通勤、旅行或休闲时都非常方便。 其次,Kindle提供了优秀的阅读体验。Kindle的高分辨率屏幕和特殊的电子墨水技术使得文字清晰可读,并且无论在明亮的阳光下还是昏暗的环境中都能保持舒适的阅读体验。 另外,Kindle还提供了一些额外的功能,如高亮标记、签、字典和搜索等,方便读者更好地理解和管理阅读内容。 总之,《Effective STL》是一本非常有价值的电子,而Kindle则提供了便捷的阅读方式,使读者能够更好地利用这本学习和应用STL技术。无论是专业的C++程序员还是对STL有兴趣的学习者,都可以通过Kindle阅读《Effective STL》,提高自己的编程技能。 ### 回答2: 《Effective STL》是一本非常受欢迎的关于C++ Standard Library(C++标准库)的籍,由Scott Meyers所著。对于那些对于容器、迭代器和通用算法的使用有兴趣的读者来说,这本是一本非常有价值的资源。 在Kindle上阅读这本电子有许多好处。首先,Kindle是一款便携式设备,用户可以随时随地阅读。这意味着读者可以在旅途中、等待中或者在床上舒适地阅读《Effective STL》,无需担心携带笨重的纸质籍。 其次,Kindle还提供了一些功能,如亮度调节和字体大小调节,使读者能够根据自己的偏好进行个性化设置。这样,用户可以根据环境光线和自己的视力来调整亮度和字体大小,保证舒适的阅读体验。 另外,Kindle还支持云同步功能,这意味着当用户在一台设备上阅读完一段时间后,可以在另一台设备上继续阅读,而不会丢失进度或签。这对于经常使用多个设备或者想在电脑和平板上进行阅读的人来说非常方便。 此外,Kindle还提供了强大的搜索功能,让读者可以快速找到需要的内容。这本电子概括了大量的STL用法和最佳实践,使用搜索功能可以方便地查找和回顾这些内容。 总之,使用Kindle阅读《Effective STL》电子是一种便捷和舒适的方式。它提供了灵活的阅读体验,使读者能够根据自己的喜好和需要进行个性化设置,并且具有云同步和搜索功能,方便读者在不同设备之间切换和查找内容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白码上飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值