Firebase 确认电子邮件未发送

Posted

技术标签:

【中文标题】Firebase 确认电子邮件未发送【英文标题】:Firebase confirmation email not being sent 【发布时间】:2016-09-22 16:52:41 【问题描述】:

我已成功设置 Firebase 电子邮件/密码身份验证,但出于安全原因,我希望用户确认她/他的电子邮件。 它在 Firebases 网站上说:

当用户使用电子邮件地址和密码注册时,系统会发送一封确认电子邮件以验证他们的电子邮件地址。

但是当我注册时,我没有收到确认邮件。

我查看了,只能找到发送密码重置电子邮件的代码,但没有找到发送电子邮件确认的代码。

我看过这里:

https://firebase.google.com/docs/auth/ios/manage-users#send_a_password_reset_email

有人知道我该怎么做吗?

【问题讨论】:

您链接到 iOS 文档,但接受的答案使用 javascript。您使用的是哪一个(以便我可以重新标记问题以匹配所使用的平台)? 我似乎无法在 android 版本中找到 .sendEmailVerification()。有没有人设法在 Android 上的 Firebase 中使用电子邮件验证? firebase.google.com/support/releases 缺少用于启动电子邮件验证流程的 API。 电子邮件地址验证目前是 iOS 和 Web 上的一项实验性功能。 使用新的 API,我如何检查用户是否经过验证? 【参考方案1】:

我注意到新的 Firebase 电子邮件身份验证文档没有正确记录。

firebase.auth().onAuthStateChanged(function(user) 
  user.sendEmailVerification(); 
);

请注意:

    您只能将电子邮件验证发送给您使用电子邮件和密码方法创建的用户对象createUserWithEmailAndPassword 只有在您将用户登录到身份验证状态后,Firebase 才会返回身份验证对象的承诺。 旧的 onAuth 方法已更改为 onAuthStateChanged

检查电子邮件是否已验证:

firebase.auth().onAuthStateChanged(function(user)  
  if (user.emailVerified) 
    console.log('Email is verified');
  
  else 
    console.log('Email is not verified');
  
);

【讨论】:

谢谢,我一直在找这个答案,你知道如何查看邮件是否被确认吗? firebase.auth().onAuthStateChanged(function(user) (user.emailVerified) ? console.log('电子邮件已验证') : console.log('电子邮件未验证') ); firebaser here 很好的答案@XavierJ.Wong。我添加了一个注释,我们需要将其添加到文档中。 @FrankvanPuffelen 仍然不在文档中。身份验证电子邮件模板页面中很好地说明了这一点,但是除了这个答案之外,它的任何地方都没有文档。 @FrankvanPuffelen 我从来不明白怎么做,但是人们可以使用非 Google 电子邮件地址创建“google.com”帐户 - 并且 emailVerified 标志将返回 false,但试图 sendEmailVerification 赢了什么都不做。有没有办法区分这种情况,以便我们可以忽略验证状态 - 或者这是 Firebase 中的错误?【参考方案2】:

创建用户后会返回一个用户对象,您可以在其中检查用户的电子邮件是否已通过验证。

当用户尚未通过验证时,您可以在用户对象本身上触发 sendEmailVerification 方法。

firebase.auth()
    .createUserWithEmailAndPassword(email, password)
    .then(function(user)
      if(user && user.emailVerified === false)
        user.sendEmailVerification().then(function()
          console.log("email verification sent to user");
        );
      
    ).catch(function(error) 
      // Handle Errors here.
      var errorCode = error.code;
      var errorMessage = error.message;

      console.log(errorCode, errorMessage);
    );

你也可以通过监听 AuthState 来检查,以下方法的问题是,对于每个新会话(通过刷新页面), 新的电子邮件已发送。

firebase.auth().onAuthStateChanged(function(user) 
  user.sendEmailVerification(); 
);

【讨论】:

sendEmailVerification()createUserWithEmailAndPassword 之后不起作用。当时user.emailVerfiedundefined。发送电子邮件应始终发生onAuthStateChanged createUserWithEmailAndPassword(...).then 的回调接收到 firebase.auth.UserCredential,而不是 firebase.User。请改用then(credential => credential.user.emailVerified ... ) @Andy :根据Firebase Doc here,我使用then((userRecord) => userRecord.user.sendEmailVerification()... ),但上面写着Cannot read property 'sendEmailVerification' of undefined【参考方案3】:

您可以发送验证电子邮件并检查是否已通过以下方式验证到 AuthListener:

mAuthListener = new FirebaseAuth.AuthStateListener() 
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) 
            FirebaseUser user = firebaseAuth.getCurrentUser();

            if (user != null) 

//---- HERE YOU CHECK IF EMAIL IS VERIFIED

                if (user.isEmailVerified()) 
                    Toast.makeText(LoginActivity.this,"You are in =)",Toast.LENGTH_LONG).show();
                 

                else 

//---- HERE YOU SEND THE EMAIL

                    user.sendEmailVerification();
                    Toast.makeText(LoginActivity.this,"Check your email first...",Toast.LENGTH_LONG).show();
                

             else 
                // User is signed out
                Log.d(TAG, "onAuthStateChanged:signed_out");
            
            // [START_EXCLUDE]
            updateUI(user);
            // [END_EXCLUDE]
        
    ;

【讨论】:

【参考方案4】:

如果您使用的是 compile "com.google.firebase:firebase-auth:9.2.0" 和 compile 'com.google.firebase:firebase-core:9.2.0' 方法 sendEmailVerification() 在更新到 9.8.0 或更高版本之前不会被解析。在我弄清楚之前浪费了大部分时间。

【讨论】:

【参考方案5】:

我也一直在看这个。似乎firebase已经改变了您发送验证的方式。对我来说

user.sendEmailVerification() 

没用。 如果您收到诸如 user.sendEmailVerification() 不存在之类的错误。 使用以下内容。

firebase.auth().currentUser.sendEmailVerification()

【讨论】:

【参考方案6】:

您可以向电子邮件与 Firebase 身份验证帐户相关联的任何用户发送验证电子邮件。例如,在 Flutter 中你可以这样做。类似:

Future<void> signInWithCredentialAndLinkDetails(AuthCredential authCredential,
    String email, String password) async 
  // Here authCredential is from Phone Auth
  _auth.signInWithCredential(authCredential).then((authResult) async 
    if (authResult.user != null) 
      var emailAuthCredential = EmailAuthProvider.getCredential(
        email: email,
        password: password,
      );
      authResult.user
          .linkWithCredential(emailAuthCredential)
          .then((authResult,onError:()/* Error Logic */) async 
        if (authResult.user != null) 
          await authResult.user.sendEmailVerification().then((_) 
            debugPrint('verification email send');
          , onError: () 
            debugPrint('email verification failed.');
          );
        
      );
    
  );

【讨论】:

【参考方案7】:

这不是问题的答案,但可能会对某人有所帮助。 不要忘记将您的站点域添加到登录方法下的授权域列表中

【讨论】:

以上是关于Firebase 确认电子邮件未发送的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI、Firebase 链接以确认电子邮件

Firebase 身份验证:通过特殊电子邮件地址(例如 *@gmx.at)发送但未收到的电子邮件

确认邮件未发送

Magento - cron 作业脚本正在运行,但 Magento 订单确认电子邮件未发送

Magento 1.9.1.0 订单确认未发送

(NoMethodError:main:Object 的未定义方法“电子邮件”)。与 Mandrill 和 Mailchimp 确认设计后发送欢迎电子邮件