cdhigh / KindleEar

Aggregates RSS and web content(Calibre recipe), sends to Kindle, and includes an e-ink optimized online reader.
http://cdhigh.github.io/KindleEar/
MIT License
2.71k stars 631 forks source link

建议开发最新版VPS Docker部署时完善邮件中转服务功能 #669

Closed appleftg closed 5 months ago

appleftg commented 6 months ago

首先谢谢大佬开发的程序,非常实用,稳定使用多年。其中,邮件中转服务强大且方便,KindleEar中已进行了接收邮件后的处理,建议在新版中一起完善此功能,在开发VPS Docker部署时,可以使用自定义域名邮箱解析使用此功能,邮箱邮件发送到绑定KindleEar的自定义域名邮箱后,KindleEar能解析邮件并使用邮件中转服务,谢谢

cdhigh commented 6 months ago

是这样,GAE的邮件中转我也常用,很喜欢,除了KindleEar的正事,有时候还用它来干坏事。 比如有些服务每个账号的试用期有限,同一个email又不能重复注册,appspotmail给我提供了无限量的email地址,过期就再注册一个,可以永远的试用~ 还有有些服务推荐一个用户就能获取某些升级奖励之类的,我就不停的推荐不同的appspotmail来创建新用户~

在转到VPS部署后,我也发现缺了这个功能,所以现在我还在拼命完善Bookmarklet,希望能替代邮件中转服务,我没有接触过没有听说过你说的自定义域名邮箱解析,我会搜索研究,你有什么推荐的服务吗?

appleftg commented 6 months ago

是这样,GAE的邮件中转我也常用,很喜欢,除了KindleEar的正事,有时候还用它来干坏事。 比如有些服务每个账号的试用期有限,同一个email又不能重复注册,appspotmail给我提供了无限量的email地址,过期就再注册一个,可以永远的试用~ 还有有些服务推荐一个用户就能获取某些升级奖励之类的,我就不停的推荐不同的appspotmail来创建新用户~

在转到VPS部署后,我也发现缺了这个功能,所以现在我还在拼命完善Bookmarklet,希望能替代邮件中转服务,我没有接触过没有听说过你说的自定义域名邮箱解析,我会搜索研究,你有什么推荐的服务吗?

具体的服务不懂,之前python2版本KindleEar的时候,我在本地用docker部署KindleEar(大佬FAQ推荐版本google/cloud-sdk:273.0.0-alpine镜像),用这个项目https://github.com/thingless/mailglove(目的将25端口接收邮件转为gae的webhook接收邮件传入KindleEar),将自定义域名添加dns邮箱地址解析到本地docker mailglove项目中转,KindleEar邮件中转系统使用正常,例如:DNS解析邮件地址到自定义域名kindleear.example.com,通过mailglove将邮件中转成gae webhook后传入本地gae接收,发送XXX@kindleear.example.com正常,可以按FAQ中xxx@appid.appspotmail.com邮件地址方法使用。

所以个人觉得部署在本地vps,设置DNS解析将自定义域名邮件地址解析到本地,kindleear通过25端口接收处理邮件,kindleear通过163邮箱SMTP发送邮件到kindle,实现原来的邮件中转服务功能,应该是可行的。

附:修改https://github.com/thingless/mailglove,/opt/webhook.js文件使之中转成符合gae接收邮件格式

webhook.js 34-45行修改为以下

        // 构造请求体
        var body = mail;
        body.to = process.argv[2];
        body.from = process.argv[3];
        body.subject = mail.subject;
        body.body = mail.html; // 使用HTML格式的邮件内容
        body.xsrf_token = "EeJILMBXzg"; // 添加 XSRF 令牌以匹配请求格式

        // 发送 POST 请求
        return makeRequest({
            uri: WEBHOOK_URL,
            method: "POST",
            headers: {"Content-Type": "application/x-www-form-urlencoded"},
            // 将请求体转换为 URL 编码格式
            body: `to=${encodeURIComponent(body.to)}&from=${encodeURIComponent(body.from)}&subject=${encodeURIComponent(body.subject)}&body=${encodeURIComponent(body.body)}&xsrf_token=${body.xsrf_token}`,
        })
cdhigh commented 6 months ago

没接触过这个领域,我不知是否真正理解你的意思。 花了一点时间学习了相关的知识。 mailglove只是一个非常简单js脚本,将其注册为postfix的content filter,mailglove将postfix的邮件格式重新包装了一下,调用指定的url (webhook)。 所以KindleEar就没必要使用mailglove脚本了,避免了安装笨重的node.js,只需要安装postfix即可(话说postfix的安装和配置真复杂,我都没心情看完~)

