分类 默认分类 下的文章

网上找的node发邮件,用到最多的是nodemailer,于是利用百度出来的代码,直接运行在uniCloud,本地运行发送成功,但是云端一直报错。
仔细看了报错内容,提到Thread,所以猜测代码里新建了线程去发邮件。
为了找到如何用当前线程发,第一时间想到的是nodemailer的官方文档:https://nodemailer.com/about/
结合官方文档,写了个可以在uniCloud云端正常发邮件,并且亲测成功的代码:

'use strict';
const nodemailer = require('nodemailer') // 使用前先npm install nodemailer
exports.main = async (event, context) => {
    let transporter = nodemailer.createTransport({
        host: 'smtp.126.com',
        secureConnection: true,
        port: 465,
        secure: true,
        auth: {
            user: '[email protected]',
            pass: 'SMTP授权码'
        }
    })
    const info = await transporter.sendMail({
        from: '"邮箱昵称"<[email protected]>',
        to: '[email protected]',
        subject: '主题',
        html: '<h1>HTML代码</h1>',
        text: '文本'
    })
    if (info.messageId) {
        return {code: 0, msg: '发送成功'}
    } else {
        return {code: 1, msg: '发送失败', info}
    }
}

代码里最关键的是await transporter.sendMail这行,这样写才是在当前线程发

百度上找到的大部分人是这么写的:

transporter.sendMail(
    {
        from: '"邮箱昵称"<[email protected]>',
        to: '[email protected]',
        subject: '主题',
        html: '<h1>HTML代码</h1>',
        text: '文本'
    },
    (error, info) => {
        if (error) {
            return console.error(error);
        }
        console.info(info)
    }
)

这样写的话会新建线程,这在普通的node环境当然没错,但是uniCloud却报了关于线程的错误,猜测是uniCloud不允许多线程

据说163或者126之类的普通邮箱,个人SMTP每天最多只能发50封,所以如果你是用在项目里,可以考虑阿里云的邮件推送,到达率高,速度快,而且又便宜,每日前200封还免费:链接直达

目前已知两种视频切片,一个是m3u8,一个是mpd

mp4转m3u8的命令:

ffmpeg -i principles.mp4 -vcodec copy -acodec copy -hls_time 360 -hls_list_size 0 index.m3u8

加密的m3u8视频:
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni4934e7b/50b072b0-6124-11eb-a16f-5b3e54966275.m3u8

未加密的m3u8视频:
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni4934e7b/53b1e0f0-6126-11eb-bdc1-8bd33eb6adaa.m3u8
https://vkceyugu.cdn.bspapp.com/VKCEYUGU-d420af8e-bb77-43b2-89e4-7bd5880cf860/158f758c-ebe7-4a4e-8c52-a2d22c73b449.m3u8 (74.8MB)

利用ffmpeg命令可以直接保存m3u8到本地mp4:

ffmpeg -i https://vkceyugu.cdn.bspapp.com/VKCEYUGU-uni4934e7b/50b072b0-6124-11eb-a16f-5b3e54966275.m3u8 -c copy C:/Users/John/Desktop/output.mp4

将mp4转为mpd的命令:

ffmpeg -i wolf.mp4 -c copy -f dash -min_seg_duration 60000000 wolf.mpd

mpd的例子:
https://static-b905bdbb-5254-4483-af4c-16e5bf477a2e.bspapp.com/mpd/wolf.mpd

网页播放mpd文件需要dashjs,示例:
https://static-b905bdbb-5254-4483-af4c-16e5bf477a2e.bspapp.com/mpd/dash.html

下载方式跟m3u8一样:

ffmpeg -i https://static-b905bdbb-5254-4483-af4c-16e5bf477a2e.bspapp.com/mpd/wolf.mpd -c copy C:/Users/John/Desktop/output.mp4

需要主意的是,这个命令在windows版ffmpeg 4.3版本无效,在windows版4.2.2上是效,但在Mac版4.2.2也无效
此外,测试“ffmpeg version 4.4-full_build-www.gyan.dev”这个版本也可以下载

今天是2020年最后一天,买了7台华为云非大陆300Mbps带宽的服务器,用于对比

imgbed.cn图床

测试数据如下:

地区国内平均ping值下载速度
香港58ms8MB/s
曼谷119ms8MB/s
新加坡89ms8MB/s
非洲428ms6KB/s
墨西哥311ms9KB/s
圣保罗395ms8KB/s
圣地亚哥387ms7KB/s

ping值为电信、移动、联通三网的均值。

下载速度测法:

  • 服务器放个100MB的zip文件,本地浏览器下载,南方电信宽带,8MB/s应该是我带宽和笔记本wifi的限制,抛开限制,下载速度应该可以更大。
  • 用华为云贵阳服务器去wget测下载,曼谷和新加坡只有100KB/s左右,香港1MB/s,从这点来看,还是香港比较好。

如果只考虑下载速度,南方买曼谷、香港、新加坡都差不多,再考虑ping值和全国速度的话,香港首选。

国内使用的话,亚太地区以外强烈不建议入手。

2021.01.13增加脚本测试如下:
imgbed.cn图床

imgbed.cn图床

imgbed.cn图床

imgbed.cn图床

imgbed.cn图床

有个项目需要获取上个月的“年-月”,用了php的这个方法:

date( 'Y-m', strtotime('-1 month') )

今天2020年12月31日,发现上述函数给出的结果是2020-12,仔细研究了一下,原来是php的bug:

echo date('Y-m-d', strtotime('-1 month', strtotime('2019-03-31')));
// 输出2019-03-03,非闰年,扣28天

echo date('Y-m-d', strtotime('-1 month', strtotime('2020-03-31')));
// 输出2019-03-02,闰年,扣29天

echo date('Y-m-d', strtotime('-1 month', strtotime('2020-06-30')));
// 输出2020-05-30,扣30天,这个正常

echo date('Y-m-d', strtotime('-1 month', strtotime('2020-05-31')));
// 输出2020-05-01,遇到有31天的月份依然扣30天

这个bug总结起来就是:

  • 在3月份,如果当年是闰年,则执行'-1 month'一股脑减29天,非闰年一股脑减28天。
  • 在非3月份,全部一股脑减30天。

结合“一三五七八十腊,三十一天永不差”,最后总结,正确地获取上个月“年-月”的姿势为:

date('Y-m', strtotime('-1 month', strtotime(date('Y-m'))))

也就是用每月1日为基准去扣天数。