// Spludlow Software // Copyright © Samuel P. Ludlow 2020 All Rights Reserved // Distributed under the terms of the GNU General Public License version 3 // Distributed WITHOUT ANY WARRANTY; without implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE // https://www.spludlow.co.uk/LICENCE.TXT // The Spludlow logo is a registered trademark of Samuel P. Ludlow and may not be used without permission // v1.14 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Text; using System.Data; using System.Drawing; public partial class Mail : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Spludlow.WebControls.DisableOnClick(this.ButtonReceive); if (this.IsPostBack == false) { this.LiteralPage.Text = "1"; foreach (string mailFolder in Spludlow.Email.ReceiveMail.MailFolders()) this.DropDownListFolders.Items.Add(mailFolder); this.DropDownListOrder.Items.Add("ReceivedTime DESC"); this.DropDownListOrder.Items.Add("FileSize DESC"); this._ShowMail(); } } protected void ButtonReceive_Click(object sender, EventArgs e) { this.GridViewStore.SelectedIndex = -1; //string userCallConfig = Spludlow.Config.Get("Spludlow.Mail.UserReceive", true); //if (userCallConfig == null) //{ // Spludlow.Email.ReceiveMail.ReadDrop(); //} //else //{ // string[] callAddress = Spludlow.Text.Split(userCallConfig, ',', true, false); // if (callAddress.Length != 4) // throw new ApplicationException("Mail Receive User Call bad length, expected HATM comma seperate address: " + userCallConfig); // Spludlow.Call.Now(callAddress[0], callAddress[1], callAddress[2], callAddress[3]); //} this._ShowMail(); } private void _ShowMail() { int pageSize = 50; this.LiteralDrop.Text = "Drop File Count: " + Spludlow.Email.ReceiveMail.CountDrop(); int pageIndex = Int32.Parse(this.LiteralPage.Text) - 1; string folder = this.DropDownListFolders.SelectedValue; DataTable storeTable = Spludlow.Email.ReceiveMail.QueryStore(pageIndex, pageSize, folder, this.DropDownListOrder.SelectedValue).Tables[0]; string emailStoreHost = Environment.MachineName; StringBuilder url = new StringBuilder(); url.Append("Generic.aspx?H="); url.Append(emailStoreHost); url.Append("&FILE=@StoreFilename&FILENAME=@Filename&MIME=@MimeType"); string urlTemplate = url.ToString(); string storeDirectory = Spludlow.Config.Get("SpludlowMail.Store"); storeTable.Columns.Add("FileLink", typeof(string)); storeTable.Columns.Add("TextFileLink", typeof(string)); storeTable.Columns.Add("FileLengthText", typeof(string)); foreach (DataRow row in storeTable.Rows) { long mailMessageId = (long)row["MailMessageId"]; string extension = (string)row["FileExtention"]; string filename = mailMessageId + extension; string storeFilename = Spludlow.Io.FileStore.FilePath(mailMessageId, storeDirectory, extension, false); url.Length = 0; url.Append(urlTemplate); url.Replace("@StoreFilename", HttpUtility.UrlEncode(storeFilename)); // Link for outlook url.Replace("@Filename", HttpUtility.UrlEncode(filename)); url.Replace("@MimeType", HttpUtility.UrlEncode("message/rfc822")); row["FileLink"] = url.ToString(); url.Length = 0; url.Append(urlTemplate); url.Replace("@StoreFilename", HttpUtility.UrlEncode(storeFilename)); // Link for notepad url.Replace("@Filename", HttpUtility.UrlEncode(filename + ".txt")); url.Replace("@MimeType", HttpUtility.UrlEncode("text/plain")); row["TextFileLink"] = url.ToString(); row["FileLengthText"] = Spludlow.Text.DataSize((int)row["FileSize"]); } this.GridViewStore.DataSource = storeTable; this.GridViewStore.DataBind(); } protected void GridViewStore_SelectedIndexChanged(object sender, EventArgs e) { long mailMessageId = Spludlow.WebControls.KeyInt64(this.GridViewStore, this.GridViewStore.SelectedIndex, "MailMessageId"); this.GridViewAddresses.DataSource = Spludlow.Email.ReceiveMail.MessageAddresses(mailMessageId); this.GridViewAddresses.DataBind(); string storeDirectory = Spludlow.Config.Get("SpludlowMail.Store"); string storeFilename = Spludlow.Io.FileStore.FilePath(mailMessageId, storeDirectory, ".eml", false); this.ButtonDelete.Visible = true; if (this.CheckBoxReadAttachments.Checked == false) return; using (Spludlow.TempDirectory tempDir = new Spludlow.TempDirectory()) { string directory = tempDir + @"\" + Path.GetFileNameWithoutExtension(storeFilename); Directory.CreateDirectory(directory); Spludlow.Email.SimpleMailMessage message = new Spludlow.Email.SimpleMailMessage(storeFilename, directory); this.GridViewAttachments.DataSource = message.AttachmentsTable; this.GridViewAttachments.DataBind(); string archiveFilename = Spludlow.WebServices.CreateProgramDataTempFilename(".7z"); Spludlow.Archive.Create(archiveFilename, directory); string emailStoreHost = Environment.MachineName; string filename = Path.GetFileName(archiveFilename); StringBuilder url = new StringBuilder(); url.Append("Generic.aspx?H="); url.Append(emailStoreHost); url.Append("&FILE=@StoreFilename&FILENAME=@Filename&MIME=@MimeType"); url.Replace("@StoreFilename", HttpUtility.UrlEncode(archiveFilename)); url.Replace("@Filename", HttpUtility.UrlEncode(filename)); url.Replace("@MimeType", HttpUtility.UrlEncode("data")); this.HyperLinkAttachments.NavigateUrl = url.ToString(); this.HyperLinkAttachments.Text = filename; } } protected void ButtonPagePrev_Click(object sender, EventArgs e) { this.GridViewStore.SelectedIndex = -1; int page = Int32.Parse(this.LiteralPage.Text); this.LiteralPage.Text = (page - 1).ToString(); this._ShowMail(); } protected void ButtonPageNext_Click(object sender, EventArgs e) { this.GridViewStore.SelectedIndex = -1; int page = Int32.Parse(this.LiteralPage.Text); this.LiteralPage.Text = (page + 1).ToString(); this._ShowMail(); } protected void DropDownListFolders_SelectedIndexChanged(object sender, EventArgs e) { this.GridViewStore.SelectedIndex = -1; this.LiteralPage.Text = "1"; this._ShowMail(); } protected void GridViewStore_RowDataBound(object sender, GridViewRowEventArgs e) { if (e.Row.RowType != DataControlRowType.DataRow) return; DataRow row = ((DataRowView)e.Row.DataItem).Row; DateTime receivedTime = (DateTime)row["ReceivedTime"]; int daysBack = (DateTime.Now.Date - receivedTime.Date).Days; e.Row.Cells[1].BackColor = Spludlow.Drawing.Colour.FromHSV(daysBack * 30, 0.5, 1); } protected void ButtonDelete_Click(object sender, EventArgs e) { long mailMessageId = Spludlow.WebControls.KeyInt64(this.GridViewStore, this.GridViewStore.SelectedIndex, "MailMessageId"); Spludlow.Email.ReceiveMail.DeleteMailMessage(mailMessageId, true); this.GridViewStore.SelectedIndex = -1; this._ShowMail(); } }