/// <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="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); } } }