• 1401/06/31

تفاوت عملکرد Active Email در وب و جیمیل :

وبا سلام استاد من همه سوالات مربوط به ایمیل رو دیدم ولی این مشکل رو کسی نداشت 

برای فعال سازی ایمیل کاربر لینک فعال سازی رو اگر در صفحه خود مثلا register  بگذارم درست کار میکند . حساب را ساخته و فعال می کند.

 

ایمل هم ارسال می شود درست ولی لینک داخل ایمیل خطا دارد . در واقع activecode رو نمی برد.

این دو عکس را ببینید اولی لینک برای تست روی صفحه:

اما داخل ایمیل ، بعد از دریافت ایمیل کار نمی کند و همون طور گفتم Activecode  رو دریافت نمیکند.مشکل چیست؟

سرویس دریافت جیمیل رو از یکی از لینک هایی که دوستان گفتند فعال کردم 

از این لینک 

  • 1401/07/02
  • ساعت 12:01

سلام دوست عزیز وقتتون بخیر

دوست عزیز موقع فرستادن ایمیل چک کنید که active code رو به سمت view ارسال میکنید


  • 1401/07/04
  • ساعت 14:01

اگه منظورتون توی ویو این صفحه است که دادم . برک پوینت هم می گذارم بله میگیره active code  رو


    <div class="alert alert-success">
        <h3> @Model.FirstName  @Model.LastName عزیز !</h3>
        <p>ثبت نام شما با موفقیت انجام شد ، ایمیلی حاوی لینک فعالسازی به ایمیل "@Model.Email" ارسال شد .</p>
        <p>
            <a href="https://localhost:44385/active?EmailActiveCode=@ViewBag.active">فعالسازی حساب کاربری</a>
        </p>
    </div>

اما درسته توی سرویس موقع ارسال توی body  رو چک کردم اگر user که در متد اد شده را وارد کنم که بادی null  میشود

اما چون صفخه ActiveEmail که شامل صفحه ایست که قراره کدهاش بره به ایمیل کاربر و مدل اش registerviewmodel است ؛ طبق اموزش اینجا هم توی متد Send email و ان مدل را میدهیم. درسته دیگه ؟

  string body = _viewRender.RenderToStringAsync("ActiveEmail", registerUserViewModel);
    SendEmail.Send(registerUserViewModel.Email, "فعالسازی", body);

که کل کد اد کردن یوزر و ارسال ایمیل در سرویس این است:

 public async Task<RegisterUserResult> RegisterUser(RegisterUserViewModel registerUserViewModel)
        {
            var emailExist = await _userRepository.IsEmailExist(registerUserViewModel.Email);
            if (emailExist)
            {
                return RegisterUserResult.UserExist;
            }
            User user = new User()
            {
                FirstName = registerUserViewModel.FirstName.SanitizeText(),
                LastName = registerUserViewModel.LastName.SanitizeText(),
                EmailActiveCode = NameGenerator.GenerateUniqCode(),
                Password = PasswordHellper.EncodePasswordMd5(registerUserViewModel.Password).SanitizeText(),
                Mobile = registerUserViewModel.Mobile.SanitizeText(),
                UserState = UserState.NotActive,
                RegisterDate = DateTime.Now,
                Email = registerUserViewModel.Email,
                
            };

            await  _userRepository.AddUser(user);
            await _userRepository.SaveChange();

           
            string body = _viewRender.RenderToStringAsync("ActiveEmail", registerUserViewModel);
            SendEmail.Send(registerUserViewModel.Email, "فعالسازی", body);
            return RegisterUserResult.Success;

        }

که در این حالت بادی دیتا می گیرد ولی activeemailcode  را نمیگیرد. در صورتی که توی ویوش هم از متد رجیستر با viewbag اوردمش توی ویو

اینم صفحه ActiveEmail که یه صفحه معمولی ست 

@model AryanITC.Domain.ViewModels.Account.RegisterUserViewModel

<div style="direction: rtl; padding: 20px">
    <h2>@Model.FirstName عزیز !</h2>
    <p>با تشکر از ثبت نام شما در آریان ، جهت ادامه کار میبایست حساب کاربری خود را فعال کنید</p>
    <p>
        <a href="https://localhost:44385/active?EmailActiveCode=@ViewBag.active">فعالسازی حساب کاربری</a>     </p>
</div>

 

این لینک رو وقتی توی یک صفحه های برنامه می گذارم درست کار می کند ، حساب را فعال میکند و activecode  را هم وارد متد می کند

اما در اینحا وقتی ایمیل میرود به یوزر درست کار نمیکند و Activecode  را هم با خود نمی برد

