Firebase是否支持含智能撇号等Unicode字符的邮箱?创建后发验证邮件报错
问题说明
通过firebase.auth().createUserWithEmailAndPassword创建包含Unicode智能撇号(U+2019)的邮箱用户(示例:trap’py@gmail.com)可以成功,但调用firebase.auth().currentUser.sendEmailVerification发送验证邮件时,会触发以下错误:
{"code":"auth/invalid-recipient-email","message":"Missing recipients"}
仅使用纯ASCII字符的邮箱时功能正常,测试其他非ASCII字符也会出现相同问题,且Firebase官方的「发送用户验证邮件」文档未提及国际化邮箱的支持情况。
解决方案
将国际化邮箱转换为Punycode编码
国际化邮箱(IDN邮箱)需要转换为Punycode格式后,再传入Firebase Auth的相关方法。比如把trap’py@gmail.com转换为对应的Punycode格式(注:不同非ASCII字符转换结果不同,需用工具或代码实现准确转换)。
前端可借助punycode库(Node.js内置,前端可通过npm引入)完成转换,示例代码:import punycode from 'punycode'; // 拆分邮箱的本地名和域名 const [localPart, domainPart] = 'trap’py@gmail.com'.split('@'); // 转换本地名为Punycode const encodedLocal = punycode.encode(localPart); // 拼接成转换后的邮箱 const encodedEmail = `${encodedLocal}@${domainPart}`; // 使用转换后的邮箱执行创建用户或发送验证邮件操作注意:部分邮箱服务商对本地部分的非ASCII字符支持不同,转换后需确认邮箱仍可正常接收邮件。
注册阶段过滤非ASCII字符
在用户注册时添加邮箱校验逻辑,检测到非ASCII字符时提示用户使用纯ASCII格式的邮箱,从源头避免后续验证报错。向Firebase反馈需求
如果业务必须支持国际化邮箱,可向Firebase官方提交反馈工单,说明该场景的使用需求,推动官方完善对国际化邮箱的支持。
问题原因
Firebase Auth的邮件验证服务目前未完全兼容RFC 6532定义的国际化邮箱标准,无法正确解析含非ASCII字符的收件人邮箱,因此抛出「Missing recipients」错误。
内容的提问来源于stack exchange,提问作者traPPy

