首页 > 解决方案 > 实施电子邮件通知并让用户知道有人在他/她的帖子上回答

问题描述

好的,所以我正在尝试使用FluentEmail

流利的电子邮件

我有HelpDesk系统,一旦User创建帖子,管理员可以看到这个帖子和答案。一旦管理员回答发布用户应该收到电子邮件通知。目前我实现了双方,但问题是电子邮件发送到错误的电子邮件地址。

  [HttpPost]
    public async Task<IActionResult> SendDiscussionAsync(int ticketId, string message)
    {
        var userName = User.FindFirstValue(ClaimTypes.Email);
        var account = _db.ApplicationUsers.SingleOrDefault(a => a.UserName.Equals(userName));
        var userEmail = account == null ? string.Empty : account.Email;

        //var userName = User.FindFirstValue(ClaimTypes.Name);
        //var account = _db.ApplicationUsers.FirstOrDefault(u => u.UserName == userName);
        //var userEmail = account == null ? string.Empty : account.Email;


        var discussion = new Discussion
        {
            DateAndTime = DateTime.Now,
            Content = message,
            TicketId = ticketId,
            UserId = account.Id,
            ApplicationUser = account
        };

        var sender = new SmtpSender(() => new SmtpClient("localhost")
        {
            Credentials = new NetworkCredential("emailaddress", "password"),
            EnableSsl = false,
            DeliveryMethod = SmtpDeliveryMethod.Network,
            Port = 26,
            UseDefaultCredentials = false,
            Host = "smtp.gmail.com"
        });

        Email.DefaultSender = sender;
        Email.DefaultRenderer = new RazorRenderer();

        var email = await Email
            .From("emailaddress")
            .To(userEmail)
            .Subject("Test Email for Notification")
            .Body(body: discussion.Content)
            .SendAsync();

        _unitOfwork.Discussion.Add(discussion);
        _unitOfwork.Save();
        return RedirectToAction("Details", new { id = ticketId });
    }

一旦用户使用用户名和密码登录,我尝试在 EmailService 中将电子邮件地址传递给用户如何创建帖子。现在的逻辑是相反的,一旦管理员回复邮件后,电子邮件会自动发送到管理员电子邮件地址,但它应该发送给User 我在这里获取用户登录信息

 var userName = User.FindFirstValue(ClaimTypes.Email);
            var account = _db.ApplicationUsers.SingleOrDefault(a => a.UserName.Equals(userName));
            var userEmail = account == null ? string.Empty : account.Email;

但我不知道如何获取 UserEmail 并传递给EmailService. 这是我Create的帖子功能。

[HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Upsert(TicketVM ticketVM)
        {
            var userName = User.FindFirstValue(ClaimTypes.Email);
            var user = HttpContext.User.Identity.Name;

            if (ticketVM.Ticket.UserId > 0)
            {
                var usert = _db.ApplicationUsers.FirstOrDefault(u => u.Id == ticketVM.Ticket.UserId);
                ticketVM.Ticket.ApplicationUser = usert;
            }
            else
            {
                var usert = _db.ApplicationUsers.FirstOrDefault(u => u.Email == userName);
                ticketVM.Ticket.ApplicationUser = usert;
            }
            if (ModelState.IsValid)
            {
                if (ticketVM.Ticket.Id == 0)
                {
                    ticketVM.Ticket.Status = TicketStatus.Otvoren.ToString();
                    _unitOfwork.Ticket.Add(ticketVM.Ticket);
                }
                else
                {
                    //ticketVM.Ticket.Status = ((TicketStatus)Convert.ToInt32(ticketVM.Ticket.Status)).ToString();
                    _unitOfwork.Ticket.Update(ticketVM.Ticket);
                    if (ticketVM.Ticket.Status.ToString() == "1")
                    {
                        ticketVM.Ticket.Status = "Otvoren";
                    }
                    else if (ticketVM.Ticket.Status.ToString() == "2")
                    {
                        ticketVM.Ticket.Status = "NaCekanju";
                    }
                    else if (ticketVM.Ticket.Status.ToString() == "3")
                    {
                        ticketVM.Ticket.Status = "Zatvoren";
                    }
                }
                _unitOfwork.Save();
                return RedirectToAction(nameof(Index));
            }
            else
            {
                ticketVM.TicketTypeList = _unitOfwork.TicketType.GetAll().Select(i => new SelectListItem
                {
                    Text = i.Name,
                    Value = i.Id.ToString()
                });

                if (ticketVM.Ticket.Id != 0)
                {
                    ticketVM.Ticket = _unitOfwork.Ticket.Get(ticketVM.Ticket.Id);
                }
            }
            return View(ticketVM);
        }

也许这也能帮助你更好地理解,我在这里得到了 UserInformation,这个函数包含UserEmail

[HttpGet]
        public IActionResult GetByName(string name)
        {
            var obj = _unitOfwork.ApplicationUser.GetAll(x => x.Name == name);
            return Json(new { data = obj });
        }

这是我的票证模型,(UserId)其中包含ForeightKey给 ApplicationUser的用户信息

public class Ticket
    {
        [Key]
        public int Id { get; set; }

        [Display(Name = "Opis")]
        public string Description { get; set; }

        [Display(Name = "Kratak Opis")]
        [MaxLength(20, ErrorMessage = "Maximalan broj karaktera je 20")]
        public string ShortDescription { get; set; }

        [Display(Name = "Datum i vrijeme slanja")]
        public string DateAndTime { get; set; } = DateTime.Now.ToString("dd/MM/yyyy HH:mm");

        //[Display(Name = "Datum i vrijeme zavrsetka")]
        //public DateTime Answered { get; set; }

        [Display(Name = "Vrsta tiketa")]
        public int TicketTypeID { get; set; }

        [ForeignKey("TicketTypeID")]
        public virtual TicketType TicketType { get; set; }

        public int UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual ApplicationUser ApplicationUser { get; set; }

        public int? ClientId { get; set; }
        [ForeignKey("ClientId")]
        public virtual Client Client { get; set; }

        public string Status { get; set; } = TicketStatus.Otvoren.ToString();

    }

还有 ApplicationUser 类

 public class ApplicationUser : IdentityUser<int>
    {

        [Required]
        [Display(Name = "Ime")]
        public string Name { get; set; }

        [Required]
        [Display(Name = "Adresa")]
        public string StreetAddress { get; set; }

        [Required]
        [Display(Name = "Grad")]
        public string City { get; set; }

        [Required]
        [Display(Name = "Postanski broj")]
        public string PostalCode { get; set; }

        public int? ClientId { get; set; }
        [ForeignKey("ClientId")]
        public Client Client { get; set; }

        [NotMapped]
        public string Role { get; set; }

        //[NotMapped]
        //public int RoleId { get; set; }

        [NotMapped]
        public IEnumerable<SelectListItem> RoleList { get; set; }

        [NotMapped]
        public IEnumerable<SelectListItem> ClientList { get; set; }
    }

标签: c#asp.net-core-mvc

解决方案


推荐阅读