| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 | 
							- using InABox.Core;
 
- using MailKit;
 
- using MailKit.Net.Imap;
 
- using MailKit.Net.Smtp;
 
- using MimeKit;
 
- namespace InABox.Mail
 
- {
 
-     public class IMAPMailer : CoreMailer<IMAPMailFolder, IMAPMailSummary, IMAPMailMessage>
 
-     {
 
-         private static ProtocolLogger imaplog;
 
-         private static ProtocolLogger smtplog;
 
-         private ImapClient _client;
 
-         protected override void Initialize()
 
-         {
 
-             if (imaplog == null)
 
-                 imaplog = new ProtocolLogger(Path.Combine(CoreUtils.GetPath(), "imap.log"));
 
-             _client = new ImapClient(imaplog);
 
-             _client.ServerCertificateValidationCallback = (s, c, h, e) => true;
 
-         }
 
-         public override void Dispose()
 
-         {
 
-             if (_client.IsConnected)
 
-                 _client.Disconnect(true);
 
-             _client.Dispose();
 
-             _client = null;
 
-         }
 
-         protected override bool DoConnect()
 
-         {
 
-             try
 
-             {
 
-                 if (_client.IsConnected)
 
-                     return true;
 
-                 _client.Connect(MailboxHost, MailboxPort == 0 ? 993 : MailboxPort, MailboxPort != 143);
 
-                 _client.Authenticate(MailboxUserName, MailboxPassword);
 
-                 return true;
 
-             }
 
-             catch (Exception e)
 
-             {
 
-                 return false;
 
-             }
 
-         }
 
-         protected override bool GetIsConnected()
 
-         {
 
-             return _client.IsConnected;
 
-         }
 
-         protected override IMAPMailMessage DoCreateMessage()
 
-         {
 
-             return new IMAPMailMessage(null, UniqueId.MinValue, new MimeMessage());
 
-         }
 
-         protected override IMAPMailFolder DoFindFolder(IMAPMailFolder parent, string name)
 
-         {
 
-             if (string.IsNullOrEmpty(name))
 
-                 return parent;
 
-             return new IMAPMailFolder(parent.Folder.GetSubfolder(name));
 
-         }
 
-         protected override IMAPMailFolder GetInbox()
 
-         {
 
-             return new IMAPMailFolder(_client.Inbox);
 
-         }
 
-         protected override IMAPMailFolder GetSentItems()
 
-         {
 
-             if ((_client.Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) != 0)
 
-                 return new IMAPMailFolder(_client.GetFolder(SpecialFolder.Sent));
 
-             string[] CommonSentFolderNames = { "Sent", "Sent Items", "Sent Mail", "Sent Messages" /* maybe add some translated names */ };
 
-             var personal = _client.GetFolder(_client.PersonalNamespaces[0]);
 
-             var folder = personal.GetSubfolders().FirstOrDefault(x => CommonSentFolderNames.Contains(x.Name));
 
-             if (folder != null)
 
-                 return new IMAPMailFolder(folder);
 
-             throw new Exception("Cannot find Sent Items Folder!");
 
-         }
 
-         protected override IMAPMailMessage DoGetMessage(IMAPMailFolder folder, string id)
 
-         {
 
-             var fld = folder != null ? folder.Folder : _client.Inbox;
 
-             if (!fld.IsOpen)
 
-                 fld.Open(FolderAccess.ReadWrite);
 
-             var uid = UniqueId.Parse(id);
 
-             var msg = fld.GetMessage(uid);
 
-             return new IMAPMailMessage(fld, uid, msg);
 
-         }
 
-         protected override IEnumerable<IMAPMailMessage> DoGetMessages(IMAPMailFolder folder)
 
-         {
 
-             var results = new List<IMAPMailMessage>();
 
-             var fld = folder != null ? folder.Folder : _client.Inbox;
 
-             if (!fld.IsOpen)
 
-                 fld.Open(FolderAccess.ReadWrite);
 
-             var summaries = fld.Fetch(0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags);
 
-             foreach (var summary in summaries)
 
-                 if (!summary.Flags.HasValue || !summary.Flags.Value.HasFlag(MessageFlags.Deleted))
 
-                 {
 
-                     var msg = fld.GetMessage(summary.UniqueId);
 
-                     results.Add(new IMAPMailMessage(fld, summary.UniqueId, msg));
 
-                 }
 
-             return results;
 
-         }
 
-         protected override IEnumerable<IMAPMailSummary> DoListMessages(IMAPMailFolder folder, int min = 0, int max = int.MaxValue)
 
-         {
 
-             var fld = folder != null ? folder.Folder : _client.Inbox;
 
-             if (!fld.IsOpen)
 
-                 fld.Open(FolderAccess.ReadOnly);
 
-             var summaries = fld.Fetch(min, max, MessageSummaryItems.UniqueId | MessageSummaryItems.Flags | MessageSummaryItems.Envelope);
 
-             return summaries.Where(x => !x.Flags.Value.HasFlag(MessageFlags.Deleted)).Select(x => new IMAPMailSummary(fld, x));
 
-         }
 
-         protected override bool DoMoveMessage(IMAPMailMessage message, IMAPMailFolder to)
 
-         {
 
-             message.Move(to != null ? to.Folder : _client.Inbox);
 
-             return true;
 
-         }
 
-         private bool UsesSSL(int port)
 
-         {
 
-             return port != 25;
 
-         }
 
-         protected override bool DoSendMessage(IMAPMailMessage message)
 
-         {
 
-             if (smtplog == null)
 
-                 smtplog = new ProtocolLogger(Path.Combine(CoreUtils.GetPath(), "smtp.log"));
 
-             using (var smtp = new SmtpClient(smtplog))
 
-             {
 
-                 smtp.ServerCertificateValidationCallback = (s, c, h, e) => true;
 
-                 smtp.Connect(SMTPHost, SMTPPort == 0 ? 587 : SMTPPort, SMTPPort == 465);
 
-                 smtp.Authenticate(SMTPUserName, SMTPPassword);
 
-                 smtp.Send(message.Message);
 
-                 if ((_client.Capabilities & (ImapCapabilities.SpecialUse | ImapCapabilities.XList)) != 0)
 
-                 {
 
-                     var sent = _client.GetFolder(SpecialFolder.Sent);
 
-                     sent.Open(FolderAccess.ReadWrite);
 
-                     var id = sent.Append(message.Message).Value;
 
-                     sent.SetFlags(id, MessageFlags.Seen, true);
 
-                 }
 
-                 smtp.Disconnect(true);
 
-             }
 
-             return true;
 
-         }
 
-         protected override bool DoSaveDraft(IMAPMailMessage message)
 
-         {
 
-             var draftFolder = _client.GetFolder(SpecialFolder.Drafts);
 
-             if (draftFolder == null)
 
-             {
 
-                 var toplevel = _client.GetFolder(_client.PersonalNamespaces[0]);
 
-                 draftFolder = toplevel.Create(SpecialFolder.Drafts.ToString(), true);
 
-             }
 
-             message.Move(draftFolder);
 
-             draftFolder.SetFlags(message.UniqueID, MessageFlags.Draft, true);
 
-             draftFolder.Expunge();
 
-             return true;
 
-         }
 
-     }
 
- }
 
 
  |