Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 5.77 KB | None | 0 0
  1. class Program
  2.     {
  3.         public static void Main(string[] args)
  4.         {
  5.             CreateHostBuilder(args).Build().Run();
  6.         }
  7.  
  8.         private static IHostBuilder CreateHostBuilder(string[] args) =>
  9.             Host.CreateDefaultBuilder(args)
  10.                 .ConfigureServices(services =>
  11.                 {
  12.                     var builder = new ConfigurationBuilder()
  13.                         .AddJsonFile("appsettings.json")
  14.                         .AddJsonFile("dbsettings.json");
  15.                     var config = builder.Build();
  16.                    
  17.                     services
  18.                         .Configure<DbConnectionOptions>(config.GetSection(nameof(DbConnectionOptions)))
  19.                         .Configure<ImapOptions>(config.GetSection(nameof(ImapOptions)))
  20.                         .AddTransient(
  21.                             provider =>
  22.                             {
  23.                                 var cnn = provider.GetService<IOptions<DbConnectionOptions>>().Value.ConnectionString;
  24.                                 var res = new NpgsqlConnection(cnn);
  25.                                 res.Open();
  26.                                 return (IDbConnection) res;
  27.                             })
  28.                         .AddHttpClient()
  29.                         .UseSmartpartsData()
  30.                         .AddMediatR(Assembly.GetExecutingAssembly())
  31.                         .AddHostedService<EvaWorker>();
  32.                 });
  33.     }
  34.  
  35.  public class EvaWorker : BackgroundService
  36.     {
  37.         private readonly IHostApplicationLifetime _hostLifetime;
  38.         private readonly IMediator _mediator;
  39.         private readonly ImapOptions _imapOptions;
  40.  
  41.  
  42.         public EvaWorker(IHostApplicationLifetime hostLifetime, IMediator mediator, IOptions<ImapOptions> imapOptions)
  43.         {
  44.             _hostLifetime = hostLifetime;
  45.             _mediator = mediator;
  46.             _imapOptions = imapOptions.Value ?? throw new ArgumentException(nameof(imapOptions));
  47.         }
  48.  
  49.         protected override async Task ExecuteAsync(CancellationToken stoppingToken)
  50.         {
  51.             var tasks = FetchTasksForOrdering();
  52.            
  53.             _hostLifetime.StopApplication();
  54.         }
  55.  
  56.         private IEnumerable<TaskForOrdering> FetchTasksForOrdering()
  57.         {
  58.             using var client = GetImapClient();
  59.             var result = new List<TaskForOrdering>();
  60.             var toplevel = client.GetFolder(client.PersonalNamespaces[0]);
  61.             var subfolders = toplevel.GetSubfolders().ToList();
  62.             var archive = subfolders
  63.                               .SingleOrDefault(sf => sf.Name == _imapOptions.ArchiveFolderName) ??
  64.                           toplevel.Create(_imapOptions.ArchiveFolderName, true);
  65.  
  66.             foreach (var uid in client.Inbox.Search(SearchQuery.DeliveredAfter(DateTime.Now.AddDays(-1))))
  67.             {
  68.                 var message = client.Inbox.GetMessage(uid);
  69.                 var attaches = message.BodyParts
  70.                     .Where(a => ((MimePart) a).FileName != null)
  71.                     .Select(a => (MimePart) a)
  72.                     .ToList();
  73.                 var tasks = attaches.Select(a => GetTaskForOrderingFromEmail(message, a)).Where(a => a != default);
  74.                 result.AddRange(tasks);
  75.                 client.Inbox.AddFlags(uid, MessageFlags.Seen, true);
  76.                 client.Inbox.MoveTo(uid, archive);
  77.             }
  78.  
  79.             return result;
  80.         }
  81.  
  82.         private static TaskForOrdering GetTaskForOrderingFromEmail(MimeMessage msg, MimePart attach)
  83.         {
  84.             try
  85.             {
  86.                 msg.Subject = msg.Subject.DecodeSubject(msg.Body.ContentType.Charset);
  87.                 var fileName = attach.FileName;
  88.                 var fileExtension = Path.GetExtension(fileName).Trim('.');
  89.  
  90.                 using var stream = new MemoryStream();
  91.                 attach.Content.DecodeTo(stream);
  92.                 var res = new TaskForOrdering
  93.                 (
  94.                     stream.ToArray(),
  95.                     fileExtension,
  96.                     msg.From.Mailboxes.SingleOrDefault()?.Address,
  97.                     msg.Subject,
  98.                     fileName
  99.                 );
  100.                 return res;
  101.             }
  102.             catch
  103.             {
  104.                 return default;
  105.             }
  106.         }
  107.  
  108.         private ImapClient GetImapClient()
  109.         {
  110.             var client = new ImapClient
  111.             {
  112.                 Timeout = (int) TimeSpan.FromMinutes(2).TotalMilliseconds
  113.             };
  114.  
  115.             client.Connect(_imapOptions.Host, _imapOptions.Port, _imapOptions.UseSsl);
  116.             client.AuthenticationMechanisms.Remove("XOAUTH2");
  117.             client.Authenticate(_imapOptions.Login, _imapOptions.Password);
  118.             client.Inbox.Open(FolderAccess.ReadWrite);
  119.             return client;
  120.         }
  121.     }
  122.  
  123. public class TaskForOrdering
  124.     {
  125.         public byte[] File { get;  }
  126.         public string FileExtension { get;  }
  127.         public string SenderAddress { get; }
  128.         public string Subject { get;  }
  129.         public string Filename { get; }
  130.  
  131.         public TaskForOrdering(
  132.             byte[] file,
  133.             string fileExtension,
  134.             string senderAddress,
  135.             string subject,
  136.             string filename)
  137.         {
  138.             File = file;
  139.             FileExtension = fileExtension;
  140.             SenderAddress = senderAddress;
  141.             Subject = subject;
  142.             Filename = filename;
  143.         }
  144.     }
  145.  
  146.   public class ImapOptions
  147.     {
  148.         public string Host { get; set; }
  149.         public int Port { get; set; }
  150.         public bool UseSsl { get; set; }
  151.         public string Login { get; set; }
  152.         public string Password { get; set; }
  153.         public string ArchiveFolderName { get; set; }
  154.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement