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

建议完善网页邮件发送服务选择SMTP选项配置 #672

Closed appleftg closed 4 months ago

appleftg commented 5 months ago

大佬,使用网页配置SMTP选项时,端口选项似乎有问题,端口配置在主机栏,发送邮件正常,配置在端口栏,报Connection unexpectedly closed错误,请修正,谢谢

以下配置发送邮件正常: image

以下配置发送邮件报Connection unexpectedly closed错误: image

cdhigh commented 5 months ago

太客气了,这是一个bug,不是说明不完善,因为发送邮件的函数忘了使用传入的端口号,而是从主机名中提取。 因为我测试都使用587默认端口,所以换了几个邮件服务器都测试通过。

cdhigh commented 5 months ago

最新代码已经修正此bug

appleftg commented 5 months ago

谢谢,有空麻烦更新下docker镜像,嘿嘿

cdhigh commented 5 months ago

好的,

cdhigh commented 5 months ago

已经更新docker镜像3.0.0c 这个版本和3.0.0b版本的数据库不兼容,表LastDelivered增加了一列url。 你可以选择:

  1. 先备份订阅数据,删除数据库文件 kindleear.db,让KindleEar重建数据库,然后再导入。
  2. 使用其他sqlite管理工具,在LastDelivered表添加一列url,类型为VARCHAR。

碰到这种情况,就更体会到nosql相对于sql数据库的一个很大的优势:数据库表发生变化后不影响已有数据! 所以我之前就在部署说明里面提到优先使用nosql。

不过一旦发布正式版,我会尽量不修改数据库结构,即使修改,也会提供一个命令用于迁移老的数据库文件到新数据库格式。

appleftg commented 5 months ago

已经更新docker镜像3.0.0c 这个版本和3.0.0b版本的数据库不兼容,表LastDelivered增加了一列url。 你可以选择:

  1. 先备份订阅数据,删除数据库文件 kindleear.db,让KindleEar重建数据库,然后再导入。
  2. 使用其他sqlite管理工具,在LastDelivered表添加一列url,类型为VARCHAR。

碰到这种情况,就更体会到nosql相对于sql数据库的一个很大的优势:数据库表发生变化后不影响已有数据! 所以我之前就在部署说明里面提到优先使用nosql。

不过一旦发布正式版,我会尽量不修改数据库结构,即使修改,也会提供一个命令用于迁移老的数据库文件到新数据库格式。

谢谢,重新部署了,正常了,数据库问题不大,正式版部署以后基本都是稳定不动了。还有几个建议希望完善下:1.自定义RSS增加批量删除、编辑修改已订阅的源。2.导入订阅列表保留原URL格式,有时候URL包含一些特殊字符被修改订阅失败(自定义RSS单个添加正常,导入订阅列表特殊字符被转换了),如http://192.168.15.47:1300/protected/shuge/https%3A%2F%2Fwww.shuge.org%2Ffeed%2F?opencc=t2s。3.归档保留老版本的二维码分享功能,有时候手机扫一扫查看挺方便的。4.增加docker版日志控制按钮,gunicorn.access.log文件大小增长挺快的。

cdhigh commented 5 months ago

1.自定义RSS增加批量删除、编辑修改已订阅的源。

这个功能意义不大,曾经想过后来放弃,一般情况下每个人就那么几个订阅,所以增加这个功能反而复杂了。

