/// <summary> /// 重要度取得 /// </summary> /// <param name="header">ヘッダ</param> /// <returns>重要度(urgent/normal/non-urgent)</returns> private string GetPriority(string header) { string _priority = "normal"; string priority = ""; nMail.Attachment attach = new nMail.Attachment(); // ヘッダにX-Priorityがあるとき if (header.Contains("X-Priority:")) { priority = attach.GetHeaderField("X-Priority:", header); if (priority == "1" || priority == "2") { _priority = "urgent"; } else if (priority == "3") { _priority = "normal"; } else if (priority == "4" || priority == "5") { _priority = "non-urgent"; } } else if (header.Contains("X-MsMail-Priotiry:")) { priority = attach.GetHeaderField("X-MsMail-Priotiry:", header); if (priority.ToLower() == "High") { _priority = "urgent"; } else if (priority.ToLower() == "Normal") { _priority = "normal"; } else if (priority.ToLower() == "low") { _priority = "non-urgent"; } } else if (header.Contains("Importance:")) { priority = attach.GetHeaderField("Importance:", header); if (priority.ToLower() == "high") { _priority = "urgent"; } else if (priority.ToLower() == "normal") { _priority = "normal"; } else if (priority.ToLower() == "low") { _priority = "non-urgent"; } } else if (header.Contains("Priority:")) { _priority = attach.GetHeaderField("Priority:", header); } return _priority; }
/// <summary> /// 転送メールを作成 /// </summary> /// <param name="mail">メール</param> private void CreateFowerdMail(Mail mail) { string strFrom = ""; string strTo = ""; string strDate = ""; string strSubject = ""; Icon appIcon; MailEditorForm NewMailForm = new MailEditorForm(); // 親フォームをForm1に設定する NewMailForm.MainForm = this; // 送信箱の配列をForm3に渡す NewMailForm.SendList = collectionMail[SEND]; // 転送のために件名を設定する(件名は空白にする) NewMailForm.textAddress.Text = ""; NewMailForm.textSubject.Text = "Fw:" + mail.subject; nMail.Attachment atch = new nMail.Attachment(); // メールヘッダが存在するとき if (mail.header != "") { strFrom = atch.GetHeaderField("From:", mail.header); strTo = atch.GetHeaderField("To:", mail.header); strDate = atch.GetHeaderField("Date:", mail.header); strSubject = atch.GetHeaderField("Subject:", mail.header); } else { strFrom = AccountInfo.mailAddress; strTo = mail.address; strDate = mail.date; strSubject = mail.subject; } string fwHeader = "----------------------- Original Message -----------------------\r\n"; fwHeader = fwHeader + " From: " + strFrom + "\r\n To: " + strTo + "\r\n Date: " + strDate; fwHeader = fwHeader + "\r\n Subject:" + strSubject + "\r\n----\r\n\r\n"; // 添付なしメールのときはbodyを渡す if (!attachMailReplay) { // NewMailForm.textBody.Text = "\r\n\r\n--- Forwarded by " + Mail.mailAddress + " ---\r\n" + fwHeader + mail.body; // UTF-8でエンコードされたメールのときはattachMailBodyを渡す if (attachMailBody != "") { NewMailForm.textBody.Text = "\r\n\r\n--- Forwarded by " + AccountInfo.mailAddress + " ---\r\n" + fwHeader + attachMailBody; } else { // JISコードなどのメールは通常のbodyを渡す NewMailForm.textBody.Text = "\r\n\r\n--- Forwarded by " + AccountInfo.mailAddress + " ---\r\n" + fwHeader + mail.body; } } else { // 添付付きメールのときはattachMailBodyを渡す if (attachMailBody != "") { NewMailForm.textBody.Text = "\r\n\r\n--- Forwarded by " + AccountInfo.mailAddress + " ---\r\n" + fwHeader + attachMailBody; } else { NewMailForm.textBody.Text = "\r\n\r\n--- Forwarded by " + AccountInfo.mailAddress + " ---\r\n" + fwHeader + mail.body; } } // 送信メールで添付ファイルがあるとき if (mail.attach != "") { // 添付リストメニューを表示 NewMailForm.buttonAttachList.Visible = true; // 添付ファイルリストを分割して一覧にする NewMailForm.attachFileNameList = mail.attach.Split(','); // 添付ファイルの数だけメニューを追加する foreach (var attachFile in NewMailForm.attachFileNameList) { appIcon = System.Drawing.Icon.ExtractAssociatedIcon(attachFile); NewMailForm.buttonAttachList.DropDownItems.Add(attachFile, appIcon.ToBitmap()); } } else if (this.buttonAttachList.Visible) { // 受信メールで添付ファイルがあるとき // 添付リストメニューを表示 NewMailForm.buttonAttachList.Visible = true; // 添付ファイルの数だけメニューを追加する foreach (var attachFile in this.buttonAttachList.DropDownItems.Cast<ToolStripItem>().Select(i => i.Text)) { // 添付ファイルが存在するかを確認してから添付する if (File.Exists(Application.StartupPath + @"\tmp\" + attachFile)) { appIcon = System.Drawing.Icon.ExtractAssociatedIcon(Application.StartupPath + @"\tmp\" + attachFile); NewMailForm.buttonAttachList.DropDownItems.Add(Application.StartupPath + @"\tmp\" + attachFile, appIcon.ToBitmap()); } } } // メール新規作成フォームを表示する NewMailForm.Show(); }
/// <summary> /// 添付ファイル付きメールの展開 /// </summary> /// <param name="mail"></param> private void GetAttachMail(Mail mail) { // 添付ファイル保存対象フォルダを選択する if (folderBrowserDialog1.ShowDialog() == DialogResult.OK) { try { // 添付ファイルクラスを作成する nMail.Attachment attach = new nMail.Attachment(); // 保存パスを設定する attach.Path = folderBrowserDialog1.SelectedPath; // 添付ファイル展開用のテンポラリファイルを作成する string tmpFileName = Path.GetTempFileName(); using (var writer = new StreamWriter(tmpFileName)) { writer.Write(mail.header); writer.Write("\r\n"); writer.Write(mail.body); } // テンポラリファイルを開いて添付ファイルを開く using (var reader = new StreamReader(tmpFileName)) { string header = reader.ReadToEnd(); // ヘッダと本文付きの文字列を添付クラスに追加する attach.Add(header); } // 添付ファイルを保存する attach.Save(); MessageBox.Show(attach.Path + "に添付ファイル" + attach.FileName + "を保存しました。", "添付ファイルの取り出し", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (nMailException nex) { string message = ""; switch (nex.ErrorCode) { case nMail.Attachment.ErrorFileOpen: message = "添付ファイルがオープンできません。"; break; case nMail.Attachment.ErrorInvalidNo: message = "分割されたメールの順番が正しくないか、該当しないファイルが入っています。"; break; case nMail.Attachment.ErrorPartial: message = "分割されたメールが全て揃っていません"; break; default: break; } MessageBox.Show(message, "エラー", MessageBoxButtons.OK, MessageBoxIcon.Stop); } catch (Exception ex) { MessageBox.Show(String.Format("エラー メッセージ:{0:s}", ex.Message), "エラー", MessageBoxButtons.OK, MessageBoxIcon.Stop); } } }
/// <summary> /// 指定されたメールを開く /// </summary> /// <param name="mail">メール</param> private void OpenMail(Mail mail) { Icon appIcon; bool htmlMail = false; bool base64Mail = false; // 添付ファイルメニューに登録されている要素を破棄する buttonAttachList.DropDownItems.Clear(); buttonAttachList.Visible = false; attachMenuFlag = false; attachMailReplay = false; attachMailBody = ""; // 添付ファイルクラスのインスタンスを作成する nMail.Attachment attach = new nMail.Attachment(); // Contents-Typeがtext/htmlのメールか確認するフラグを取得する htmlMail = attach.GetHeaderField("Content-Type:", mail.header).Contains("text/html"); // 未読メールの場合 checkNotYetReadMail = mail.notReadYet; // 保存パスはプログラム直下に作成したtmpに設定する attach.Path = Application.StartupPath + @"\tmp"; // 添付ファイルが存在するかを確認する int id = attach.GetId(mail.header); // 添付ファイルが存在する場合(存在しない場合は-1が返る) // もしくは HTML メールの場合 if (id != nMail.Attachment.NoAttachmentFile || htmlMail) { try { // 旧バージョンからの変換データではないとき if (mail.convert == "") { // HTML/Base64のデコードを有効にする Options.EnableDecodeBody(); } else { // HTML/Base64のデコードを無効にする Options.DisableDecodeBodyText(); } // ヘッダと本文付きの文字列を添付クラスに追加する attach.Add(mail.header, mail.body); // 添付ファイルを取り外す attach.Save(); } catch (Exception ex) { // エラーメッセージを表示する labelMessage.Text = String.Format("エラー メッセージ:{0:s}", ex.Message); return; } // 添付返信フラグをtrueにする attachMailReplay = true; // IE コンポーネントを使用かつ HTML パートを保存したファイルがある場合 if (AccountInfo.bodyIEShow && attach.HtmlFile != "") { // 本文表示用のテキストボックスの表示を非表示にしてHTML表示用のWebBrowserを表示する this.textBody.Visible = false; this.browserBody.Visible = true; // Contents-Typeがtext/htmlでないとき(テキストとHTMLパートが存在する添付メール) if (!htmlMail) { // テキストパートを返信文に格納する attachMailBody = attach.Body; } else { // 本文にHTMLタグが直書きされているタイプのHTMLメールのとき // 展開したHTMLファイルをストリーム読み込みしてテキストを返信用の変数に格納する using (var sr = new StreamReader(Application.StartupPath + @"\tmp\" + attach.HtmlFile, Encoding.Default)) { string htmlBody = sr.ReadToEnd(); // HTMLからタグを取り除いた本文を返信文に格納する attachMailBody = Mail.HtmlToText(htmlBody, mail.header); } } // 添付ファイル保存フォルダに展開されたHTMLファイルをWebBrowserで表示する browserBody.AllowNavigation = true; browserBody.Navigate(attach.Path + @"\" + attach.HtmlFile); } else { // 添付ファイルを外した本文をテキストボックスに表示する this.browserBody.Visible = false; this.textBody.Visible = true; // IE コンポーネントを使用せず、HTML メールで HTML パートを保存したファイルがある場合 if (htmlMail && !AccountInfo.bodyIEShow && attach.HtmlFile != "") { // 本文にHTMLタグが直書きされているタイプのHTMLメールのとき // 展開したHTMLファイルをストリーム読み込みしてテキストボックスに表示する using (var sr = new StreamReader(Application.StartupPath + @"\tmp\" + attach.HtmlFile, Encoding.Default)) { string htmlBody = sr.ReadToEnd(); // HTMLからタグを取り除く htmlBody = Mail.HtmlToText(htmlBody, mail.header); attachMailBody = htmlBody; this.textBody.Text = htmlBody; } } else if (attach.Body != "") { // デコードした本文の行末が\n\nではないとき if (!attach.Body.Contains("\n\n")) { attachMailBody = attach.Body; this.textBody.Text = attach.Body; } else { attach.Body.Replace("\n\n", "\r\n"); attachMailBody = attach.Body.Replace("\n", "\r\n"); this.textBody.Text = attachMailBody; } } else { this.textBody.Text = mail.body; } } // 添付ファイルを外した本文が空値以外の場合 // 添付ファイル名リストがnull以外のとき if (attach.FileNameList != null) { // IE コンポーネントありで、添付ファイルが HTML パートを保存したファイルのみの場合はメニューを表示しない if (!AccountInfo.bodyIEShow || attach.HtmlFile == "" || attach.FileNameList.Length > 1) { buttonAttachList.Visible = true; attachMenuFlag = true; // メニューに添付ファイルの名前を追加する // IE コンポーネントありで、添付ファイルが HTML パートを保存したファイルはメニューに表示しない foreach (var attachFile in attach.FileNameList.Where(a => a != attach.HtmlFile)) { appIcon = System.Drawing.Icon.ExtractAssociatedIcon(Application.StartupPath + @"\tmp\" + attachFile); buttonAttachList.DropDownItems.Add(attachFile, appIcon.ToBitmap()); } } } } else { // 添付ファイルが存在しない通常のメールまたは // 送信済みメールのときは本文をテキストボックスに表示する this.browserBody.Visible = false; this.textBody.Visible = true; // 添付ファイルリストが""でないとき if (mail.attach != "") { buttonAttachList.Visible = true; // 添付ファイルリストを分割して一覧にする string[] attachFileNameList = mail.attach.Split(','); for (int i = 0; i < attachFileNameList.Length; i++) { var attachFile = attachFileNameList[i]; if (File.Exists(attachFile)) { appIcon = System.Drawing.Icon.ExtractAssociatedIcon(attachFile); buttonAttachList.DropDownItems.Add(attachFile, appIcon.ToBitmap()); } else { buttonAttachList.DropDownItems.Add(attachFile + "は削除されています。"); buttonAttachList.DropDownItems[i].Enabled = false; } } } // Contents-TypeがBase64のメールの場合 base64Mail = attach.GetDecodeHeaderField("Content-Transfer-Encoding:", mail.header).Contains("base64"); // Base64の文章が添付されている場合 if (base64Mail) { // 文章をデコードする Options.EnableDecodeBody(); // ヘッダと本文付きの文字列を添付クラスに追加する attach.Add(mail.header, mail.body); // 添付ファイルを取り外す attach.Save(); if (!attach.Body.Contains("\n\n")) { attachMailBody = attach.Body; this.textBody.Text = attach.Body; } else { attach.Body.Replace("\n\n", "\r\n"); attachMailBody = attach.Body.Replace("\n", "\r\n"); this.textBody.Text = attachMailBody; } } else { // ISO-2022-JPでかつquoted-printableがある場合(nMail.dllが対応するまでの暫定処理) if (attach.GetHeaderField("Content-Type:", mail.header).ToLower().Contains("iso-2022-jp") && attach.GetHeaderField("Content-Transfer-Encoding:", mail.header).Contains("quoted-printable")) { // 文章をデコードする Options.EnableDecodeBody(); // ヘッダと本文付きの文字列を添付クラスに追加する attach.Add(mail.header, mail.body); // 添付ファイルを取り外す attach.Save(); if (!attach.Body.Contains("\n\n")) { attachMailBody = attach.Body; this.textBody.Text = attach.Body; } else { attach.Body.Replace("\n\n", "\r\n"); attachMailBody = attach.Body.Replace("\n", "\r\n"); this.textBody.Text = attachMailBody; } } else if (attach.GetHeaderField("X-NMAIL-BODY-UTF8:", mail.header).Contains("8bit")) { // Unicode化されたUTF-8文字列をデコードする // 1件のメールサイズの大きさのbyte型配列を確保 var bs = mail.body.Select(c => (byte)c).ToArray(); // GetStringでバイト型配列をUTF-8の配列にエンコードする attachMailBody = Encoding.UTF8.GetString(bs); this.textBody.Text = attachMailBody; } else { // テキストボックスに出力する文字コードをJISに変更する byte[] b = Encoding.GetEncoding("iso-2022-jp").GetBytes(mail.body); string strBody = Encoding.GetEncoding("iso-2022-jp").GetString(b); // 本文をテキストとして表示する this.textBody.Text = strBody; } } } }
/// <summary> /// 重要度取得 /// </summary> /// <param name="header">ヘッダ</param> /// <returns>重要度(urgent/normal/non-urgent)</returns> private string GetPriority(string header) { string _priority = "normal"; string priority = ""; nMail.Attachment attach = new nMail.Attachment(); // ヘッダにX-Priorityがあるとき if (header.Contains("X-Priority:")) { priority = attach.GetHeaderField("X-Priority:", header); if (priority == "1" || priority == "2") { _priority = "urgent"; } else if (priority == "3") { _priority = "normal"; } else if (priority == "4" || priority == "5") { _priority = "non-urgent"; } } else if (header.Contains("X-MsMail-Priotiry:")) { priority = attach.GetHeaderField("X-MsMail-Priotiry:", header); if (priority.ToLower() == "High") { _priority = "urgent"; } else if (priority.ToLower() == "Normal") { _priority = "normal"; } else if (priority.ToLower() == "low") { _priority = "non-urgent"; } } else if (header.Contains("Importance:")) { priority = attach.GetHeaderField("Importance:", header); if (priority.ToLower() == "high") { _priority = "urgent"; } else if (priority.ToLower() == "normal") { _priority = "normal"; } else if (priority.ToLower() == "low") { _priority = "non-urgent"; } } else if (header.Contains("Priority:")) { _priority = attach.GetHeaderField("Priority:", header); } return(_priority); }