我现在想到的方案就是:

  1. 写一个python版本content filter
  2. 像mailglove一样注册为postfix的content filter
  3. 脚本里面解析邮件内容,通过任务队列异步转发到现有的inbound mail处理模块(因为postfix文档上提醒content filter不能执行太长时间)
appleftg commented 6 months ago

没接触过这个领域,我不知是否真正理解你的意思。 花了一点时间学习了相关的知识。 mailglove只是一个非常简单js脚本,将其注册为postfix的content filter,mailglove将postfix的邮件格式重新包装了一下,调用指定的url (webhook)。 所以KindleEar就没必要使用mailglove脚本了,避免了安装笨重的node.js,只需要安装postfix即可(话说postfix的安装和配置真复杂,我都没心情看完~)

我现在想到的方案就是:

  1. 写一个python版本content filter
  2. 像mailglove一样注册为postfix的content filter
  3. 脚本里面解析邮件内容,通过任务队列异步转发到现有的inbound mail处理模块(因为postfix文档上提醒content filter不能执行太长时间)

是的,就是想本地接收解析邮件到inbound mail处理模块或者干脆不经过inbound mail处理模块,新增加个mail处理模块的意思,这样这个方便的功能就保留下来了,奈何水平有限,仰仗大佬了

cdhigh commented 5 months ago

经过几天的学习,终于明白docker是怎么回事了,也成功部署了docker。 参考docker的最佳实践,我之前的想法是错误的(合并postfix为一个镜像),一个镜像不应该实现很多功能,所以你之前的做法是正确的,postfix/mailglove就应该是另一个镜像,可以使用docker-compose一起执行。 所以我在KindleEar实现一个webhook接口,就处理mailglove转发过来的json,这样就可以不用修改mailglove来适配gae的格式,而是直接pull docker hub上的镜像。

cdhigh commented 5 months ago

Docker镜像和compose都已经上传

appleftg commented 5 months ago

经过几天的学习,终于明白docker是怎么回事了,也成功部署了docker。 参考docker的最佳实践,我之前的想法是错误的(合并postfix为一个镜像),一个镜像不应该实现很多功能,所以你之前的做法是正确的,postfix/mailglove就应该是另一个镜像,可以使用docker-compose一起执行。 所以我在KindleEar实现一个webhook接口,就处理mailglove转发过来的json,这样就可以不用修改mailglove来适配gae的格式,而是直接pull docker hub上的镜像。

学习能力真强,那么快就处理好了,再请教下,我用docker-compose部署,貌似正常,但是用163邮箱SMTP发送邮件时,提示“Connection unexpectedly closed”,25或465端口都试了,还是报这个错误,一样的参数用其它的程序正常可以发送邮件,请帮解决下,谢谢

appleftg commented 5 months ago

Docker镜像和compose都已经上传

看到了,马上去试试,谢谢

cdhigh commented 5 months ago

抱歉,这个功能因为条件限制,我只有做单元测试,就是直接给KindleEar发测试包。 没有和mailglove进行集成测试,要不你看看log里面有什么内容? 要不要等一段时间我才能进行这个测试了。

appleftg commented 5 months ago

抱歉,这个功能因为条件限制,我只有做单元测试,就是直接给KindleEar发测试包。 没有和mailglove进行集成测试,要不你看看log里面有什么内容? 要不要等一段时间我才能进行这个测试了。

您好,刚解决了用163邮箱SMTP发送邮件问题(是SMTP网页配置说明不清晰容易错配,我重新开个贴提问,方便以后查找),重新部署测试docker-compose部署,采集投递和使用自定义域名邮箱入站邮件中转服务正常,谢谢大佬的开发完善。

cdhigh commented 5 months ago

Mailglove镜像太大了,建议尝试将基础镜像更换为alpine重新制作,只是一个postfix服务而已,不需要完整ubuntu镜像,应该不会有什么兼容性问题

appleftg commented 5 months ago

Mailglove镜像太大了,建议尝试将基础镜像更换为alpine重新制作,只是一个postfix服务而已,不需要完整ubuntu镜像,应该不会有什么兼容性问题

应该可以压缩,我不是作者,也不是很懂那一块,作者这么多年了还坚持更新,挺难得的。原来也找了很多个mail2http,用下来,还是这个合适,本地部署,不在乎这些空间了,有需求的可以根据作者的Dockerfile文件修改。我也在作者那里留言了,希望他会调整缩小基础镜像。

