我在我的网站上写了一个代码来恢复passwrod。用户输入他的电子邮件地址,我们向他发送一个新密码。在additcion中,我们也将他的密码在DB中更改为最新密码。
问题: 如果发送邮件的代码失败,我无法在DB中更改密码,如果更改密码的代码失败,我就无法发送邮件。
看看:
public bool RecoverPassword(string email)
{
try
{
SceLoginMail sceEmail = new SceLoginMail(email, "Recuperação de senha", 5);
ChangeUserPassword(sceEmail.NovaSenha, email);
sceEmail.SendEmail();
sceUsers.CommitOrRollBack(true);
return true;
}
catch (Exception ex)
{
sceUsers.CommitOrRollBack(false);
return false;
}
}
如果在SendEmail方法中发生异常,我尝试在数据库中回滚。但是,如果在CommitOrRollback方法中抛出异常,我就无法“RollBack”SendMail方法。如果是这样,系统将发送邮件而不会在DB上更改它。
任何想法?
答案 0 :(得分:3)
在数据库事务(以及影响新密码有效性的任何其他因素)完成之前,请勿发送电子邮件。这样,如果它抛出异常,SendEmail()调用永远不会被执行。
答案 1 :(得分:2)
如果您指定一个新密码并且因某些原因而未收到密码,则无关紧要。用户已经不知道他/她的密码。电子邮件不会显示,他们会再次请求。所以提交数据库,然后按顺序发送。
答案 2 :(得分:1)
不是重置密码以响应“我丢失了我的密码”请求,而是向用户发送一封电子邮件,其中包含一个独特的,一次性使用的,有时间限制的重置URL。只有在允许的时间内访问该URL时才重置密码。
这有两个好处:
答案 3 :(得分:0)
请参阅,请求更改密码的操作和获取更改密码的电子邮件的请求是单独的现象。
当用户请求更改密码时,您只需调用该语句以使用新密码更新数据库。更新后,尝试发送邮件。
最好安装一个Mail Outbox。因此,当电子邮件发送失败时,它会存储在数据库表格发件箱中,您应该在阈值时间后定期尝试。
这将确保您继续尝试将该邮件发送给用户。