关于邮件系统的选择问题和采坑

类似的教程网上已有很多,并且Valine-Admin的官方教程就写的不错。接下来我侧重讲讲我自己遇到的坑,主要是邮件系统选择的坑。

评论要启用邮件通知,那么必须要指定一个邮箱号并且开启SMTP,所以我第一个就排除了QQ邮箱。一来QQ邮箱需要绑定手机并且发送短信才可以配置SMTP,而且看V2上面有不少人说之前开启的SMTP被腾讯自动给关闭了。

估计是为了安全,但不知道他们被关的QQ邮箱绑定了手机号没有,估计不绑定手机的应该也不多了吧!暂且不说这个,于是我就捣鼓谷歌邮箱开启IMAP,结果在Leancloud的云引擎上看的日志是STMP配置失败,估计是Gmail为了安全启阻止了登录。

插入一段,后来, 经过摸索和练习,发现在https://myaccount.google.com/lesssecureapps开启安全性较低的应用的访问权限,同时在https://accounts.google.com/DisplayUnlockCaptcha允许新的登录,日志查看是成功的,最后测试也是可行的。

好,那就做罢!于是就想着用毛子的邮箱,先是试了下mail.ru,用Chrome自带翻译都没法翻译,作罢!于是就继续折腾Yandex,开启SMTP后,最终部署成功。

遂自行测试,用的是网易邮箱,发现第一次评论有通知推送,第二次就没有了,查看日志显示Message rejected under suspicion of SPAM,嘞个去,被识别为垃圾邮件并且在垃圾箱都无法找到,又测试QQ邮箱,发现也一样,并且在QQ邮箱中的收件查询中都查不到拦截记录。

哎,一开始我以为是yandex.ru之类的域名问题,那就自建域名邮箱吧,当然还是用Yandex来自建,结果发现一样,还是被拦截了,并且在DNS中有添加v=spf1 redirect=_spf.yandex.net这样的记录,难道是生效时间要几天?

本来想着是等几天看看会不会有好转,后面用https://www.mail-tester.com测试一下邮件,发送测试邮件居然要验证码,而且验证码模糊不清,分不清是俄文字母还是英文字母(最讨厌Yandex有时候登录显示俄文验证码,之前遇到过,体验极度不友好),不知道是发送邮件的地址问题,还是Yandex对我邮件内容识别的问题,折腾了这么久没什么耐心了,一气之下直接删除了域名解析!

于是又辗转ZOHO看看,体验一番后,有些UI界面感觉是十年前的样式,在验证spf的时候好几分钟都无法验证,印象并不好,最关键的是用国际版也要绑定手机号,这就很没意思了,要绑定手机号我直接用国内的邮箱就好了。

搞这么多,不就是为了不想验证手机吗?于是又想起了阿里云邮箱,结果验证失败。阿里云的域名邮箱倒是可以的,我最开始就是拿着阿里云域名邮箱测试非常顺利,后面才想着用GmailYandex。至于雅虎,没找到在哪里开启SMTP因此放弃了,本来想试一下Outlook的,最终想了想还是算了,就挑选了个QQ邮箱,发短信配置好了。

阿里云域名邮箱(企业邮箱)是支持的,但阿里云个人邮箱不支持,因为两者的SMTP地址不一样,企业邮箱的SMTP为smtp.mxhichina.com,个人版的为smtp.aliyun.com,如需要使用,可自定义邮件服务器地址和端口信息,具体信息在文章末尾。

为什么不想验证手机,逻辑是这样的。因为Leancloud用的是国际版,为什么用国际版Leancloud呢?因为9月6号发现,国内节点要实名认证,不然在20几号就停止账户下的应用,于是我立马就把评论转移到国际节点,之前因为在《hexo主题更新和valine评论系统问题》中遇到过华东节点好几天都无法使用而注册了国际节点。

根据国家《网络安全法》第 24 条,使用 LeanCloud 服务的用户必须进行实名认证。请在 2020 年 9 月 21 日前登录 LeanCloud 控制台完成实名认证。届时我们将禁用仍未完成实名认证的用户名下的应用。

