Files
PortBlog.API/PortBlog.API/Services/MailService.cs
T

76 lines
3.1 KiB
C#

using AutoMapper;
using PortBlog.API.Common;
using PortBlog.API.Entities;
using PortBlog.API.Models;
using PortBlog.API.Repositories.Contracts;
using PortBlog.API.Services.Contracts;
using System.Net;
using System.Net.Mail;
namespace PortBlog.API.Services
{
public class MailService : IMailService
{
private readonly ILogger<MailService> _logger;
private readonly IConfiguration _configuration;
private readonly IMailRepository _mailRepository;
private readonly IMapper _mapper;
public MailService(IConfiguration configuration, ILogger<MailService> logger, IMailRepository mailRepository, IMapper mapper)
{
_logger = logger;
_configuration = configuration;
_mailRepository = mailRepository;
_mapper = mapper;
}
public async Task SendAsync(MessageSendDto messageSendDto)
{
_logger.LogInformation($"Sending message from {messageSendDto.Name} ({messageSendDto.FromEmail}).");
messageSendDto.Subject = $"Message from {messageSendDto.Name}: Portfolio";
var messageEntity = _mapper.Map<Message>(messageSendDto);
try
{
var mailSettings = _configuration.GetSection("MailSettings").Get<MailSettingsDto>();
if (mailSettings != null && mailSettings.Enable)
{
using (var client = new SmtpClient())
{
client.Host = mailSettings.Host;
client.Port = mailSettings.Port;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.EnableSsl = true;
client.Credentials = new NetworkCredential(mailSettings.Email, mailSettings.Password);
using (var messageMessage = new MailMessage(
from: new MailAddress(messageSendDto.FromEmail),
to: new MailAddress(messageSendDto.ToEmail, messageSendDto.CandidateName)
))
{
messageMessage.Subject = messageSendDto.Subject;
messageMessage.Body = messageSendDto.Content;
client.Send(messageMessage);
messageSendDto.SentStatus = (int)MailConstants.MailStatus.Success;
}
}
_mailRepository.AddMessage(messageEntity);
await _mailRepository.SaveChangesAsync();
}
}
catch (Exception ex)
{
_logger.LogCritical($"Exception while sending mail from {new MailAddress(messageSendDto.FromEmail, messageSendDto.Name)}", ex);
messageSendDto.SentStatus = (int)MailConstants.MailStatus.Failed;
_mailRepository.AddMessage(messageEntity);
await _mailRepository.SaveChangesAsync();
throw new Exception();
}
}
}
}