BotSharp/src/Plugins/BotSharp.Plugin.EmailHandler/Functions/HandleEmailSenderFn.cs

111 lines
4 KiB
C#
Raw Normal View History

using MailKit.Net.Smtp;
using MailKit.Security;
using MimeKit;
2024-07-11 16:02:14 +00:00
namespace BotSharp.Plugin.EmailHandler.Functions;
public class HandleEmailSenderFn : IFunctionCallback
{
2024-12-04 22:12:02 +00:00
public string Name => "util-email-handle_email_sender";
public string Indication => "Handling email send request";
2024-07-11 16:02:14 +00:00
private readonly IServiceProvider _services;
private readonly ILogger<HandleEmailSenderFn> _logger;
2024-07-11 16:02:14 +00:00
private readonly BotSharpOptions _options;
private readonly EmailSenderSettings _emailSettings;
public HandleEmailSenderFn(
2024-07-17 18:31:09 +00:00
IServiceProvider services,
ILogger<HandleEmailSenderFn> logger,
2024-07-17 18:31:09 +00:00
BotSharpOptions options,
EmailSenderSettings emailPluginSettings)
2024-07-11 16:02:14 +00:00
{
_services = services;
_logger = logger;
_options = options;
_emailSettings = emailPluginSettings;
}
public async Task<bool> Execute(RoleDialogModel message)
{
var args = JsonSerializer.Deserialize<LlmContextIn>(message.FunctionArgs, _options.JsonSerializerOptions);
var recipient = args?.ToAddress;
var body = args?.Content;
var subject = args?.Subject;
2024-07-17 18:31:09 +00:00
var isNeedAttachments = args?.IsNeedAttachemnts ?? false;
var bodyBuilder = new BodyBuilder();
2024-07-11 16:02:14 +00:00
try
{
var mailMessage = new MimeMessage();
mailMessage.From.Add(new MailboxAddress(_emailSettings.Name, _emailSettings.EmailAddress));
mailMessage.To.Add(new MailboxAddress("", recipient));
mailMessage.Subject = subject;
2024-07-17 18:31:09 +00:00
bodyBuilder.TextBody = body;
if (isNeedAttachments)
{
2024-07-17 18:31:09 +00:00
var files = await GetConversationFiles();
2024-08-08 05:51:15 +00:00
BuildEmailAttachments(bodyBuilder, files);
2024-07-17 18:31:09 +00:00
}
mailMessage.Body = bodyBuilder.ToMessageBody();
2024-07-18 03:00:00 +00:00
var response = await SendEmailBySMTP(mailMessage);
2024-07-11 16:02:14 +00:00
message.Content = response;
2024-07-17 18:31:09 +00:00
_logger.LogWarning($"Email successfully send over to {recipient}. Email Subject: {subject} [{response}]");
2024-07-11 16:02:14 +00:00
return true;
}
2024-07-11 16:02:14 +00:00
catch (Exception ex)
{
2024-07-11 16:02:14 +00:00
var msg = $"Failed to send the email. {ex.Message}";
2025-05-02 16:31:28 +00:00
_logger.LogError(ex, $"{msg}");
2024-07-11 16:02:14 +00:00
message.Content = msg;
return false;
}
}
2024-07-11 16:02:14 +00:00
2024-07-17 18:31:09 +00:00
private async Task<IEnumerable<MessageFileModel>> GetConversationFiles()
{
2024-07-19 19:18:22 +00:00
var convService = _services.GetRequiredService<IConversationService>();
2024-07-17 18:31:09 +00:00
var conversationId = convService.ConversationId;
2024-08-07 21:56:57 +00:00
var fileInstruct = _services.GetRequiredService<IFileInstructService>();
2025-09-12 22:17:03 +00:00
var selecteds = await fileInstruct.SelectMessageFiles(conversationId, new SelectFileOptions
{
IsIncludeBotFiles = true,
IsAttachFiles = true,
MessageLimit = 50,
Provider = "openai",
Model = "gpt-5-mini",
MaxOutputTokens = 8192,
ReasoningEffortLevel = "low"
});
2024-08-07 21:56:57 +00:00
return selecteds;
2024-07-17 18:31:09 +00:00
}
2024-08-08 05:51:15 +00:00
private void BuildEmailAttachments(BodyBuilder builder, IEnumerable<MessageFileModel> files)
2024-07-17 18:31:09 +00:00
{
if (files.IsNullOrEmpty()) return;
2024-08-28 16:08:12 +00:00
var fileStorage = _services.GetRequiredService<IFileStorageService>();
2024-07-17 18:31:09 +00:00
foreach (var file in files)
{
if (string.IsNullOrEmpty(file.FileStorageUrl)) continue;
2025-05-28 00:56:14 +00:00
var fileBinary = fileStorage.GetFileBytes(file.FileStorageUrl);
builder.Attachments.Add($"{file.FileName}.{file.FileExtension}", fileBinary.ToArray(), ContentType.Parse(file.ContentType));
2024-07-17 18:31:09 +00:00
Thread.Sleep(100);
}
}
2024-07-18 03:00:00 +00:00
private async Task<string> SendEmailBySMTP(MimeMessage mailMessage)
2024-07-11 16:02:14 +00:00
{
using var smtpClient = new SmtpClient();
await smtpClient.ConnectAsync(_emailSettings.SMTPServer, _emailSettings.SMTPPort, SecureSocketOptions.StartTls);
await smtpClient.AuthenticateAsync(_emailSettings.EmailAddress, _emailSettings.Password);
var response = await smtpClient.SendAsync(mailMessage);
return response ?? "Email sent";
2024-07-11 16:02:14 +00:00
}
}