跳至内容

邮件

email 包允许从 Meteor 应用发送邮件。要使用它,请在终端中运行以下命令将其添加到您的项目中

bash
meteor add email

有两种方法可以设置用于发送电子邮件的包。

首先是设置 MAIL_URL。服务器从 MAIL_URL 环境变量读取以确定如何发送邮件。MAIL_URL 应引用一个 SMTP 服务器并使用 smtp://USERNAME:PASSWORD@HOST:PORTsmtps://USERNAME:PASSWORD@HOST:PORT 格式。如果邮件服务器需要 TLS/SSL(并且不使用 STARTTLS),则应使用 smtps:// 格式(s 代表“安全”),并且在端口 465 上最常见。在升级到 TLS/SSL(使用 STARTTLS)之前以未加密方式开始的连接通常使用端口 587(并且有时为 25),并且应使用 smtp://。有关更多信息,请参阅 Nodemailer 文档

其次,如果您使用的是 受支持的服务 之一,您可以在应用设置中这样设置发送选项

json
{
  "packages": {
    "email": {
      "service": "Mailgun",
      "user": "postmaster@meteor.com",
      "password": "superDuperPassword"
    }
  }
}

该包将负责其余的工作。

如果您使用受支持的服务,该包将尝试匹配受支持的服务并使用存储的设置。您可以通过将协议(如 smtp)切换为服务名称来强制执行此操作。但是,您应该仅将其用作权宜之计,而应正确设置设置。

如果未设置这两个选项,则 Email.send 会将消息输出到标准输出。

包设置仅在 Email v2.2 及更高版本中可用

Email.send

仅限服务器

摘要

使用异步方法发送电子邮件。捕获在无法联系邮件服务器或邮件服务器返回错误时抛出的 Error。所有字段应匹配 RFC5322 规范。

如果设置了 MAIL_URL 环境变量,则实际发送电子邮件。否则,将电子邮件内容打印到标准输出。

请注意,此包基于 nodemailer,因此在使用 attachmentsmailComposer 选项时,请务必参考 文档

参数

源代码
名称类型描述必需
options对象

选项

名称类型描述必需
from字符串

"发件人:"地址(必需)

to, cc, bcc, replyTo字符串

"收件人:""抄送:""密送:"和"回复到:"地址

inReplyTo字符串

此邮件正在回复的邮件 ID

references字符串

要引用的邮件 ID 数组(或以空格分隔的字符串)

messageId字符串

此邮件的邮件 ID;否则,将设置为随机值

subject字符串

"主题:"行

text, html字符串

邮件正文(纯文本和/或 HTML)

watchHtml字符串

Apple Watch 特定的 HTML 格式邮件正文

icalEvent字符串

iCalendar 事件附件

headers对象

自定义标头的字典 - 例如 { "header name": "header value" }。要在标头名称下设置对象,请使用 JSON.stringify - 例如 { "header name": JSON.stringify({ tracking: { level: 'full' } }) }

attachmentsArray.<Object>

附件对象的数组,如 nodemailer 文档 中所述。

mailComposerMailComposer

表示要发送的消息的 MailComposer 对象。覆盖所有其他选项。您可以通过 new EmailInternals.NpmModules.mailcomposer.module 创建 MailComposer 对象。

encryptionKeys字符串

包含用于加密的公钥的数组。

shouldSign字符串

允许您允许或不允许电子邮件签名。

您必须提供 from 选项,以及 toccbcc 中的至少一个;所有其他选项都是可选的。

Email.send 仅在服务器上有效。以下是如何客户端使用服务器方法调用发送电子邮件的示例。(在实际应用中,您需要小心限制客户端可以发送的电子邮件,以防止您的服务器被垃圾邮件发送者用作中继。)

js
import { Meteor } from "meteor/meteor";
import { Email } from "meteor/email";
import { check } from "meteor/check";
// Server: Define a method that the client can call.
Meteor.methods({
  sendEmail({ to, from, subject, text }) {
    // Make sure that all arguments are strings.
    check([to, from, subject, text], [String]);

    Email.send({ to, from, subject, text });
  },
});
js
import { Meteor } from "meteor/meteor";
// Client: Asynchronously send an email.
Meteor.callAsync("sendEmail", {
  to: "Alice <alice@example.com>",
  from: "bob@example.com",
  subject: "Hello from Meteor!",
  text: "This is a test of Email.send.",
});

Email.sendAsync

仅限服务器

摘要

使用异步方法发送电子邮件。捕获在无法联系邮件服务器或邮件服务器返回错误时抛出的 Error。所有字段应匹配 RFC5322 规范。

