public override Indexable GetNextIndexable() { using (GMime.Message message = this.mbox_parser.ConstructMessage()) { // Work around what I think is a bug in GMime: If you // have a zero-byte file or seek to the end of a // file, parser.Eos () will return true until it // actually tries to read something off the wire. // Since parser.ConstructMessage() always returns a // message (which may also be a bug), we'll often get // one empty message which we need to deal with here. // // Check if its empty by seeing if the Headers // property is null or empty. if (message == null || message.Headers == null || message.Headers == "") { return(null); } ++this.count; string x_evolution = message.GetHeader("X-Evolution"); if (x_evolution == null || x_evolution == "") { Logger.Log.Info("{0}: Message at offset {1} has no X-Evolution header!", this.folder_name, this.mbox_parser.FromOffset); return(null); } // This extracts the UID and flags from the X-Evolution header. // It may also contain user-defined flags and tags, but we don't // support those right now. int separator_idx = x_evolution.IndexOf('-'); string uid_str = x_evolution.Substring(0, separator_idx); string uid = Convert.ToUInt32(uid_str, 16).ToString(); // ugh. uint flags = Convert.ToUInt32(x_evolution.Substring(separator_idx + 1, 4), 16); Indexable indexable = this.GMimeMessageToIndexable(uid, message, flags); if (Debug) { Logger.Log.Debug("Constructed message {0} with uid {1}, flags {2}. Indexable {3} null", this.count, uid, flags, indexable == null ? "" : "not"); } if (indexable == null) { return(null); } ++this.indexed_count; return(indexable); } }
public Indexable GetNextIndexable() { GMime.Message message = null; try { message = mbox_parser.ConstructMessage(); } catch (System.IO.FileNotFoundException e) { Logger.Log.Warn("mbox " + mbox_file + " deleted while parsing."); return(null); } try { // Again comment from Evo :P // Work around what I think is a bug in GMime: If you // have a zero-byte file or seek to the end of a // file, parser.Eos () will return true until it // actually tries to read something off the wire. // Since parser.ConstructMessage() always returns a // message (which may also be a bug), we'll often get // one empty message which we need to deal with here. // // Check if its empty by seeing if the Headers // property is null or empty. if (message == null || message.Headers == null || message.Headers == "") { return(null); } // mbox KIO slave uses the From line as URI - how weird! // are those lines supposed to be unique ??? string id = mbox_parser.From; System.Uri uri = EmailUri(id); Indexable indexable = indexer.MessageToIndexable(mbox_file, uri, message, indexer.GetFolderMbox(mbox_file)); if (indexable == null) { return(null); } ++indexed_count; return(indexable); } finally { if (message != null) { message.Dispose(); } } }
void DropEmailUriList(Gtk.DragDataReceivedArgs args) { string uri_string = Encoding.UTF8.GetString(args.SelectionData.Data); subject_list = new List <string>(); UriList uri_list = new UriList(uri_string); foreach (Uri uri in uri_list) { Logger.Debug("Evolution: Dropped URI: {0}", uri.LocalPath); int mail_fd = Syscall.open(uri.LocalPath, OpenFlags.O_RDONLY); if (mail_fd == -1) { continue; } GMime.Stream stream = new GMime.StreamFs(mail_fd); GMime.Parser parser = new GMime.Parser(stream); parser.ScanFrom = true; // Use GMime to read the RFC822 message bodies (in temp // files pointed to by a uri-list) in MBOX format, so we // can get subject/sender/date info. while (!parser.Eos()) { GMime.Message message = parser.ConstructMessage(); if (message == null) { break; } Logger.Debug("Evolution: Message Subject: {0}", message.Subject); subject_list.Add(message.Subject); message.Dispose(); } ; parser.Dispose(); stream.Close(); stream.Dispose(); } }
/** * Create an indexable from an mbox message * Most of the code here is from Evo backend */ public Indexable MessageToIndexable(string file_name, System.Uri uri, GMime.Message message, string folder_name) { //Logger.Log.Debug ("Indexing " + uri + " in folder " + folder_name); Indexable indexable = new Indexable(uri); // set parent uri to the filename so that when an mbox file // is deleted, all the messages in that file can be deleted indexable.ParentUri = UriFu.PathToFileUri(file_name); indexable.Timestamp = message.Date.ToUniversalTime(); indexable.HitType = "MailMessage"; indexable.MimeType = "message/rfc822"; indexable.CacheContent = true; indexable.AddProperty(Property.NewUnsearched("fixme:client", "kmail")); indexable.AddProperty(Property.NewUnsearched("fixme:account", account_name)); indexable.AddProperty(Property.NewUnsearched("fixme:folder", folder_name)); GMime.InternetAddressList addrs; if (folder_name == Queryable.SentMailFolderName) { addrs = message.GetRecipients(GMime.RecipientType.To); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewKeyword("fixme:sentTo", mailbox.Address)); } } addrs.Dispose(); } if (folder_name == Queryable.SentMailFolderName) { addrs = message.GetRecipients(GMime.RecipientType.Cc); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewKeyword("fixme:sentTo", mailbox.Address)); } } addrs.Dispose(); } if (folder_name != Queryable.SentMailFolderName) { addrs = GMime.InternetAddressList.Parse(message.Sender); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewKeyword("fixme:gotFrom", mailbox.Address)); } } addrs.Dispose(); } if (folder_name == Queryable.SentMailFolderName) { indexable.AddProperty(Property.NewFlag("fixme:isSent")); } else { string kmail_msg_sent = message.GetHeader("X-KMail-Link-Type"); if (kmail_msg_sent == "reply") { indexable.AddProperty(Property.NewFlag("fixme:isSent")); } } // no need to store date again, use the issent flag to determine if the date is sentdate or not #if false if (folder_name == Queryable.SentMailFolderName) { indexable.AddProperty(Property.NewDate("fixme:sentdate", message.Date.ToUniversalTime())); } else { indexable.AddProperty(Property.NewDate("fixme:received", message.Date.ToUniversalTime())); } #endif indexable.SetBinaryStream(message.Stream); return(indexable); }
private Indexable GMimeMessageToIndexable(string uid, GMime.Message message, uint flags) { // Don't index messages flagged as junk if (CheckFlags(flags, B_U_Camel.CamelFlags.Junk)) { return(null); } System.Uri uri = EvolutionMailQueryable.EmailUri(this.account_name, this.folder_name, uid); Indexable indexable = new Indexable(uri); indexable.Timestamp = message.Date.ToUniversalTime(); indexable.HitType = "MailMessage"; indexable.MimeType = "message/rfc822"; indexable.CacheContent = true; indexable.AddProperty(Property.NewUnsearched("fixme:client", "evolution")); indexable.AddProperty(Property.NewUnsearched("fixme:account", "Local")); indexable.AddProperty(Property.NewUnsearched("fixme:folder", this.folder_name)); GMime.InternetAddressList addrs; if (this.folder_name == "Sent") { addrs = message.GetRecipients(GMime.RecipientType.To); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewUnsearched("fixme:sentTo", mailbox.Address)); } } addrs.Dispose(); } if (this.folder_name == "Sent") { addrs = message.GetRecipients(GMime.RecipientType.Cc); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewUnsearched("fixme:sentTo", mailbox.Address)); } } addrs.Dispose(); } if (this.folder_name != "Sent") { addrs = GMime.InternetAddressList.Parse(message.Sender); foreach (GMime.InternetAddress ia in addrs) { if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; indexable.AddProperty(Property.NewUnsearched("fixme:gotFrom", mailbox.Address)); } } addrs.Dispose(); } if (this.folder_name == "Sent") { indexable.AddProperty(Property.NewFlag("fixme:isSent")); } Property flag_prop = Property.NewUnsearched("fixme:flags", flags); flag_prop.IsMutable = true; indexable.AddProperty(flag_prop); if (CheckFlags(flags, B_U_Camel.CamelFlags.Answered)) { indexable.AddProperty(Property.NewFlag("fixme:isAnswered")); } if (CheckFlags(flags, B_U_Camel.CamelFlags.Deleted)) { indexable.AddProperty(Property.NewFlag("fixme:isDeleted")); } if (CheckFlags(flags, B_U_Camel.CamelFlags.Draft)) { indexable.AddProperty(Property.NewFlag("fixme:isDraft")); } if (CheckFlags(flags, B_U_Camel.CamelFlags.Flagged)) { indexable.AddProperty(Property.NewFlag("fixme:isFlagged")); } if (CheckFlags(flags, B_U_Camel.CamelFlags.Seen)) { indexable.AddProperty(Property.NewFlag("fixme:isSeen")); } if (CheckFlags(flags, B_U_Camel.CamelFlags.AnsweredAll)) { indexable.AddProperty(Property.NewFlag("fixme:isAnsweredAll")); } indexable.SetBinaryStream(message.Stream); return(indexable); }
void HandleDrop(int xx, int yy, bool first, Uri uri, string cm_path_folderitem, string msgid) { // get subject string subject = "<unknown>"; int mail_fd = Syscall.open(uri.LocalPath, OpenFlags.O_RDONLY); if (mail_fd != -1) { GMime.Stream stream = new GMime.StreamFs(mail_fd); GMime.Parser parser = new GMime.Parser(stream); parser.ScanFrom = false; while (!parser.Eos()) { GMime.Message message = parser.ConstructMessage(); if (message == null) { break; } subject = message.Subject; message.Dispose(); } parser.Dispose(); stream.Close(); stream.Dispose(); } // Place the cursor in the position where the uri was // dropped, adjusting x,y by the TextView's VisibleRect. Gdk.Rectangle rect = Window.Editor.VisibleRect; xx += rect.X; yy += rect.Y; Gtk.TextIter cursor = Window.Editor.GetIterAtLocation(xx, yy); Buffer.PlaceCursor(cursor); int start_offset; if (!first) { cursor = Buffer.GetIterAtMark(Buffer.InsertMark); if (cursor.LineOffset == 0) { Buffer.Insert(ref cursor, "\n"); } else { Buffer.Insert(ref cursor, ", "); } } EmailLink link_tag; link_tag = (EmailLink)Note.TagTable.CreateDynamicTag("link:cm-mail"); link_tag.EmailUri = cm_path_folderitem + "/<" + msgid + ">"; cursor = Buffer.GetIterAtMark(Buffer.InsertMark); start_offset = cursor.Offset; Buffer.Insert(ref cursor, subject); Gtk.TextIter start = Buffer.GetIterAtOffset(start_offset); Gtk.TextIter end = Buffer.GetIterAtMark(Buffer.InsertMark); Buffer.ApplyTag(link_tag, start, end); }
// Copied from FilterMail.cs:DoPullProperties private Hit MessageToHit(GMime.Message message) { string msgid = message.GetHeader("Message-Id"); if (msgid == null) { return(null); } msgid = GMime.Utils.DecodeMessageId(msgid); Hit hit = new Hit(); hit.Uri = new Uri(String.Format(GMAIL_HIT_URL, domain, msgid)); hit.AddProperty(Property.NewUnsearched("beagle:HitType", "MailMessage")); hit.AddProperty(Property.NewUnsearched("beagle:MimeType", "text/html")); hit.AddProperty(Property.NewUnsearched("beagle:Source", "GMailSearch")); hit.Score = 1.0; hit.AddProperty(Property.NewUnsearched("fixme:msgid", msgid)); string subject = GMime.Utils.HeaderDecodePhrase(message.Subject); hit.AddProperty(Property.New("dc:title", subject)); hit.Timestamp = message.Date.ToUniversalTime(); hit.AddProperty(Property.NewDate("fixme:date", message.Date.ToUniversalTime())); GMime.InternetAddressList addrs; addrs = message.GetRecipients(GMime.RecipientType.To); foreach (GMime.InternetAddress ia in addrs) { hit.AddProperty(Property.NewUnsearched("fixme:to", ia.ToString(false))); if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; hit.AddProperty(Property.New("fixme:to_address", mailbox.Address)); } hit.AddProperty(Property.New("fixme:to_name", ia.Name)); } addrs.Dispose(); addrs = message.GetRecipients(GMime.RecipientType.Cc); foreach (GMime.InternetAddress ia in addrs) { hit.AddProperty(Property.NewUnsearched("fixme:cc", ia.ToString(false))); if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; hit.AddProperty(Property.New("fixme:cc_address", mailbox.Address)); } hit.AddProperty(Property.New("fixme:cc_name", ia.Name)); } addrs.Dispose(); addrs = GMime.InternetAddressList.Parse(message.Sender); foreach (GMime.InternetAddress ia in addrs) { hit.AddProperty(Property.NewUnsearched("fixme:from", ia.ToString(false))); if (ia is GMime.InternetAddressMailbox) { GMime.InternetAddressMailbox mailbox = ia as GMime.InternetAddressMailbox; hit.AddProperty(Property.New("fixme:from_address", mailbox.Address)); } hit.AddProperty(Property.New("fixme:from_name", ia.Name)); } addrs.Dispose(); foreach (GMime.References refs in message.References) { hit.AddProperty(Property.NewUnsearched("fixme:reference", refs.MessageId)); } string list_id = message.GetHeader("List-Id"); if (list_id != null) { hit.AddProperty(Property.New("fixme:mlist", GMime.Utils.HeaderDecodePhrase(list_id))); } return(hit); }