[#15] MailWindow: Add email sending feature
This commit is contained in:
@ -42,6 +42,16 @@ namespace Elwig.Helpers {
|
||||
public string? UpdateUrl = null;
|
||||
public bool UpdateAuto = false;
|
||||
|
||||
public string? SmtpHost = null;
|
||||
public int? SmtpPort = null;
|
||||
public string? SmtpMode = null;
|
||||
public string? SmtpUsername = null;
|
||||
public string? SmtpPassword = null;
|
||||
public string? SmtpFrom = null;
|
||||
public (string Host, int Port, string Mode, string Username, string Password, string From)? Smtp =>
|
||||
SmtpHost == null || SmtpPort == null || SmtpMode == null || SmtpUsername == null || SmtpPassword == null || SmtpFrom == null ?
|
||||
null : (SmtpHost, (int)SmtpPort, SmtpMode, SmtpUsername, SmtpPassword, SmtpFrom);
|
||||
|
||||
public IList<ScaleConfig> Scales;
|
||||
private readonly List<ScaleConfig> ScaleList = [];
|
||||
|
||||
@ -62,6 +72,13 @@ namespace Elwig.Helpers {
|
||||
UpdateUrl = config["update:url"];
|
||||
UpdateAuto = TrueValues.Contains(config["update:auto"]?.ToLower());
|
||||
|
||||
SmtpHost = config["smtp:host"];
|
||||
SmtpPort = config["smtp:port"]?.All(char.IsAsciiDigit) == true && config["smtp:port"]?.Length > 0 ? int.Parse(config["smtp:port"]!) : null;
|
||||
SmtpMode = config["smtp:mode"];
|
||||
SmtpUsername = config["smtp:username"];
|
||||
SmtpPassword = config["smtp:password"];
|
||||
SmtpFrom = config["smtp:from"];
|
||||
|
||||
var scales = config.AsEnumerable().Where(i => i.Key.StartsWith("scale.")).GroupBy(i => i.Key.Split(':')[0][6..]).Select(i => i.Key);
|
||||
ScaleList.Clear();
|
||||
Scales = ScaleList;
|
||||
@ -72,25 +89,5 @@ namespace Elwig.Helpers {
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
public void Write() {
|
||||
using var file = new StreamWriter(FileName, false, Utils.UTF8);
|
||||
file.Write($"\r\n[general]\r\n");
|
||||
if (Branch != null) file.Write($"branch = {Branch}\r\n");
|
||||
if (Debug) file.Write("debug = true\r\n");
|
||||
file.Write($"\r\n[database]\r\nfile = {DatabaseFile}\r\n");
|
||||
if (DatabaseLog != null) file.Write($"log = {DatabaseLog}\r\n");
|
||||
file.Write($"\r\n[update]\r\n");
|
||||
if (UpdateUrl != null) file.Write($"url = {UpdateUrl}\r\n");
|
||||
if (UpdateAuto) file.Write($"auto = true\r\n");
|
||||
|
||||
foreach (var s in ScaleList) {
|
||||
file.Write($"\r\n[scale.{s.Id}]\r\ntype = {s.Type}\r\nmodel = {s.Model}\r\nconnection = {s.Connection}\r\n");
|
||||
if (s.Empty != null) file.Write($"empty = {s.Empty}\r\n");
|
||||
if (s.Filling != null) file.Write($"filling = {s.Filling}\r\n");
|
||||
if (s.Limit != null) file.Write($"limit = {s.Limit}\r\n");
|
||||
if (s._Log != null) file.Write($"log = {s._Log}\r\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -16,6 +16,9 @@ using System.Runtime.InteropServices;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.IO;
|
||||
using MailKit.Net.Smtp;
|
||||
using MailKit.Security;
|
||||
using OpenTK.Compute.OpenCL;
|
||||
|
||||
namespace Elwig.Helpers {
|
||||
public static partial class Utils {
|
||||
@ -27,30 +30,33 @@ namespace Elwig.Helpers {
|
||||
public static int CurrentLastSeason => DateTime.Now.Year - (DateTime.Now.Month <= 7 ? 1 : 0);
|
||||
public static DateTime Today => (DateTime.Now.Hour >= 3) ? DateTime.Today : DateTime.Today.AddDays(-1);
|
||||
|
||||
public static readonly Regex SerialRegex = GeneratedSerialRegex();
|
||||
public static readonly Regex TcpRegex = GeneratedTcpRegex();
|
||||
public static readonly Regex DateFromToRegex = GeneratedFromToDateRegex();
|
||||
public static readonly Regex FromToRegex = GeneratedFromToRegex();
|
||||
public static readonly Regex FromToTimeRegex = GeneratedFromToTimeRegex();
|
||||
public static readonly Regex AddressRegex = GeneratedAddressRegex();
|
||||
|
||||
[GeneratedRegex("^serial://([A-Za-z0-9]+):([0-9]+)(,([5-9]),([NOEMSnoems]),(0|1|1\\.5|2|))?$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedSerialRegex();
|
||||
public static readonly Regex SerialRegex = GeneratedSerialRegex();
|
||||
|
||||
[GeneratedRegex("^tcp://([A-Za-z0-9._-]+):([0-9]+)$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedTcpRegex();
|
||||
public static readonly Regex TcpRegex = GeneratedTcpRegex();
|
||||
|
||||
[GeneratedRegex(@"^(-?(0?[1-9]|[12][0-9]|3[01])\.(0?[1-9]|1[0-2])\.([0-9]{4})?-?){1,2}$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedFromToDateRegex();
|
||||
public static readonly Regex DateFromToRegex = GeneratedFromToDateRegex();
|
||||
|
||||
[GeneratedRegex(@"^([0-9]+([\.,][0-9]+)?)?-([0-9]+([\.,][0-9]+)?)?$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedFromToRegex();
|
||||
public static readonly Regex FromToRegex = GeneratedFromToRegex();
|
||||
|
||||
[GeneratedRegex(@"^([0-9]{1,2}:[0-9]{2})?-([0-9]{1,2}:[0-9]{2})?$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedFromToTimeRegex();
|
||||
public static readonly Regex FromToTimeRegex = GeneratedFromToTimeRegex();
|
||||
|
||||
[GeneratedRegex(@"^(.*?) +([0-9].*)$", RegexOptions.Compiled)]
|
||||
private static partial Regex GeneratedAddressRegex();
|
||||
public static readonly Regex AddressRegex = GeneratedAddressRegex();
|
||||
|
||||
[GeneratedRegex(@"[^A-Za-z0-9ÄÜÖẞäöüß-]+")]
|
||||
private static partial Regex GeneratedInvalidFileNamePartsRegex();
|
||||
public static readonly Regex InvalidFileNamePartsRegex = GeneratedInvalidFileNamePartsRegex();
|
||||
|
||||
public static readonly string GroupSeparator = "\u202F";
|
||||
public static readonly string UnitSeparator = "\u00A0";
|
||||
@ -412,5 +418,19 @@ namespace Elwig.Helpers {
|
||||
file.Delete();
|
||||
}
|
||||
}
|
||||
|
||||
public static string NormalizeFileName(string filename) {
|
||||
return InvalidFileNamePartsRegex.Replace(filename.Replace('/', '-'), "_");
|
||||
}
|
||||
|
||||
public static async Task<SmtpClient?> GetSmtpClient() {
|
||||
if (App.Config.Smtp == null)
|
||||
return null;
|
||||
var (host, port, mode, username, password, _) = App.Config.Smtp.Value;
|
||||
var client = new SmtpClient();
|
||||
await client.ConnectAsync(host, port, mode == "starttls" ? SecureSocketOptions.StartTls : SecureSocketOptions.None);
|
||||
await client.AuthenticateAsync(username, password);
|
||||
return client;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user