2.导入订阅列表保留原URL格式,有时候URL包含一些特殊字符被修改订阅失败(自定义RSS单个添加正常,导入订阅列表特殊字符被转换了),如[http://192.168.15.47:1300/protected/shuge/https%3A%2F%2Fwww.shuge.org%2Ffeed%2F?opencc=t2s

是因为我修改了导入导出的转义功能,之前是使用url的转义规则,现在使用xml的转义规则,转义字符更少,xml文件的可读性更好,如果以前的版本导出的xml现在导入会导致一些字符没有正确被转义,不过从现在开始,导出的xml重新导入不会出错。 只是不知道其他的rss reader的导入导出转义是什么样的规则?

3.归档保留老版本的二维码分享功能,有时候手机扫一扫查看挺方便的。

以前我是深度魔改Calibre,所以想实现什么功能都容易,现在是因为软件架构变化(尽量少修改Calibre)后我还没有找到一个比较干净的方法能中途添加图像文件,如果用很脏的方法实现我会抓狂的,所以就暂时去掉此功能。

4.增加docker版日志控制按钮,gunicorn.access.log文件大小增长挺快的。

这个已经不是KindleEar的范畴了,是Linux的运维部分了,以前的做法是使用linux的 logrotate.d 服务自动分割日志文件,在我的部署文档里面的手动部署方法里面有提到。 不过我简单搜索一下,新版本gunicorn还可以使用新的配置方法来控制日志的大小,我再学习学习。

appleftg commented 5 months ago

哦哦,明白了,可以增加编辑单个已订阅的源不?有时候修改感觉有点麻烦,要删除重新添加。新版用xml的转义规则导出正常,导入又被转义了,所以有些需要手工修正,又没找到地方,一个个删除重新添加,有点麻烦,原来用url的转义规则导出导入是正常的,如现在用xml的转义规则导入http://192.168.15.47:1300/protected/shuge/https%3A%2F%2Fwww.shuge.org%2Ffeed%2F?opencc=t2s,变成了http://192.168.15.47:1300/protected/shuge/https://www.shuge.org/feed/?opencc=t2s,订阅就失败了,要手工修改。其他的rss reader的导入导出转义是规则不清楚,应该订阅的时候是什么样,导入导出的时候应该就是什么样的吧,才能保持一致订阅正常

cdhigh commented 5 months ago

这样还是改回之前的转义规则好了

appleftg commented 5 months ago

这样还是改回之前的转义规则好了

试着改了下"/KindleEar/application/view/adv.py"176-190行,导入正常了,%3A、%2F等没有被解码,订阅正常,供参考:

        #title, url, isfulltext = xml_unescape(o.text), unquote(xml_unescape(o.xmlUrl)), o.isFulltext #isFulltext为非标准属性
        title, url, isfulltext = xml_unescape(o.text), o.xmlUrl, o.isFulltext # 直接使用原始编码的URL

        if isfulltext:
            isfulltext = str_to_bool(isfulltext)
        else:
            isfulltext = defaultIsFullText

        #if not url.startswith('http'):
        #    url = ('https:/' if url.startswith('/') else 'https://') + url

        # URL前缀检查不变,这确保了即使在原始URL编码的情况下,也能正确处理URL
        parsed_url = urlparse(url)
        if not parsed_url.scheme:
            url = 'https://' + url.lstrip('/')
appleftg commented 5 months ago

1.自定义RSS增加批量删除、编辑修改已订阅的源。

这个功能意义不大,曾经想过后来放弃,一般情况下每个人就那么几个订阅,所以增加这个功能反而复杂了。

2.导入订阅列表保留原URL格式,有时候URL包含一些特殊字符被修改订阅失败(自定义RSS单个添加正常,导入订阅列表特殊字符被转换了),如[http://192.168.15.47:1300/protected/shuge/https%3A%2F%2Fwww.shuge.org%2Ffeed%2F?opencc=t2s

是因为我修改了导入导出的转义功能,之前是使用url的转义规则,现在使用xml的转义规则,转义字符更少,xml文件的可读性更好,如果以前的版本导出的xml现在导入会导致一些字符没有正确被转义,不过从现在开始,导出的xml重新导入不会出错。 只是不知道其他的rss reader的导入导出转义是什么样的规则?

3.归档保留老版本的二维码分享功能,有时候手机扫一扫查看挺方便的。

以前我是深度魔改Calibre,所以想实现什么功能都容易,现在是因为软件架构变化(尽量少修改Calibre)后我还没有找到一个比较干净的方法能中途添加图像文件,如果用很脏的方法实现我会抓狂的,所以就暂时去掉此功能。

4.增加docker版日志控制按钮,gunicorn.access.log文件大小增长挺快的。

这个已经不是KindleEar的范畴了,是Linux的运维部分了,以前的做法是使用linux的 logrotate.d 服务自动分割日志文件,在我的部署文档里面的手动部署方法里面有提到。 不过我简单搜索一下,新版本gunicorn还可以使用新的配置方法来控制日志的大小,我再学习学习。

您好,我修改了下"KindleEar/application/static/base.js"文件,增加了自定义RSS批量删除、删除单个RSS订阅自动将待删除的RSS订阅源信息填充到添加RSS信息功能,觉得蛮方便的,方便大量测试rss订阅源,希望供您参考,加入进去,谢谢。

主要实现是: 1.在PopulateMyCustomRss函数中添加多选框的全部选择、取消选择按钮、删除选中按钮,在每个RSS项前添加一个多选框。 2.修改DeleteCustomRss(rssid, title)函数,支持删除订阅源数组,不影响原删除单个,如果是删除单个RSS订阅源就将待删除的RSS订阅源信息填充到添加RSS信息,方便修改再次添加。 3.增加了自定义RSS全部选择和取消选择selectAllCustomRss(selectAll)函数,批量删除选中自定义RSS 函数deleteSelectedCustomRss()。

image

base.zip

cdhigh commented 5 months ago

搞复杂了,我好不容易将按钮都藏起来,现在一下子又多出三个~ 不过删除后将删除的信息添加到文本框以便重新添加这个主意挺好,我会采用这个建议。

appleftg commented 5 months ago

搞复杂了,我好不容易将按钮都藏起来,现在一下子又多出三个~ 不过删除后将删除的信息添加到文本框以便重新添加这个主意挺好,我会采用这个建议。

谢谢采纳,我觉得按钮隐藏不隐藏不是特别重要,一般稳定以后很少登陆管理了。想增加这些批量删除的初衷,说实话,也受到键钮隐藏的影响,一下导入几十个rss源测试,旧版直接点删除按钮就行了,新版要点开隐藏的找到,再确认弹窗,来来回回操作几十次,觉得太麻烦了,所以想直接选中删除,还是希望加入进去。

cdhigh commented 5 months ago

你这个也是特殊情况,也就是测试是用用,以后就不会用了。 要解决此问题,有一个更简单的方法,删除时检查ctrl按键,如果按住ctrl再点击删除,则不用弹出确认对话框,这样就可以快一点。

appleftg commented 5 months ago

你这个也是特殊情况,也就是测试是用用,以后就不会用了。 要解决此问题,有一个更简单的方法,删除时检查ctrl按键,如果按住ctrl再点击删除,则不用弹出确认对话框,这样就可以快一点。

好的,感谢

cdhigh commented 5 months ago

针对这种特殊情况,我还想起很多游戏的作弊码,曾经我收集了很多作弊码。

我们可以在添加自定义rss时如果输入一个特殊的字符串,则全部删除当前自定义rss。

appleftg commented 5 months ago

针对这种特殊情况,我还想起很多游戏的作弊码,曾经我收集了很多作弊码。

我们可以在添加自定义rss时如果输入一个特殊的字符串,则全部删除当前自定义rss。

哈哈,跟分享的小彩蛋样

cdhigh commented 5 months ago

chrome扩展已经上架,之前因权限问题,被拒了一次,返回来重新修改,耽误了几天时间。

在chrome应用商店搜索 "KindleEar"。
或者 直达链接

cdhigh commented 5 months ago

Docker镜像3.0.0d已经更新,如果没有什么问题,这个应该就和正式版一致了。 这几天就发布正式版。

appleftg commented 5 months ago

chrome扩展已经上架,之前因权限问题,被拒了一次,返回来重新修改,耽误了几天时间。

在chrome应用商店搜索 "KindleEar"。 或者 直达链接

辛苦,看到了,测试了,都能正常用,能不能增加个语言选项,上传到KindleEar默认分类到英文里了。

appleftg commented 5 months ago

Docker镜像3.0.0d已经更新,如果没有什么问题,这个应该就和正式版一致了。 这几天就发布正式版。

谢谢,感觉这一版非常完美

cdhigh commented 5 months ago

chrome扩展已经上架,之前因权限问题,被拒了一次,返回来重新修改,耽误了几天时间。 在chrome应用商店搜索 "KindleEar"。 或者 直达链接

辛苦,看到了,测试了,都能正常用,能不能增加个语言选项,上传到KindleEar默认分类到英文里了。

语言是自动探测的,先是看html里面有没有声明语种,如果没有,使用Chrome 自动检测当前网页的语种,可能是Chrome自动检测错误。

不过可以在配置项里增加一个配置,可以选择是自动检测还是强制固定为某一个语种。

appleftg commented 5 months ago

chrome扩展已经上架,之前因权限问题,被拒了一次,返回来重新修改,耽误了几天时间。 在chrome应用商店搜索 "KindleEar"。 或者 直达链接

辛苦,看到了,测试了,都能正常用,能不能增加个语言选项,上传到KindleEar默认分类到英文里了。

语言是自动探测的,先是看html里面有没有声明语种,如果没有,使用Chrome 自动检测当前网页的语种,可能是Chrome自动检测错误。

不过可以在配置项里增加一个配置,可以选择是自动检测还是强制固定为某一个语种。

好想法

appleftg commented 5 months ago

归档保留老版本的二维码分享功能, 我直接修改"/KindleEar/application/lib/calibre/web/feeds/news.py",在append_share_links函数尾,1125行后直接加以下代码,能用,有时候还是蛮方便的。

    # 生成分享二维码   先安装库,pip install qrcode[pil]

    import qrcode
    from io import BytesIO
    from base64 import b64encode

    # 在二维码前添加换行符
    bodyTag.append(soup.new_tag('br'))  # 新增换行符

    qr = qrcode.QRCode(
        version=1,
        error_correction=qrcode.constants.ERROR_CORRECT_L,
        box_size=10,
        border=4,
    )
    qr.add_data(url)
    qr.make(fit=True)

    img = qr.make_image(fill_color="black", back_color="white")
    byte_io = BytesIO()
    img.save(byte_io, 'PNG')
    byte_io.seek(0)
    qr_data = byte_io.read()
    qr_base64 = b64encode(qr_data).decode('utf-8')
    qr_img_tag = soup.new_tag('img', src=f"data:image/png;base64,{qr_base64}")
    bodyTag.append(qr_img_tag)
cdhigh commented 5 months ago

是的,data url是不错的工具,我在kindleear网页中使用了。 为什么没有在电子书里使用是担心兼容性问题,不单单Kindle能推送,很多电子书现在都有推送服务,有些小品牌的和一些老版本的电子书可能对data url兼容不好。 Calibre代码非常复杂,一大部分都是处理兼容性问题。 对这个处理我先放到TODO列表中,待以后研究决定。

appleftg commented 5 months ago

是的,data url是不错的工具,我在kindleear网页中使用了。 为什么没有在电子书里使用是担心兼容性问题,不单单Kindle能推送,很多电子书现在都有推送服务,有些小品牌的和一些老版本的电子书可能对data url兼容不好。 Calibre代码非常复杂,一大部分都是处理兼容性问题。 对这个处理我先放到TODO列表中,待以后研究决定。

好的,也没什么影响,我先这么用着才,谢谢

cdhigh commented 5 months ago

想想其实这个是边缘功能,兼容性不是问题,大不了显示不出来,你这个做法挺好的,要不你提一个pull requests?

cdhigh commented 5 months ago

我终于将收邮件功能在我的VPS上调通了,但是mailglove还是太大,338M,太奢侈了。 所以我就基于alpine,写了一个和它功能基本相同的镜像 kindleear/mailfix,只有一个简单的启动脚本 (参考docker/postfix/install.sh),镜像中只需要安装postfix/curl,直接使用bash脚本转发邮件,不需要其他多余的任何东西,解压后镜像为 26.8M,docker push时显示九百多字节,不到1K,应该显示的是最后一层的大小,所以在Docker hub上都显示不出大小。

使用新的docker-compose.yml或docker-compose-nginx.yml即可使用新的mailfix镜像。

appleftg commented 5 months ago

想想其实这个是边缘功能,兼容性不是问题,大不了显示不出来,你这个做法挺好的,要不你提一个pull requests?

这个估计我做不来,一是pull requests没用过,当然可以学。二主要是我是直接加上去用的没有加归档选项框,加个二维码的归档选项框,还有些其它的文件要改,应该还要改数据库,保存二维码账户选项。

appleftg commented 5 months ago

我终于将收邮件功能在我的VPS上调通了,但是mailglove还是太大,338M,太奢侈了。 所以我就基于alpine,写了一个和它功能基本相同的镜像 kindleear/mailfix,只有一个简单的启动脚本 (参考docker/postfix/install.sh),镜像中只需要安装postfix/curl,直接使用bash脚本转发邮件,不需要其他多余的任何东西,解压后镜像为 26.8M,docker push时显示九百多字节,不到1K,应该显示的是最后一层的大小,所以在Docker hub上都显示不出大小。

使用新的docker-compose.yml或docker-compose-nginx.yml即可使用新的mailfix镜像。

厉害,小了很多,重新部署了,试了,使用正常,嘿嘿

cdhigh commented 5 months ago

我将原来的docker-compose.yml改名为docker-compose-nginx.yml,新增了一个使用caddy的docker-compose.yml,因为我折腾ssl证书折腾了很久,所以我想使用caddy替代nginx还是更有市场一些,caddy的https支持直接开箱即用,不用管什么申请证书续签证书什么的,caddy通通一起搞定。

appleftg commented 5 months ago

nginx

那方便,我一直用nginx,证书用的了docker自动更新,还有一起用的东西,懒得折腾了。