メールの優先度を表します。
예제 #1
0
        /// <summary>
        /// メールデータをファイルから読み込みます。
        /// </summary>
        public void MailDataLoad()
        {
            // 予期せぬエラーの時にメールの本文が分かるようにするための変数
            string expSubject = "";
            int    n          = 0;
            var    lockobj    = new object();

            // スレッドのロックをかける
            lock (lockobj) {
                if (File.Exists(Application.StartupPath + @"\Mail.dat"))
                {
                    try {
                        // ファイルストリームをストリームリーダに関連付ける
                        using (var reader = new StreamReader(Application.StartupPath + @"\Mail.dat", Encoding.UTF8)) {
                            var folders = new MailFolder[] { _receive, _send, _trash };
                            // GetHederFieldとHeaderプロパティを使うためPop3クラスを作成する
                            using (var pop = new Pop3()) {
                                // データを読み出す
                                foreach (var folder in folders)
                                {
                                    try {
                                        // メールの件数を読み出す
                                        n = Int32.Parse(reader.ReadLine());
                                    }
                                    catch (Exception e) {
                                        var message = "メール件数とメールデータの数が一致していません。\n件数またはデータレコードをテキストエディタで修正してください。";
                                        MessageBox.Show(message, "Akane Mail", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                                        throw new MailLoadException(message, e);
                                    }

                                    // メールを取得する
                                    for (int j = 0; j < n; j++)
                                    {
                                        // 送信メールのみ必要な項目
                                        string address = reader.ReadLine();
                                        string subject = reader.ReadLine();

                                        // 予期せぬエラーの時にメッセージボックスに表示する件名
                                        expSubject = subject;

                                        // ヘッダを取得する
                                        string header = "";
                                        string hd     = reader.ReadLine();

                                        // 区切り文字が来るまで文字列を連結する
                                        while (hd != "\x03")
                                        {
                                            header += hd + "\r\n";
                                            hd      = reader.ReadLine();
                                        }

                                        // 本文を取得する
                                        string body = "";
                                        string b    = reader.ReadLine();

                                        // エラー文字区切りの時対策
                                        bool err_parse = false;

                                        // 区切り文字が来るまで文字列を連結する
                                        while (b != "\x03")
                                        {
                                            // 区切り文字が本文の後ろについてしまったとき
                                            if (b.Contains("\x03") && b != "\x03")
                                            {
                                                // 区切り文字を取り除く
                                                err_parse = true;
                                                b         = b.Replace("\x03", "");
                                            }

                                            body += b + "\r\n";

                                            // 区切り文字が検出されたときは区切り文字を取り除いてループから抜ける
                                            if (err_parse)
                                            {
                                                break;
                                            }

                                            b = reader.ReadLine();
                                        }

                                        // 受信・送信日時を取得する
                                        string date = reader.ReadLine();

                                        // メールサイズを取得する(送信メールは0byte扱い)
                                        string size = reader.ReadLine();

                                        // UIDLを取得する(送信メールは無視)
                                        string uidl = reader.ReadLine();

                                        // 添付ファイル名を取得する(受信メールは無視)
                                        string attach = reader.ReadLine();

                                        // 既読・未読フラグを取得する
                                        bool notReadYet = (reader.ReadLine() == "True");

                                        // CCのアドレスを取得する
                                        string cc = reader.ReadLine();

                                        // BCCを取得する(受信メールは無視)
                                        string bcc = reader.ReadLine();

                                        // 重要度を取得する
                                        string priority = reader.ReadLine();

                                        // 旧ファイルを読み込んでいるとき
                                        if (priority != "urgent" && priority != "normal" && priority != "non-urgent")
                                        {
                                            var message = "Version 1.10以下のファイルを読み込もうとしています。\nメールデータ変換ツールで変換してから読み込んでください。";
                                            MessageBox.Show(message, "Akane Mail", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                                            throw new MailLoadException(message);
                                        }

                                        // 変換フラグを取得する(旧バージョンからのデータ移行)
                                        string convert = reader.ReadLine();

                                        // ヘッダーがあった場合はそちらを優先する
                                        if (header.Length > 0)
                                        {
                                            // ヘッダープロパティにファイルから取得したヘッダを格納する
                                            pop.Header = header;

                                            // アドレスを取得する
                                            pop.GetDecodeHeaderField("From:");
                                            address = pop.Field ?? address;

                                            // 件名を取得する
                                            pop.GetDecodeHeaderField("Subject:");
                                            subject = pop.Field ?? subject;

                                            // ヘッダからCCアドレスを取得する
                                            pop.GetDecodeHeaderField("Cc:");
                                            cc = pop.Field ?? cc;

                                            // ヘッダから重要度を取得する
                                            priority = MailPriority.Parse(header);
                                        }

                                        // メール格納配列に格納する
                                        var mail = new Mail(address, header, subject, body, attach, date, size, uidl, notReadYet, convert, cc, bcc, priority);
                                        folder.Add(mail);
                                    }
                                }
                            }
                        }
                    }
                    catch (MailLoadException) {
                        throw;
                    }
                    catch (Exception exp) {
                        MessageBox.Show("予期しないエラーが発生しました。\n" + "件名:" + expSubject + "\n" + "エラー詳細 : \n" + exp.Message, "Akane Mail", MessageBoxButtons.OK, MessageBoxIcon.Stop);
                        throw new MailLoadException("予期しないエラーが発生しました", exp);
                    }
                }
            }
        }