【问题标题】:Meteor: How to get account password reset token only, no emailMeteor:如何仅获取帐户密码重置令牌,没有电子邮件
【发布时间】:2015-12-07 21:11:04
【问题描述】:

我希望使用 sendgrid 模板发送帐户密码重置电子邮件。

所以基本上不是使用函数Accounts.sendResetPasswordEmail 我需要函数Accounts.getResetPasswordURL

这将为我提供一个密码重置 URL,我可以使用该 URL 发送到将在模板中使用的 sendgrid。

那么我该怎么做呢?如何使用 Meteor 仅获取密码重置 URL 但实际上不发送电子邮件?我将使用对 sendgrid 的 API 调用手动发送带有 URL 的电子邮件。

【问题讨论】:

  • 验证电子邮件也是如此。我也想通过 sendgrid 发送它。所以我需要一个函数来获取特定用户的 URL,然后我会将该 URL 传递给 sendgrid 模板。
  • 您是否正在使用某种软件包通过 sendgrid 发送电子邮件?我想看看它有什么样的功能。
  • 我正在寻找使用流星的内置系统,我只是不想让流星发送实际的电子邮件,我只想获取流星在电子邮件中发送的链接。

标签: meteor meteor-accounts


【解决方案1】:

注意:我没有使用过 sendgrid,所以我会选择API over here

首先,您想将 Meteor 配置为使用 Sendgrid's SMTP servers。这样,您可以直接通过 Meteor 发送电子邮件:

Meteor.startup(function(){
    process.env.MAIL_URL = "smtp://" + sendgridUsername + ":" + sendgridPasswordOrAPIkey + "@smtp.sendgrid.net:465";
});

您可以更改重置电子邮件的默认模板。这可以通过修改Accounts.emailTemplates来完成:

Accounts.emailTemplates.resetPassword.html = function(user, url){
    // url contains the reset url! :)
    var result;
    var sendgridTemplateId = ''; // Set this to the template id you're using in sendgrid
    try {
        // Get sendgrid template
        // API link: https://sendgrid.com/docs/API_Reference/Web_API_v3/Template_Engine/templates.html
        result = HTTP.get("https://api.sendgrid.com/v3/templates/" + sendgridTemplateId);
        result = result.data.templates[0].versions[0].html_content;
        // then insert URL to the template
    } catch (error) {
        console.error('Error while fetching sendgrid template!', error);
        return false;
    }
    return result;
};

现在当您使用Accounts.sendResetPasswordEmail() 时,将使用上面的模板,它实际上只是获取 sendgrid 模板并返回它!

【讨论】:

  • @nearpoint 另外,我调查了一下,我认为 sendgrid 不允许您在获取模板时传入变量。因此,您必须自己替换 HTML 内容中的 url,或者如果您知道获取模板的更好方法(并传入 url),请告诉我,以便我更新答案。大多数其他服务允许您在获取模板时传入变量,因此通常更简单(我在自己的应用程序中也使用此方法)。
  • 你是对的!我问了 sendgrid,你不能传入一个变量。但是它们确实保留了 --URL-- 这样的替换变量,因此我可以自己轻松地解析内容并使用 replace 方法将 --URL- 替换为真实的 URL。
  • @nearpoint 另外,在我自己的应用程序中,我为这种方法实现了一个简单的缓存。通常,电子邮件模板不会经常更改,但如果您有很多用户,HTTP.get() 可能会产生一些开销。因此将响应缓存一段时间是明智的。 Sendgrid 有一个 SMTP API,也许可以使用它,但为此您必须深入研究 email 包,看看它是否可以实现。我现在没有时间,但这是一个值得探索的想法。
  • 啊,是的,这是个好主意。我应该将模板缓存在数据库中或其他东西中。也许在管理界面中创建一个按钮,以便在我单击它时手动重新获取模板。
  • @nearpoint 如果你很懒,没有太多模板,你可以在 Javascript 中使用变量(以模板 id 作为键,以 html 内容作为值的对象)将它们缓存在内存中.应该更容易实现。如果您有很多模板,那么它可能会占用太多内存,并且将它们缓存在数据库中肯定会更好。如果 sendgrid 有 webhook,您甚至可以仅在模板实际更改时才更新缓存。只是给你的想法:P
【解决方案2】:

目前执行该程序的方式实际上不可能做到这一点。

accounts-password 包生成一个随机令牌并以sendResetPasswordEmail() 方法发送电子邮件。

您可以分叉包,按照in the original method 的方式生成自己的令牌,或者更改email 包的行为以自行处理电子邮件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-12
    相关资源
    最近更新 更多