76 lines
3.1 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|
|
}
|