【问题标题】:Node.js nodemailer error - wrong version number/invalid greetingNode.js nodemailer 错误 - 错误的版本号/无效的问候
【发布时间】:2022-04-09 17:43:51
【问题描述】:

在我的 node.js 服务器上设置 nodemailer 时遇到了一个大问题。尝试了我在互联网上找到的所有内容,但没有任何效果。唯一易于设置的是 gmail 服务。但不幸的是我不能使用那个。

secure 设置为 true,我收到一个 ssl 错误,原因是 版本代码错误

[Error: 22468:error:1408F10B:SSL routines:ssl3_get_record:wrong version number:c:\ws\deps\openssl\openssl\ssl\record\ssl3_record.c:332:
] {
  library: 'SSL routines',
  function: 'ssl3_get_record',
  reason: 'wrong version number',
  code: 'ESOCKET',
  command: 'CONN'
}

但是当我尝试将 secure 设置为 false 时,我会收到 invalid greeting 错误

Error: Invalid greeting. response=* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2016 Double Precision, Inc.  See COPYING for distribution information.: * OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2016 Double Precision, Inc.  See COPYING for distribution information.
    at SMTPConnection._actionGreeting (C:\Users\Motiondata\Documents\repos\rmn_app\server\rmn_server\node_modules\nodemailer\lib\smtp-connection\index.js:1189:27)
    at SMTPConnection._processResponse (C:\Users\Motiondata\Documents\repos\rmn_app\server\rmn_server\node_modules\nodemailer\lib\smtp-connection\index.js:932:20)
    at SMTPConnection._onData (C:\Users\Motiondata\Documents\repos\rmn_app\server\rmn_server\node_modules\nodemailer\lib\smtp-connection\index.js:739:14)
    at Socket.SMTPConnection._onSocketData (C:\Users\Motiondata\Documents\repos\rmn_app\server\rmn_server\node_modules\nodemailer\lib\smtp-connection\index.js:189:44)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:309:12)
    at readableAddChunk (_stream_readable.js:284:9)
    at Socket.Readable.push (_stream_readable.js:223:10)
    at TCP.onStreamRead (internal/stream_base_commons.js:188:23) {
  code: 'EPROTOCOL',
  response: '* OK [CAPABILITY IMAP4rev1 UIDPLUS CHILDREN NAMESPACE THREAD=ORDEREDSUBJECT THREAD=REFERENCES SORT QUOTA ACL ACL2=UNION STARTTLS] Courier-IMAP ready. Copyright 1998-2016 Double Precision, Inc.  See COPYING for distribution information.',
  command: 'CONN'
}

我的代码如下:

const transporter = nodemailer.createTransport({
  host: process.env.MAIL_HOST, // mx.example.com
  port: process.env.MAIL_PORT, // 143
  secure: true,
  auth: {
    user: process.env.MAIL_ADDRESS,
    pass: process.env.MAIL_PWD
  }
})

我检查了凭据一千次,它们绝对不是问题。

希望任何人都可以帮助我。 提前致谢。

【问题讨论】:

  • 我认为这与您的提供商(firebase、outlook 或其他)有关,请检查您的提供商支持的主机和端口,看看您是否需要为此做一些额外的配置。
  • 但是当我在 Outlook 中使用完全相同的主机和端口时,一切正常。这对我来说真的很奇怪。

标签: node.js nodemailer


【解决方案1】:

参考这里提到的这个问题:https://github.com/andris9/Nodemailer/issues/165

看看这是否有帮助,添加tls.ciphers 选项以使用SSLv3

const transport = nodemailer.createTransport({
    host: process.env.MAIL_HOST, // mx.example.com
    port: process.env.MAIL_PORT, // 143
    secureConnection: false, // TLS requires secureConnection to be false
    auth: {
        user: process.env.MAIL_ADDRESS,
        pass: process.env.MAIL_PWD
    },
    tls: {
        ciphers:'SSLv3'
    }
});

对于 Outlook365,这应该可以:

service: "Outlook365",
auth: {
   user: '[YOUR_O365_EMAIL]',
   pass: '[YOUR_O365_PASSWORD]'
}, 

参考这里:https://stackoverflow.com/a/37725123/9360885

如果您使用的是 HotMail,请删除 hostport,然后添加 service: "hotmail"

【讨论】:

  • 仅添加secureConnection 和tls 也不起作用。我猜想字符串'SMTP'不能在较新版本的nodemailer中使用,因为如果我把它放在那里它会给我一个错误。
  • 您使用的是outlook365?
  • 不,它实际上是一个本地邮件服务器。但它不是我的,它是我认识的一家公司。我刚刚测试了将邮件地址添加到 Outlook 以确认凭据。
  • 好的,我又添加了一个指向 stackoverflow 答案的链接,看看这是否有帮助:stackoverflow.com/a/62267653/9360885
  • 对于本地服务器,除非您拥有该本地服务器的安全证书,否则您不需要secure true
【解决方案2】:

使用

secure: false, // true for 465, false for other ports

来自 nodemailer 文档的示例:

let transporter = nodemailer.createTransport({
    host: 'smtp.ethereal.email',
    port: 587,
    secure: false, // true for 465, false for other ports
    auth: {
        user: account.user, // generated ethereal user
        pass: account.pass  // generated ethereal password
    }
});

来源:nodemailer examples

【讨论】:

  • 这相当于说“我无法解锁门,我该怎么办?- 移除门”
  • 它正在工作。但这是一个令人困惑的参数。如果仅对 465 安全,只需删除参数并在内部设置。 :)
【解决方案3】:

我在 Gmail 中使用了 465 端口,这很有效。收到 587 的“错误版本号”错误。以下示例适用于 Cloud Function 中的 GCP 服务帐户。

  const transporter = nodemailer.createTransport({
    host: "smtp.gmail.com",
    port: 465,
    secure: true,
    auth: {
      type: "OAuth2",
      user: process.env.GMAIL_ADDRESS,
      serviceClient: process.env.CLIENT_ID,
      privateKey: process.env.PRIVATE_KEY.replace(/\\n/g, "\n"),
    },
  });

【讨论】:

    【解决方案4】:

    如果您仍然收到问题,请在登录时手动将其输入浏览器来解决。

    https://accounts.google.com/DisplayUnlockCaptcha

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
    【解决方案5】:

    我也遇到过这个问题。但我设法解决了它。 解决起来很简单。

    解决方案: port: process.env.MAIL_PORT * 1

    这会将您的 process.env.MAIL_PORT 类型从字符串更改为 integer

    为什么会出现错误?

    NodeMail 需要一个类型为 integer 的端口,但您传递的是一个字符串。所以导致了一个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-22
      • 2021-07-23
      • 2017-06-09
      • 2022-01-22
      • 2021-06-27
      • 1970-01-01
      • 2018-02-26
      • 2018-06-16
      相关资源
      最近更新 更多