使用 Meteor 和 Mailgun 恢复密码

Posted

技术标签:

【中文标题】使用 Meteor 和 Mailgun 恢复密码【英文标题】:Recover password with Meteor and Mailgun 【发布时间】:2016-04-05 11:24:19 【问题描述】:

我正在使用自己的用户帐户系统,它几乎完成了......但我现在的问题是恢复/忘记模块......

我已经按照这个教程reset password with Meteor,但是当我在忘记密码表单中提交我的邮件时邮件没有发送。

我使用 Mailgun 作为邮件服务器。我没有通过控制台收到任何错误(我收到我的自定义消息“已发送电子邮件。检查您的邮箱。”)。

我认为 Accounts.forgotPassword 方法和错误函数工作正常,因为如果我尝试输入错误的邮件,或者更改我的 process.env.MAIL_URL 变量进行身份验证,Accounts.forgotPassword 会正确处理错误......但我的问题是即使功能告诉我邮件已正确发送,也不会发送忘记邮件。

邮件服务器工作正常,因为当我测试通过控制台向我的 Mailgun 服务器发送邮件时,邮件已正确发送。

我检查了我的 Mailgun 仪表板,但我没有看到发送的邮件...

有什么建议吗?提前致谢,新年快乐!! 这是我的代码

客户端 js

//config reset password
if (Accounts._resetPasswordToken) 
  Session.set('resetPassword', Accounts._resetPasswordToken);


Template.ResetPassword.helpers(
 resetPassword: function()
  return Session.get('resetPassword');
  
);

Template.ResetPassword.events(
  'submit .resetPasswordForm': function(e, t) 
    e.preventDefault();
    var resetPasswordForm = $(e.currentTarget),
        password = resetPasswordForm.find('#resetPasswordPassword').val(),
        passwordConfirm = resetPasswordForm.find('#resetPasswordPasswordConfirm').val();
        Accounts.resetPassword(Session.get('resetPassword'), password, function(err) 
        if (err) 
          console.log('We are sorry but something went wrong.');
         else 
          console.log('Your password has been changed. Welcome back!');
          Session.set('resetPassword', null);
        
      );
    return false;
  
);

Template.ForgotPassword.events(
  'submit .ForgotPasswordForm': function(e, t) 
    e.preventDefault();

    var forgotPasswordForm = $(e.currentTarget),
        email = forgotPasswordForm.find('#forgotPasswordEmail').val().toLowerCase();

      Accounts.forgotPassword(email: email, function(err) 
        if (err) 
          if (err.message === 'User not found [403]') 
            console.log('This email does not exist.');
           else 
            console.log('We are sorry but something went wrong.');
          
         else 
            console.log('Email Sent. Check your mailbox.');
            console.log(email);
        
      );

    return false;
  ,
);

服务器 js

 process.env.MAIL_URL = 'postmaster@sandbox757c0ce5316a4945a22181bb9b4060e9.mailgun.org:MyPassword@smtp.mailgun.org:587';

HTML

<template name="ForgotPassword">
    <div class="modal fade" id="ForgotPassword" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
            <div class="modal-content">
              <div class="modal-header">
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                <h4 class="modal-title" id="myModalLabel">Recover password</h4>
              </div>
              <div class="modal-body">
                <form class="ForgotPasswordForm" method="post">
                    <p>email: <input id="forgotPasswordEmail" type="text" name="email" placeholder="email"></p> 
                    <button type="submit" class="btn btn-primary" value="Send">Submit</button>
                    <p>Not a member yet?<a href="#" class="js-register">Join us!</a></p>
                </form>
              </div>
              <div class="modal-footer">
                <!--<p><a href="#"  class="btn btn-primary">Login with Facebook</a></p>-->
                <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                <!--<button type="submit" value="Register" class="btn btn-primary js-confirm-register">Save changes</button>-->
              </div>
            </div>
          </div>
    </div>
</template>

<!-- template reset password -->

<template name="ResetPassword">
    #if resetPassword
    <form  class="resetPasswordForm" method="post">
        <input id="resetPasswordPassword" name="password" placeholder="New Password" type="password" >
        <input id="resetPasswordPasswordConfirm" name="password-confirm" placeholder="Confirm" type="password" >
        <input class="btn-submit" type="submit" value="Reset">
    </form>
    <!-- end #reset-password-form -->
    /if
</template>

【问题讨论】:

【参考方案1】:

至少有一个问题是process.env.MAIL_URL 必须是uri 编码,并且需要以smtp:// 开头。另外,我在端口设置为 465 而不是 587 的情况下进行了此操作,但我不久前就这样做了,所以也许两者都尝试。

试试这个:

smtp = 
    username: 'postmaster@sandbox757c0ce5316a4945a22181bb9b4060e9.mailgun.org',
    password: 'MyPassword',
    server: 'smtp.mailgun.org',
    port: 587


process.env.MAIL_URL = 'smtp://' + encodeURIComponent(smtp.username) + ':' + encodeURIComponent(smtp.password) + '@' + encodeURIComponent(smtp.server) + ':' + smtp.port;

希望这会有所帮助。

【讨论】:

哎呀!!我是个笨蛋!!;)你救了我的命!;)非常感谢。效果很好!正确的 MAIL_URL 最后是 MAIL_URL = 'smtp://postmaster@sandbox757c0ce5316a4945a22181bb9b4060e9.mailgun.org:d4ba89f36403b402f5717fc5e28cb769@smtp.mailgun.org:587';

以上是关于使用 Meteor 和 Mailgun 恢复密码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 django-rest-auth 和 Mailgun 从 Django 发送密码重置电子邮件

使用 Mailgun 问题解析服务器密码重置

#yyds干货盘点#RAID阵列恢 复 测 试

浩顺考勤机怎么恢复出厂设置

在 Meteor 帐户-密码中重置密码后禁用登录

在 Meteor 中验证用户密码