所以,我想着,评论系统的邮件账户,也优先考虑国际的,不代表国际的有多好,纯碎是因为不需要验证手机。因为域名没有备案,用的Leancloud也没有实名,不想在邮箱上验证手机。

不过最终还是败给了国内邮件服务商的识别技术,Yandex这种在国内是小众角色的还是不能考虑,因此我也就没有继续折腾其他的域名邮箱了,怕折腾到后面,结果还是被识别为垃圾邮件,并且在垃圾箱都无法找到的那种。

为Valine评论开启邮件推送

首先参考https://github.com/DesertsP/Valine-Admin,然后在做之前你的博客系统已经是用了Valine评论系统的,因为这是直接操作Leancloud,跟你的Hexo,Hugo是没关系的,唯一确保你的博客是在用Valine

我这里以国际版为例,在Leancloud中找到云引擎→部署→部署项目点击,然后选择Git部署→配置Git,填写https://github.com/DesertsP/Valine-Admin.git保存,然后云引擎→部署→部署项目→Git部署下/手动部署点击部署一次,而上面链接的教程说的是设置界面,设置界面是用来自定义环境变量这一步骤使用的。

接着是在云引擎→设置→云引擎域名这里添加一个域名吧,这个域名通过https://你自定义的名字.avosapps.us/sign-up访问即可注册,然后登录可查看并删减评论,不过我更喜欢直接操作数据库来完成。

然后点击上面的添加环境变量如下(下面环境变量表格说明摘自官方文档)

变量 示例 说明
SITE_NAME Deserts [必填]博客名称
SITE_URL https://www.tangruiping.com [必填]首页地址
SMTP_SERVICE QQ [新版支持]邮件服务提供商,支持 QQ、163、126、Gmail 以及 更多
SMTP_USER xxxxxx@qq.com [必填]SMTP登录用户
SMTP_PASS ccxxxxxxxxch [必填]SMTP登录密码(QQ邮箱需要获取独立密码)
SENDER_NAME Deserts [必填]发件人
SENDER_EMAIL xxxxxx@qq.com [必填]发件邮箱
ADMIN_URL https://xxx.leanapp.cn/ [建议]Web主机二级域名,用于自动唤醒
BLOGGER_EMAIL xxxxx@gmail.com [可选]博主通知收件地址,默认使用SENDER_EMAIL
AKISMET_KEY xxxxxxxxxxxx [可选]Akismet Key 用于垃圾评论检测,设为MANUAL_REVIEW开启人工审核,留空不使用反垃圾

我的配置完成如下图,我这里配置的是QQ邮箱,所以SMTP_PASS密码填写需要注意下,应该说是SMTP之类的授权码。另外,BLOGGER_EMAIL也推荐配置一下,这个是用来接收评论的,不填写则默认跟发送评论是一个邮箱。

如果日志中出现失败的情况,你得考虑是不是QQ异地保护之类的玩意限制了,又或者改了QQ密码或QQ邮箱独立密码,都会导致授权码过期。

Leancloud云引擎环境变量

因为Leancloud免费版是会休眠的,因此还需要设置一下定时任务。创建定时任务,名称为半小时唤醒,函数选择self-wakeCron表达式0 */30 0-16 * * ?

再创建一个任务,名为每天8点检查失败的邮件补发,函数选择resend-mailsCron表达式0 0 0 * * ?

如下是我设置好的截图,因为国际版的UTC时间,因此要减去8小时。

Leancloud定时任务

然后你在返回到上面的部署,重新部署一次。测试评论看看OK不,记得查看日志,不然被拦截了都不知道。每次修改了环境变量,都需要重新部署才可以生效。

重新部署一次

一直不愿意搞这个系统,因为增加了维护成本。然而上个月有用户评论,过了十天我才发现,而且就算回复他,人家也收不到回复信息。