appleftg commented 5 months ago

对了,有空还得再麻烦完善下对应的书签小应用(Bookmarklet),【选择内容发送到Kindle】本地部署没有显示这个书签应用,谢谢

cdhigh commented 5 months ago

OK,选择内容发送邮件,功能是完备的,只是打开就好,现在的判断是如果不是appspot.com网域就屏蔽此功能,在网页端使用javascript屏蔽的。

appleftg commented 5 months ago

OK,选择内容发送邮件,功能是完备的,只是打开就好,现在的判断是如果不是appspot.com网域就屏蔽此功能,在网页端使用javascript屏蔽的。

那好。功能挺实用的

cdhigh commented 5 months ago

最新代码已经打开此功能。

额外的,我现在在开发KindleEar的chrome的扩展程序,过几天应该就可以上传chrome应用商店了。 除了bookmarklet这几个功能外,最让我开心的是我竟然成功了实现 “不需要写代码就生成任意网页的抓取脚本” 的功能。 第一次学习做chrome扩展程序,并且对前端和html/js连三脚猫的功夫都不算,能搞定挺不容易的,有几次都想放弃了~

appleftg commented 5 months ago

谢谢,还好没放弃,不然可惜了。我在重新docker部署时,还遇到两个问题,麻烦帮分析下:1.书签小应用(Bookmarklet)【发送到Kindle】,先选择希望推送的文章内容(可以包含图像文件),然后再点击此Bookmarklet,提示“Some parameter missing!”错误。2.书签小应用(Bookmarklet)【选择内容发送到Kindle】,邮件正文显示文字,不显示选择图片。

cdhigh commented 5 months ago
  1. 避免爬虫,“发送到Kindle”里面有一个“key=xxx”的查询字符串,这个密钥是在账号创建时随机生成的,因为数据库重建了,所以此密钥也变了,重新拖一次bookmarklet就好。
  2. 选择内容发送到kindle现在就是这样的,只提取里面的文本内容,如果要发送图像,还需要构造html的邮件body,为便捷起见,就只发送文本,如果需要图像,“发送到kindle”可以实现,因为使用post发送数据,所以格式就灵活一些。不知你是否清楚,"发送到kindle" 也支持选择文本然后发送,如果选择文本就发送文本(包括里面的图像和html的文档树结构),没有选择就发送当前链接。
appleftg commented 5 months ago
  1. 避免爬虫,“发送到Kindle”里面有一个“key=xxx”的查询字符串,这个密钥是在账号创建时随机生成的,因为数据库重建了,所以此密钥也变了,重新拖一次bookmarklet就好。
  2. 选择内容发送到kindle现在就是这样的,只提取里面的文本内容,如果要发送图像,还需要构造html的邮件body,为便捷起见,就只发送文本,如果需要图像,“发送到kindle”可以实现,因为使用post发送数据,所以格式就灵活一些。不知你是否清楚,"发送到kindle" 也支持选择文本然后发送,如果选择文本就发送文本(包括里面的图像和html的文档树结构),没有选择就发送当前链接。

是的,注意到了这个功能,重新部署后重新拖的,分享码对了对的,没有选择内容发送当前链接推送正常,选择文本和图像用“发送到Kindle”推送上一版本正常,这一版本用360或Microsoft Edge都是提示“Some parameter missing!”,地址栏为“https://kindleear.appspotmail.com/url2book”,不知道是不是这台电脑的问题,我换台电脑试试

appleftg commented 5 months ago

您好,换电脑试了,也是一样,选择文本和图像用“发送到Kindle”推送提示“Some parameter missing!”错误。是不是这一版本修改了代码的影响 image

cdhigh commented 5 months ago

我是js白痴,因为没有见过这个语法,在写chrome扩展程序的过程中发现这个代码很怪,感觉像是笔误,所以就顺手改过来了,尚未测试。 经过搜索发现,这不是笔误,是js创建对象的一个简写语法~

appleftg commented 5 months ago

我是js白痴,因为没有见过这个语法,在写chrome扩展程序的过程中发现这个代码很怪,感觉像是笔误,所以就顺手改过来了,尚未测试。 经过搜索发现,这不是笔误,是js创建对象的一个简写语法~

我也不懂,我把书签小应用(Bookmarklet)这个分号改回原来逗号,选择文本和图像用“发送到Kindle”推送就正常了,没有提示“Some parameter missing!”错误。