网上找的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: 'yourname@126.com',
            pass: 'SMTP授权码'
        }
    })
    const info = await transporter.sendMail({
        from: '"邮箱昵称"<yourname@126.com>',
        to: 'receiver@163.com',
        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: '"邮箱昵称"<yourname@126.com>',
        to: 'receiver@163.com',
        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封还免费:链接直达

添加新评论