我自己也有过这样的感受,如果没有推送信息,一般人是不可能去主动访问这个页面看看有没有信息回复,除非是特别重要的问题交流。

又于4号换了主题,这个主题在配置中就可定义Valine的必填字段,如nick,mail,因此要评论必须得填写邮箱,配合这个系统也就变得合理了。

最后再说一点,因为leancloud免费版限制的比较死,具体策略可到此查看休眠策略

我大概是早上9点这样开始运行,到现在晚上6点,已经出现因流控原因,通过定时任务唤醒体验版实例失败,建议升级至标准版云引擎实例避免休眠

为什么出现这个状况呢?不是说免费有6小时的强制休眠吗?这里还每到最大额度限度呢!后面发现,是因为用函数来唤醒免费实例的人太多了,因此官方就对函数做了流控限制。毕竟是家小公司,禁不起大家这么去薅。

因此可以考虑用其他服务商的云函数写个访问评论后台管理地址,定时去访问(唤醒)一次,后面就无需再次唤醒,可以交给先前的leancloud的定时任务即可。当然,如果项目开发者能够用其他云商的函数计算服务处理这个事情的话,那就更好了,阿里云的函数计算,腾讯的云函数,免费额度都还挺多的。

出错的信息可在云引擎→日志中查看,请求失败的可在云引擎→统计中查看。

最后,为了安全考虑,你还可以根据本章教程《Hexo博客Valine评论系统IP邮箱泄露问题和解决方法》去设置,以免泄露评论者的邮箱和IP地址。

leancloud欠费

昨天不小心开错了实例,开的是云引擎→LeanDB→LeanCache下的实例,后面关了,今天下午一看发现欠费0.4美元,关键是国际版不支持国内的支付方式,没办法,只好丢弃了那个账户,重新来过。希望各位不要开错,或者随意开一些自己不了解的东西,以免产生费用问题。

自定义邮件服务器地址

删除SMTP_SERVICE环境变量,新增以下变量。

变量 示例 说明
SMTP_HOST smtp.aliyun.com [可选]SMTP_SERVICE留空时,自定义SMTP服务器地址
SMTP_PORT 465 [可选]SMTP_SERVICE留空时,自定义SMTP端口
SMTP_SECURE true [可选]SMTP_SERVICE留空时填写

这样做的好处是什么?比如你自建域名邮箱(阿里云企业邮箱默认即支持,无需自定义),或者用阿里云邮件推送,就需要用到自定义邮件服务器地址了,默认的支持范围有限。

邮箱服务 SMTP地址 服务器端口号(非加密) 服务器端口号(SSL加密)
阿里云邮箱个人版 smtp.aliyun.com 25 465
阿里云邮箱企业版 smtp.mxhichina.com 25 465
阿里云邮件推送(华东杭州) smtpdm.aliyun.com 默认禁用 465
阿里云邮件推送(新加坡) smtpdm-ap-southeast-1.aliyun.com 默认禁用 465
阿里云邮件推送(悉尼) smtpdm-ap-southeast-2.aliyun.com 默认禁用 465

而阿里云邮件推送,每天200封免费额度,对个人站点来说,足够用了。

关于LeanCloud存储服务数据已归档问题

当你的博客valine评论系统出现如下问题时 Code 504: The app is archived, please restore in console before use. [400 GET https://us.avoscloud.com/1.1/classes/Comment] 很可能是因为超过30天没有访问,导致LeanCloud为你的数据做了归档处理以节省服务器资源,打开LeanCloud控制台主页激活即可,如图下图所示,随后会提示应用恢复中,该操作大约需要 10-30 分钟,实际测试立马即可使用。

LeanCloud存储服务数据已归档

有兴趣的朋友可点击这里查看错误码详解 - LeanCloud 文档说明。

  • 信息 - The app is archived, please restore in console before use.
  • 含义 - 应用结构化数据存储长时期无访问被归档,请访问 LeanCloud 控制台自助激活。如果激活遇到问题,请通过工单、论坛联系我们处理。