Exemplo n.º 1
0
        ///-------------------------------------------------------------
        /// <summary>
        ///     メール受信 </summary>
        ///-------------------------------------------------------------
        private void PopTest()
        {
            // メール設定データ
            if (!dts.メール設定.Any(a => a.ID == global.mailKey))
            {
                return;
            }

            var s = dts.メール設定.Single(a => a.ID == global.mailKey);

            //処理中
            _mJob = global.flgOn;

            //マウスポインタを待機にする
            this.Cursor = Cursors.WaitCursor;

            //受信メールカウント
            int _mCount = 0;

            //ファイル名連番
            int fNumber = 0;

            //message-ID
            string _msid;

            // POPサーバ、ユーザ名、パスワードを設定
            string hostname = s.POPサーバー;
            string username = s.ログイン名;
            string password = s.パスワード;
            int    popPort  = s.POPポート番号;

            // POP サーバに接続します。
            //addListView(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), "POPサーバに接続", Color.Black);
            PopClient pop = new PopClient(hostname, popPort);

            //POPサーバへの接続障害時は何もしないで待機状態へ戻る 2011/07/20
            if (global.Msglog.StartsWith("ERR"))
            {
                //addListView(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), global.Msglog, Color.Red);

                //非処理中ステータス
                _mJob = global.flgOff;

                //マウスポインタを戻す
                this.Cursor = Cursors.Default;

                return;
            }

            //addListView(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"), global.Msglog, Color.Black);

            // ログインします。
            pop.Login(username, password);

            // POP サーバに溜まっているメールのリストを取得します。
            ArrayList list = pop.GetList();

            for (int i = 0; i < list.Count; ++i)
            {
                // メール本体を取得する
                string mailtext = pop.GetMail((string)list[i]);

                // Mail クラスを作成
                Mail mail = new Mail(mailtext);

                //受信対象メールの判定値
                int _mTarget = 0;

                //message-IDを取得
                if (mail.Header["Message-ID"].Length > 0)
                {
                    _msid = MailHeader.Decode(mail.Header["Message-ID"][0]).Replace("Message-ID: ", "");

                    // 2015/11/24
                    _msid = _msid.Replace("Message-Id: ", "");
                }
                else
                {
                    _msid = string.Empty;
                }

                // 重複メールは受信しない
                if (getMessageid(_msid))
                {
                    //Content-Typeがあるメール
                    if (mail.Header["Content-Type"].Length > 0)
                    {
                        string fAdd = string.Empty;
                        if (Properties.Settings.Default.checkfromAddress != null)
                        {
                            fAdd = Properties.Settings.Default.checkfromAddress;
                        }

                        // 差出人指定があるときアドレスを調べる
                        if (fAdd != string.Empty)
                        {
                            if (!MailHeader.Decode(mail.Header["From"][0]).Replace("From: ", "").Contains(fAdd))
                            {
                                continue;
                            }
                        }
                        _mTarget = 1;

                        ////差出人アドレスを調べる
                        //foreach (string add in reAddress)
                        //{
                        //    if (MailHeader.Decode(mail.Header["From"][0]).Replace("From: ", "").IndexOf(add) >= 0)
                        //    {
                        //        _mTarget = 1;
                        //        break;
                        //    }
                        //}
                    }
                }

                // 受信対象メールのとき以下の処理を実行する
                if (_mTarget == 1)
                {
                    // メールデータ
                    mailData md = new mailData();
                    mailDataInitial(md);    //メールデータ初期化

                    string sStr = string.Empty;

                    // 送信日時を取得
                    if (mail.Header["Date"].Length > 0)
                    {
                        sStr = MailHeader.Decode(mail.Header["Date"][0]).Replace("Date: ", "").Trim();

                        //タイムゾーン記号を消去
                        sStr = sStr.Replace("(JST)", "").Trim();
                        sStr = sStr.Replace("(UT)", "").Trim();
                        sStr = sStr.Replace("(EST)", "").Trim();
                        sStr = sStr.Replace("(CST)", "").Trim();
                        sStr = sStr.Replace("(MST)", "").Trim();
                        sStr = sStr.Replace("(PST)", "").Trim();
                        sStr = sStr.Replace("(EDT)", "").Trim();
                        sStr = sStr.Replace("(CDT)", "").Trim();
                        sStr = sStr.Replace("(MDT)", "").Trim();
                        sStr = sStr.Replace("(PDT)", "").Trim();
                        sStr = sStr.Replace("(GMT)", "").Trim();
                        sStr = sStr.Replace("(C)", "").Trim();
                        sStr = sStr.Replace("(UTC)", "").Trim();

                        sStr = sStr.Replace("JST", "").Trim();
                        sStr = sStr.Replace("UT", "").Trim();
                        sStr = sStr.Replace("EST", "").Trim();
                        sStr = sStr.Replace("CST", "").Trim();
                        sStr = sStr.Replace("MST", "").Trim();
                        sStr = sStr.Replace("PST", "").Trim();
                        sStr = sStr.Replace("EDT", "").Trim();
                        sStr = sStr.Replace("CDT", "").Trim();
                        sStr = sStr.Replace("MDT", "").Trim();
                        sStr = sStr.Replace("PDT", "").Trim();
                        sStr = sStr.Replace("GMT", "").Trim();
                        sStr = sStr.Replace("C", "").Trim();
                        sStr = sStr.Replace("UTC", "").Trim();

                        //dg1[0, dg1.Rows.Count - 1].Value = DateTime.Parse(sStr).ToString("yyyy/M/dd HH:mm:ss");

                        // 世界標準時(RFC2822表記)からDetaTime型に変換
                        try
                        {
                            string[] expectedFormats = { "ddd, d MMM yyyy HH':'mm':'ss", "ddd, d MMM yyyy HH':'mm':'ss zzz", "d MMM yyyy HH':'mm':'ss", "d MMM yyyy HH':'mm':'ss zzz", "d", "D", "f", "F", "g", "G", "m", "r", "R", "s", "t", "T", "u", "U", "y" };
                            DateTime myUtcDT3        = System.DateTime.ParseExact(sStr, expectedFormats, DateTimeFormatInfo.InvariantInfo, DateTimeStyles.None);
                            md.sendTime = myUtcDT3.ToString("yyyy/MM/dd HH:mm:ss");
                        }
                        catch (Exception)
                        {
                            md.sendTime = sStr;
                        }
                    }
                    else
                    {
                        sStr = string.Empty;
                    }

                    //差出人
                    md.fromAddress = MailHeader.Decode(mail.Header["From"][0]).Replace("From: ", "");
                    md.fromAddress = md.fromAddress.Replace("'", " ");

                    //if (md.fromAddress.IndexOf(Properties.Settings.Default.interFaxAddress) >= 0)
                    //{
                    //    _fromInterFax = 1;
                    //}
                    //else
                    //{
                    //    _fromInterFax = 0;
                    //}

                    //宛先
                    if (mail.Header["To: "].Length > 0)
                    {
                        md.toAddress = MailHeader.Decode(mail.Header["To: "][0]).Replace("To:", "");
                        md.toAddress = md.toAddress.Replace("'", " ");
                    }
                    else
                    {
                        md.toAddress = string.Empty;
                    }

                    //if (_fromInterFax == 1) //差出人がinterfaxのとき
                    //{
                    //    md.toAddress = MailHeader.Decode(mail.Header["X-Interfax-InterFAXNumber:"][0]).Replace("X-Interfax-InterFAXNumber: ", "");
                    //    md.toAddress = md.toAddress.Replace("'", " ");
                    //}
                    //else
                    //{
                    //    md.toAddress = MailHeader.Decode(mail.Header["To:"][0]).Replace("To: ", "");
                    //    md.toAddress = md.toAddress.Replace("'", " ");
                    //}

                    //件名
                    //件名がないとき 2011/06/27
                    if (mail.Header["Subject"].Length > 0)
                    {
                        md.subject = MailHeader.Decode(mail.Header["Subject"][0]).Replace("Subject: ", "");
                        md.subject = md.subject.Replace("'", " ");
                    }

                    //マルチパートの判定
                    int mp = mail.Body.Multiparts.Length;

                    //マルチパート または multipart/alternativeの判断
                    if (mp == 0)    //マルチパートではない
                    {
                        //Content-Type
                        sStr = MailHeader.Decode(mail.Header["Content-Type"][0]).Replace("Content-Type:", "").Trim();

                        //charset
                        if (sStr.IndexOf("charset=") > -1)
                        {
                            string sCharset = sStr.Substring(sStr.IndexOf("charset=")).Replace("charset=", "");
                            sCharset = sCharset.Replace(@"""", "");

                            // 2015/11/21
                            int cs = sCharset.IndexOf(";");
                            if (cs > -1)
                            {
                                // 2015/11/21 utf-8; reply-type=originalの「; reply-type=original」部を消去する
                                string cc = sCharset.Substring(cs, sCharset.Length - cs);
                                sCharset = sCharset.Replace(cc, "");
                            }

                            // メール本文を取得する
                            // Content-Type の charset を参照してデコード
                            if (mail.Header["Content-Transfer-Encoding"].Length > 0)
                            {
                                sStr = MailHeader.Decode(mail.Header["Content-Transfer-Encoding"][0]).Replace("Content-Transfer-Encoding:", "").Trim();
                                byte[] bytes;
                                if (sStr == "base64" || sStr == "BASE64")
                                {
                                    bytes = Convert.FromBase64String(mail.Body.Text);
                                }
                                else
                                {
                                    bytes = Encoding.ASCII.GetBytes(mail.Body.Text);
                                }

                                // 2016/02/18
                                if (sCharset == "cp932")
                                {
                                    sCharset = "Shift_JIS";
                                }

                                string mailbody = Encoding.GetEncoding(sCharset).GetString(bytes);
                                md.message = mailbody.Replace("'", " ");
                            }
                            else
                            {
                                md.message = string.Empty;
                            }
                        }
                        else
                        {
                            md.message = string.Empty;
                        }
                    }
                    else   //マルチパートのとき
                    {
                        //本文の確認 2011/06/27
                        for (int ix = 0; ix < mp; ix++)
                        {
                            //Content-Type を検証する
                            MailMultipart part1 = mail.Body.Multiparts[ix];

                            //マルチパートの更に中のマルチパート数を取得する 2011/06/27
                            int mb = part1.Body.Multiparts.Length;

                            //マルチパートの中のマルチパート毎の"Content-Type"を検証する 2011/06/27
                            for (int n = 0; n < mb; n++)
                            {
                                //Content-Type を検証する
                                MailMultipart p = part1.Body.Multiparts[n];
                                sStr = MailHeader.Decode(p.Header["Content-Type"][0]).Replace("Content-Type:", "").Trim();

                                //本文("text/plain")か? 2011/06/27
                                if (sStr.IndexOf("text/plain") >= 0)
                                {
                                    //charset
                                    if (sStr.IndexOf("charset=") > -1)
                                    {
                                        string sCharset = sStr.Substring(sStr.IndexOf("charset=")).Replace("charset=", "");
                                        sCharset = sCharset.Replace(@"""", "");

                                        // 2015/11/21
                                        int cs = sCharset.IndexOf(";");
                                        if (cs > -1)
                                        {
                                            // 2015/11/21 utf-8; reply-type=originalの「; reply-type=original」部を消去する
                                            string cc = sCharset.Substring(cs, sCharset.Length - cs);
                                            sCharset = sCharset.Replace(cc, "");
                                        }

                                        //エンコード名以降の文字列を削除する
                                        int m = sCharset.IndexOf(";");
                                        if (m >= 0)
                                        {
                                            sCharset = sCharset.Remove(m);
                                        }

                                        // メール本文を取得する
                                        // Content-Type の charset を参照してデコード
                                        //Content-Transfer-Encodingを取得する
                                        if (mail.Header["Content-Transfer-Encoding"].Length > 0)
                                        {
                                            sStr = MailHeader.Decode(p.Header["Content-Transfer-Encoding"][0]).Replace("Content-Transfer-Encoding:", "").Trim();
                                            byte[] bytes;
                                            if (sStr == "base64" || sStr == "BASE64")
                                            {
                                                bytes = Convert.FromBase64String(p.Body.Text);
                                            }
                                            else
                                            {
                                                bytes = Encoding.ASCII.GetBytes(p.Body.Text);
                                            }

                                            // 2016/02/18
                                            if (sCharset == "cp932")
                                            {
                                                sCharset = "Shift_JIS";
                                            }

                                            string mailbody = Encoding.GetEncoding(sCharset).GetString(bytes);
                                            md.message = mailbody.Replace("'", " ");
                                        }
                                        else
                                        {
                                            md.message = string.Empty;
                                        }
                                    }
                                    break;
                                }
                            }
                        }

                        // 添付ファイルの確認
                        //↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

                        for (int ix = 1; ix < mp; ix++)
                        {
                            //Content-Type を検証する
                            MailMultipart part2 = mail.Body.Multiparts[ix];
                            sStr = MailHeader.Decode(part2.Header["Content-Type"][0]).Replace("Content-Type:", "").Trim();

                            int fType = global.ANYFILE;

                            //添付ファイルがCSVファイルならば保存する
                            if (sStr.Contains("text/csv"))
                            {
                                fType = global.CSVFILE;

                                //Content-Transfer-Encodingを取得する
                                sStr = MailHeader.Decode(part2.Header["Content-Transfer-Encoding"][0]).Replace("Content-Transfer-Encoding:", "").Trim();

                                if (sStr == "base64")
                                {
                                    byte[] bytes = Convert.FromBase64String(part2.Body.Text);

                                    string fName;
                                    fName = string.Format("{0:0000}", DateTime.Today.Year) +
                                            string.Format("{0:00}", DateTime.Today.Month) +
                                            string.Format("{0:00}", DateTime.Today.Day) +
                                            string.Format("{0:00}", DateTime.Now.Hour) +
                                            string.Format("{0:00}", DateTime.Now.Minute) +
                                            string.Format("{0:00}", DateTime.Now.Second);

                                    fNumber++;

                                    //保存フォルダがあるか?なければ作成する(CSVフォルダ)
                                    if (!System.IO.Directory.Exists(Properties.Settings.Default.reCsvPath))
                                    {
                                        System.IO.Directory.CreateDirectory(Properties.Settings.Default.reCsvPath);
                                    }

                                    fName = Properties.Settings.Default.reCsvPath + fName + string.Format("{0:000}", fNumber) + ".csv";

                                    using (Stream stm = File.Open(fName, FileMode.Create))
                                        using (BinaryWriter bw = new BinaryWriter(stm))
                                        {
                                            bw.Write(bytes);
                                        }

                                    //添付ファイル名
                                    md.addFilename = fName;
                                }
                            }
                        }
                    }

                    //// 確認用に取得したメールをそのままカレントディレクトリに書き出します。
                    //using (StreamWriter sw = new StreamWriter(DateTime.Now.ToString("yyyyMMddHHmmssfff") + i.ToString("0000") + ".txt"))
                    //{
                    //    sw.Write(mailtext);
                    //}

                    // メールを POP サーバから取得します。
                    // ★注意★
                    // 削除したメールを元に戻すことはできません。
                    // 本当に削除していい場合は以下のコメントをはずしてください。
                    //pop.DeleteMail((string)list[i]);

                    // 通信ログ書き込み
                    putMaillog(md);

                    // messageid履歴書き込み
                    messageidUpDate(_msid);

                    _mCount++;
                }
            }

            // 切断する
            pop.Close();

            //非処理中ステータス
            _mJob = global.JOBOUT;

            //マウスポインタを戻す
            this.Cursor = Cursors.Default;

            // 終了表示
            MessageBox.Show(_mCount.ToString() + "件のメールを受信しました。");
        }