Пример #1
0
        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();
                }
            }
        }
Пример #3
0
        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();
            }
        }
Пример #4
0
        /**
         * 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);
        }
Пример #5
0
        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);
        }
Пример #7
0
        // 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);
        }