Example #1
0
        public IActionResult GetMail(string mailto, string code)
        {
            CheckDataSourceParameter();

            if (SqlMap.Params.GetValue("checkvalid", true))
            {
                string validCode = GetValidCode(App.GetQuery("type", "root"), true);
                if (!code.HasValue() || validCode != code.ToUpper())
                {
                    throw new AceException("验证码输入错误");
                }
            }

            var rndStr     = RandomHelper.GetRandomNumber(6);
            var key        = "mail_" + mailto;
            var keySending = "mail-send-" + mailto;

            if (App.Cache.GetString(keySending) != null)
            {
                throw new AceException("不能频繁获取验证码!");
            }

            var expired = SqlMap.Params.GetValue("mail_expired", 15);
            var times   = SqlMap.Params.GetValue("sms_retrytimes", 5);

            var success = false;
            var mail    = cloudService.GetMailService();

            for (var i = 0; i < times; i++)
            {
                try
                {
                    mail.Send(mailto, "邮件验证码", $"这是你的验证码:{rndStr},请在{expired}分钟内输入提交!");
                    logger.LogDebug($"Send valid code \"{rndStr}\" to \"{mailto}\"");
                    success = true;
                    break;
                }
                catch (Exception ex)
                {
                    logger.LogError($"Send valid code to \"{mailto}\" with error: {ex.GetMessage()}");
                }
            }
            if (!success)
            {
                throw new AceException(SqlMap.Params.GetValue("mail_errservice", ""));
            }

            App.Cache.SetString(key, rndStr, opts =>
            {
                opts.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(expired);
            });
            App.Cache.SetString(keySending, "1", opts =>
            {
                opts.AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(1);
            });

            return(Ok(null));
        }