href="https://localhost:44385/active?EmailActiveCode=@ViewBag.active"

  • 1401/07/06
  • ساعت 05:32

دوست عزیز شما نباید از ViewBag موقع رندر کردن ویو برای ایمیل استفاده کنید

شما باید یک ViewModel برای ویوی فعالسازی ایمیل درست کنید و همه اطلاعاتی که لازم هست رو داخل این ویو مدل قرار بدین تا مشکلتون رفع بشه


  • 1401/07/06
  • ساعت 14:10

من الان یه ویومدل جدا برای تابع فعالسازی ایمیل دارم که فقط یک emailactivecode  میگیره و یوزر و فعال میکنه

اما شما میکید برای ویوی فعالسازی ایمیل یکی بسازم یعنی برای اون ویوویی که داره برای یوزر ایمیل میشه دیکه درسته؟

خوب چون دو خط کد ارسال ایمیل رو توی رجیستر می نویسیم و الان وروردی این تابه  registerviemodel هست 

خوی انیجا چطور میشه از یه ویو مدل دیگه دوباره تو دل این استفاده کرد؟

اینجا: در این خط:

ActiveEmail هم همان صفحه ویووای ست که به اایمیل یوزر می رود

            string body = _viewRender.RenderToStringAsync("ActiveEmail", emailActiveAccountViewModel);

        public async Task<RegisterUserResult> RegisterUser(RegisterUserViewModel registerUserViewModel)
        {

            var emailExist = await _userRepository.IsEmailExist(registerUserViewModel.Email);
            if (emailExist)
            {
                return RegisterUserResult.UserExist;
            }


            User user = new User()
            {
                FirstName = registerUserViewModel.FirstName.SanitizeText(),
                LastName = registerUserViewModel.LastName.SanitizeText(),
                EmailActiveCode = NameGenerator.GenerateUniqCode(),
                Password = PasswordHellper.EncodePasswordMd5(registerUserViewModel.Password).SanitizeText(),
                Mobile = registerUserViewModel.Mobile.SanitizeText(),
                UserState = UserState.NotActive,
                RegisterDate = DateTime.Now,
                Email = registerUserViewModel.Email,
                
                //UserAvatar = "Default.png",
            

            };

            await _userRepository.AddUser(user);
            await _userRepository.SaveChange();
            
            string body = _viewRender.RenderToStringAsync("ActiveEmail", emailActiveAccountViewModel);
            SendEmail.Send(user.Email, "فعالسازی", body);
          
            return RegisterUserResult.Success;

        }

  • 1401/07/07
  • ساعت 10:12

ببنید دوست عزیز شما برای ویو با اسم ActiveEmail یک ویومدل میسازید و تمام property هایی که لازمه رو داخلش قرار میدید حالا موقع رندر کردن این با استفاده از متد RenderToStringAsync شما باید یک نمونه از ViewModelی که ساختین درست کنید و به عنوان مدل به ویو پاس بدین و اصلا ربطی به ورودی action شما نداره


  • 1401/07/07
  • ساعت 13:38

درسته استاد متوجه شدم همون اول هم ولی هر چی میدادم اسم اون ویو مدل رو باز نمیشد

کلا برای اون صفحه هیج مدلی در نظر نگرفتم و توی رندر کردن RendertoString هم همون یوزر رو که توی متد رجیستر  Add شده بود رو پاس دادم درست شد :)

     
            string body = _viewRender.RenderToStringAsync("ActiveEmail", user );
            SendEmail.Send(user.Email, "فعالسازی", body);

 

فقط استاد بی زحمت میگید اگه از روش مشا بهوام انجام بدم نمونه سازی ش رو کجا باید انجام بدم ؟ قبل از همین دو خط متد؟ و چطور باید نمونه سازیش انجام بشه منظورم کدش رو می خواستم .ممنون میشم بنویسید که بدونم چطوری هست 


  • 1401/07/08
  • ساعت 12:33

شما باید بالای متد RedenerToString نمونه سازی رو انجام بدین دوست عزیز

به روش زیر میتونید این کار رو انجام بدین

var userActiveEmailViewModel= new UserActiveEmailViewModel(){
پراپرتی های این کلاس رو اینجا دونه دونه پر کنید
}

UserActiveEmailViewModel هم ViewModel هست که شما از قبل ساختین


  • 1401/07/10
  • ساعت 18:47

آهان متوجه شدم استاد خیلی ممنون از توضیحات خوبتون ممنون از وقتی که گذاشتید🎉


  • 1401/07/12
  • ساعت 07:39

سلامت و موفق باشید دوست عزیز


logo-enamadlogo-samandehi