如果设置了 MAIL_URL 环境变量,则实际发送电子邮件。否则,将电子邮件内容打印到标准输出。

请注意,此包基于 nodemailer,因此在使用 attachmentsmailComposer 选项时,请务必参考 文档

参数

源代码
名称类型描述必需
options对象

选项

名称类型描述必需
from字符串

"发件人:"地址(必需)

to, cc, bcc, replyTo字符串

"收件人:""抄送:""密送:"和"回复到:"地址

inReplyTo字符串

此邮件正在回复的邮件 ID

references字符串

要引用的邮件 ID 数组(或以空格分隔的字符串)

messageId字符串

此邮件的邮件 ID;否则,将设置为随机值

subject字符串

"主题:"行

text, html字符串

邮件正文(纯文本和/或 HTML)

watchHtml字符串

Apple Watch 特定的 HTML 格式邮件正文

icalEvent字符串

iCalendar 事件附件

headers对象

自定义标头的字典 - 例如 { "header name": "header value" }。要在标头名称下设置对象,请使用 JSON.stringify - 例如 { "header name": JSON.stringify({ tracking: { level: 'full' } }) }

attachmentsArray.<Object>

附件对象的数组,如 nodemailer 文档 中所述。

mailComposerMailComposer

表示要发送的消息的 MailComposer 对象。覆盖所有其他选项。您可以通过 new EmailInternals.NpmModules.mailcomposer.module 创建 MailComposer 对象。

sendAsync 仅在服务器上有效。它的行为与 Email.send 相同,但返回一个 Promise。如果您定义了 Email.customTransport,则 callAsync 方法将返回 customTransport 方法的返回值或 Promise(如果此方法是异步的)。

js
// Server: Define a method that the client can call.
Meteor.methods({
  sendEmail({ to, from, subject, text }) {
    // Make sure that all arguments are strings.
    check([to, from, subject, text], [String]);

    return Email.sendAsync({ to, from, subject, text }).catch((err) => {
      // do something with the error
    });
  },
});

Email.hookSend

仅限服务器

摘要

在发送电子邮件之前运行的钩子。

参数

源代码
名称类型描述必需
f函数

接收 Email.send 的参数,并应返回 true 以继续发送电子邮件(或至少尝试后续钩子),或返回 false 以跳过发送。

js
import { Email } from 'meteor/email'

Email.hookSend(({to}) => {
  if (to === 'ceo@company.com') {
    console.log(`Let's not send email to the CEO`);
    return false;
  }
  return true;
})

如果您想要:阻止发送某些电子邮件,通过您自己的集成而不是 Meteor 提供的默认集成发送电子邮件,或者对数据执行其他操作,则 hookSend 是一个方便的钩子。如果您想拦截由核心包(如 accounts-password 或其他无法修改电子邮件代码的包)发送的电子邮件,这尤其有用。

钩子函数将接收一个包含 Nodemailer 选项的对象。

Email.customTransport

仅限服务器

摘要

使用您自己的函数覆盖发送函数。

参数

源代码
名称类型描述必需
f函数

将接收来自发送函数的选项的函数,并且在 packageSettings 下将包含来自 Meteor.settings.packages.email 的包设置,以供您的自定义传输访问。

Email.customTransport 仅在 Email v2.2 及更高版本中可用

在某些情况下,您有自己的传输设置,无论是您的邮件服务的 SDK 还是其他内容。这就是 customTransport 发挥作用的地方。如果您设置了此函数,所有发送事件都将传递给它(在运行 hookSend 之后),并带有传递给 send 函数的选项对象以及 packageSettings 键,该键将传递您应用设置中设置的包设置(如果有)。您可以在该函数中执行任何操作,因为它将覆盖原始发送函数。

这是一个使用 Mailgun 的简单示例

javascript
import { Email } from 'meteor/email'
import { Log } from 'meteor/logging'
import Mailgun from 'mailgun-js'

Email.customTransport = (data) => {
  // `options.packageSettings` are settings from `Meteor.settings.packages.email`
  // The rest of the options are from Email.send options
  const mailgun = Mailgun({ apiKey: data.packageSettings.mailgun.privateKey, domain: 'mg.mygreatapp.com' })

  // Since the data object that we receive already includes the correct key names for sending
  // we can just pass it to the mailgun sending message.
  mailgun.messages().send(data, (error, body) => {
    if (error) Log.error(error)
    if (body) Log.info(body)
  })
}

请注意,这也会覆盖控制台中消息的开发显示,因此您可能希望在设置此函数时区分生产和开发环境。