/// <summary> /// Raises <b>NewMessageData</b> event. /// </summary> /// <param name="msgInfo">IMAP message info which message data it is.</param> /// <param name="msgData">Message data. NOTE: This value must be as specified by <see cref="IMAP_e_Fetch.FetchDataType"/>.</param> private void OnNewMessageData(IMAP_MessageInfo msgInfo, Mail_Message msgData) { if (this.NewMessageData != null) { this.NewMessageData(this, new e_NewMessageData(msgInfo, msgData)); } }
/// <summary> /// Default constructor. /// </summary> /// <param name="msgInfo">Message info.</param> /// <param name="msgData">Message data stream.</param> /// <exception cref="ArgumentNullException">Is raised when <b>msgInfo</b> is null reference.</exception> public e_NewMessageData(IMAP_MessageInfo msgInfo,Mail_Message msgData) { if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } m_pMsgInfo = msgInfo; m_pMsgData = msgData; }
/// <summary> /// Default constructor. /// </summary> /// <param name="msgInfo">Message info.</param> /// <param name="msgData">Message data stream.</param> /// <exception cref="ArgumentNullException">Is raised when <b>msgInfo</b> is null reference.</exception> public e_NewMessageData(IMAP_MessageInfo msgInfo, Mail_Message msgData) { if (msgInfo == null) { throw new ArgumentNullException("msgInfo"); } m_pMsgInfo = msgInfo; m_pMsgData = msgData; }
/// <summary> /// Default constructor. /// </summary> /// <param name="messagesInfo">Messages info.</param> /// <param name="fetchDataType">Fetch data type(Specifies what data AddData method expects).</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>messagesInfo</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Fetch(IMAP_MessageInfo[] messagesInfo,IMAP_Fetch_DataType fetchDataType,IMAP_r_ServerStatus response) { if(messagesInfo == null){ throw new ArgumentNullException("messagesInfo"); } if(response == null){ throw new ArgumentNullException("response"); } m_pMessagesInfo = messagesInfo; m_FetchDataType = fetchDataType; m_pResponse = response; }
/// <summary> /// Adds specified message for FETCH response processing. /// </summary> /// <param name="msgInfo">IMAP message info which message data it is.</param> /// <param name="msgData">Message data. NOTE: This value must be as specified by <see cref="IMAP_e_Fetch.FetchDataType"/>.</param> /// <exception cref="ArgumentNullException">Is raised when <b>msgInfo</b> or <b>msgData</b> is null reference.</exception> public void AddData(IMAP_MessageInfo msgInfo, Mail_Message msgData) { if (msgInfo == null) { throw new ArgumentNullException("msgInfo"); } if (msgData == null) { throw new ArgumentNullException("msgData"); } OnNewMessageData(msgInfo, msgData); }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is riased when <b>folder</b>,<b>msgInfo</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Expunge(string folder,IMAP_MessageInfo msgInfo,IMAP_r_ServerStatus response) { if(folder == null){ throw new ArgumentNullException("folder"); } if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } if(response == null){ throw new ArgumentNullException("response"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>msgInfo</b>,<b>flags</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Store(string folder,IMAP_MessageInfo msgInfo,IMAP_Flags_SetType flagsSetType,string[] flags,IMAP_r_ServerStatus response) { if(folder == null){ throw new ArgumentNullException("folder"); } if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } if(flags == null){ throw new ArgumentNullException("flags"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; m_SetType = flagsSetType; m_pFlags = flags; }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is riased when <b>folder</b>,<b>msgInfo</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Expunge(string folder, IMAP_MessageInfo msgInfo, IMAP_r_ServerStatus response) { if (folder == null) { throw new ArgumentNullException("folder"); } if (msgInfo == null) { throw new ArgumentNullException("msgInfo"); } if (response == null) { throw new ArgumentNullException("response"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; }
/// <summary> /// Default constructor. /// </summary> /// <param name="sourceFolder">Source folder name with optional path.</param> /// <param name="targetFolder">Target folder name </param> /// <param name="messagesInfo">Messages info.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>sourceFolder</b>,<b>targetFolder</b>,<b>messagesInfo</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Copy(string sourceFolder,string targetFolder,IMAP_MessageInfo[] messagesInfo,IMAP_r_ServerStatus response) { if(sourceFolder == null){ throw new ArgumentNullException("sourceFolder"); } if(targetFolder == null){ throw new ArgumentNullException("targetFolder"); } if(messagesInfo == null){ throw new ArgumentNullException("messagesInfo"); } if(response == null){ throw new ArgumentNullException("response"); } m_pResponse = response; m_SourceFolder = sourceFolder; m_TargetFolder = targetFolder; m_pMessagesInfo = messagesInfo; }
/// <summary> /// Default constructor. /// </summary> /// <param name="folder">Folder name with optional path.</param> /// <param name="msgInfo">Message info.</param> /// <param name="flagsSetType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <exception cref="ArgumentNullException">Is raised when <b>folder</b>,<b>msgInfo</b>,<b>flags</b> or <b>response</b> is null reference.</exception> internal IMAP_e_Store(string folder, IMAP_MessageInfo msgInfo, IMAP_Flags_SetType flagsSetType, string[] flags, IMAP_r_ServerStatus response) { if (folder == null) { throw new ArgumentNullException("folder"); } if (msgInfo == null) { throw new ArgumentNullException("msgInfo"); } if (flags == null) { throw new ArgumentNullException("flags"); } m_pResponse = response; m_Folder = folder; m_pMsgInfo = msgInfo; m_SetType = flagsSetType; m_pFlags = flags; }
public void CopyMessage(string accessingUser, string folderOwnerUser, string folder, string destFolderUser, string destFolder, IMAP_MessageInfo messageInfo) { ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); ArgsValidator.ValidateUserName(destFolderUser); ArgsValidator.ValidateFolder(destFolder); ArgsValidator.ValidateNotNull(messageInfo); EmailMessageItems emailMessageItems = new EmailMessageItems(messageInfo.ID, IMAP_MessageItems_enum.Message); this.GetMessageItems(accessingUser, folderOwnerUser, folder, emailMessageItems); this.StoreMessage("system", destFolderUser, destFolder, emailMessageItems.MessageStream, messageInfo.InternalDate, messageInfo.Flags); emailMessageItems.MessageStream.Dispose(); }
/// <summary> /// Adds specified message for FETCH response processing. /// </summary> /// <param name="msgInfo">IMAP message info.</param> internal void AddData(IMAP_MessageInfo msgInfo) { OnNewMessageData(msgInfo,null); }
/// <summary> /// Adds specified message for FETCH response processing. /// </summary> /// <param name="msgInfo">IMAP message info which message data it is.</param> /// <param name="msgData">Message data. NOTE: This value must be as specified by <see cref="IMAP_e_Fetch.FetchDataType"/>.</param> /// <exception cref="ArgumentNullException">Is raised when <b>msgInfo</b> or <b>msgData</b> is null reference.</exception> public void AddData(IMAP_MessageInfo msgInfo,Mail_Message msgData) { if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } if(msgData == null){ throw new ArgumentNullException("msgData"); } OnNewMessageData(msgInfo,msgData); }
/// <summary> /// Adds specified message for FETCH response processing. /// </summary> /// <param name="msgInfo">IMAP message info.</param> internal void AddData(IMAP_MessageInfo msgInfo) { OnNewMessageData(msgInfo, null); }
/// <summary> /// Removes specified message from messages info. /// </summary> /// <param name="message">Message info.</param> /// <exception cref="ArgumentNullException">Is raised when <b>message</b> is null reference.</exception> internal void RemoveMessage(IMAP_MessageInfo message) { if(message == null){ throw new ArgumentNullException("message"); } m_pMessagesInfo.Remove(message); }
/// <summary> /// Raises <b>Expunge</b> event. /// </summary> /// <param name="msgInfo">Messgae info.</param> /// <param name="response">Default IMAP server response.</param> /// <returns>Returns event args.</returns> private IMAP_e_Expunge OnExpunge(IMAP_MessageInfo msgInfo,IMAP_r_ServerStatus response) { IMAP_e_Expunge eArgs = new IMAP_e_Expunge(m_pSelectedFolder.Folder,msgInfo,response); if(this.Expunge != null){ this.Expunge(this,eArgs); } return eArgs; }
/// <summary> /// Raises <b>Copy</b> event. /// </summary> /// <param name="targetFolder">Target folder name with optional path.</param> /// <param name="messagesInfo">Messages info.</param> /// <param name="response">Default IMAP server response.</param> /// <returns>Returns event args.</returns> private IMAP_e_Copy OnCopy(string targetFolder,IMAP_MessageInfo[] messagesInfo,IMAP_r_ServerStatus response) { IMAP_e_Copy eArgs = new IMAP_e_Copy(m_pSelectedFolder.Folder,targetFolder,messagesInfo,response); if(this.Copy != null){ this.Copy(this,eArgs); } return eArgs; }
/// <summary> /// Raises <b>Store</b> event. /// </summary> /// <param name="msgInfo">Message info.</param> /// <param name="setType">Flags set type.</param> /// <param name="flags">Flags.</param> /// <param name="response">Default IMAP server response.</param> /// <returns>Returns event args.</returns> private IMAP_e_Store OnStore(IMAP_MessageInfo msgInfo,IMAP_Flags_SetType setType,string[] flags,IMAP_r_ServerStatus response) { IMAP_e_Store eArgs = new IMAP_e_Store(m_pSelectedFolder.Folder,msgInfo,setType,flags,response); if(this.Store != null){ this.Store(this,eArgs); } return eArgs; }
/// <summary> /// Gets specified message info IMAP 1-based sequence number. /// </summary> /// <param name="msgInfo">Message info.</param> /// <returns>Returns specified message info IMAP 1-based sequence number.</returns> /// <exception cref="ArgumentNullException">Is raised when <b>msgInfo</b> is null reference.</exception> internal int GetSeqNo(IMAP_MessageInfo msgInfo) { if(msgInfo == null){ throw new ArgumentNullException("msgInfo"); } return m_pMessagesInfo.IndexOf(msgInfo) + 1; }
/// <summary> /// Raises <b>NewMessageData</b> event. /// </summary> /// <param name="msgInfo">IMAP message info which message data it is.</param> /// <param name="msgData">Message data. NOTE: This value must be as specified by <see cref="IMAP_e_Fetch.FetchDataType"/>.</param> private void OnNewMessageData(IMAP_MessageInfo msgInfo,Mail_Message msgData) { if(this.NewMessageData != null){ this.NewMessageData(this,new e_NewMessageData(msgInfo,msgData)); } }
/// <summary> /// Stores IMAP message flags (\seen,\draft, ...). /// </summary> /// <param name="accessingUser">User who accesses this method. /// User needs r permission to call this method or Exception is thrown. /// There is special user 'system' for which permission check is skipped.</param> /// <param name="folderOwnerUser">User who's folder it is.</param> /// <param name="folder">Folder which message flags to store. For example: Inbox,Public Folders/Documnets .</param> /// <param name="messageInfo">IMAP message info.</param> /// <param name="flags">Message flags.</param> public void StoreMessageFlags(string accessingUser,string folderOwnerUser,string folder,IMAP_MessageInfo messageInfo,string[] flags) { /* Implementation notes: *) Validate values. Throw ArgumnetExcetion if invalid values. *) Ensure that user exists. *) Normalize folder. Remove '/' from folder start and end, ... . *) Do Shared Folders mapping. *) Ensure that folder exists. Throw Exception if don't. *) Remove all message flags which permissions user doesn't have. *) Store message flags. */ //--- Validate values -------------------// ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); //---------------------------------------// // Ensure that user exists. if(!UserExists(folderOwnerUser)){ throw new Exception("User '" + folderOwnerUser + "' doesn't exist !"); } // Normalize folder. Remove '/' from folder start and end. folder = API_Utlis.NormalizeFolder(folder); // Do Shared Folders mapping. string originalFolder = folder; SharedFolderMapInfo mappedFolder = MapSharedFolder(originalFolder); if(mappedFolder.IsSharedFolder){ folderOwnerUser = mappedFolder.FolderOnwer; folder = mappedFolder.Folder; if(folderOwnerUser == "" || folder == ""){ throw new ArgumentException("Specified root folder '" + originalFolder + "' isn't accessible !"); } } // Ensure that folder exists. Throw Exception if don't. if(!FolderExists(folderOwnerUser + "/" + folder)){ throw new Exception("Folder '" + folder + "' doesn't exist !"); } // Remove all message flags which permissions user doesn't have. if(accessingUser != "system"){ IMAP_ACL_Flags userACL = GetUserACL(folderOwnerUser,folder,accessingUser); if((userACL & IMAP_ACL_Flags.s) == 0){ flags = IMAP_Utils.MessageFlagsRemove(flags,new string[]{"Seen"}); } else if((userACL & IMAP_ACL_Flags.d) == 0){ flags = IMAP_Utils.MessageFlagsRemove(flags,new string[]{"Deleted"}); } else if((userACL & IMAP_ACL_Flags.s) == 0){ flags = IMAP_Utils.MessageFlagsRemove(flags,new string[]{"Answered","Draft","Flagged"}); } } //--- Store flags using(SQLiteConnection sqlCon = GetMessagesInfoSqlCon(folderOwnerUser,folder)){ using(SQLiteCommand cmd = sqlCon.CreateCommand()){ cmd.CommandText = "update MessagesInfo set flags='" + Net_Utils.ArrayToString(flags," ") + "' where ID='" + messageInfo.ID + "';"; cmd.ExecuteNonQuery(); } } }
public void StoreMessageFlags(string accessingUser, string folderOwnerUser, string folder, IMAP_MessageInfo messageInfo, string[] flags) { ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); if (!this.UserExists(folderOwnerUser)) { throw new Exception("User '" + folderOwnerUser + "' doesn't exist !"); } folder = API_Utlis.NormalizeFolder(folder); string text = folder; xml_API.SharedFolderMapInfo sharedFolderMapInfo = this.MapSharedFolder(text); if (sharedFolderMapInfo.IsSharedFolder) { folderOwnerUser = sharedFolderMapInfo.FolderOnwer; folder = sharedFolderMapInfo.Folder; if (folderOwnerUser == "" || folder == "") { throw new ArgumentException("Specified root folder '" + text + "' isn't accessible !"); } } if (!this.FolderExists(folderOwnerUser + "/" + folder)) { throw new Exception("Folder '" + folder + "' doesn't exist !"); } if (accessingUser != "system") { IMAP_ACL_Flags userACL = this.GetUserACL(folderOwnerUser, folder, accessingUser); if ((userACL & IMAP_ACL_Flags.s) == IMAP_ACL_Flags.None) { flags = IMAP_Utils.MessageFlagsRemove(flags, new string[] { "Seen" }); } else { if ((userACL & IMAP_ACL_Flags.d) == IMAP_ACL_Flags.None) { flags = IMAP_Utils.MessageFlagsRemove(flags, new string[] { "Deleted" }); } else { if ((userACL & IMAP_ACL_Flags.s) == IMAP_ACL_Flags.None) { flags = IMAP_Utils.MessageFlagsRemove(flags, new string[] { "Answered", "Draft", "Flagged" }); } } } } using (SQLiteConnection messagesInfoSqlCon = this.GetMessagesInfoSqlCon(folderOwnerUser, folder)) { using (SQLiteCommand sQLiteCommand = messagesInfoSqlCon.CreateCommand()) { sQLiteCommand.CommandText = string.Concat(new string[] { "update MessagesInfo set flags='", Net_Utils.ArrayToString(flags, " "), "' where ID='", messageInfo.ID, "';" }); sQLiteCommand.ExecuteNonQuery(); } } }
/// <summary> /// Creates copy of message to destination IMAP folder. /// </summary> /// <param name="accessingUser">User who accesses this method. /// User needs r permission to call this method or Exception is thrown. /// There is special user 'system' for which permission check is skipped.</param> /// <param name="folderOwnerUser">User who's folder it is.</param> /// <param name="folder">Folder what contains message to copy. For example: Inbox,Public Folders/Documnets .</param> /// <param name="destFolderUser">Destination IMAP folder owner user name.</param> /// <param name="destFolder">Destination IMAP folder name.</param> /// <param name="messageInfo">IMAP message info.</param> public void CopyMessage(string accessingUser,string folderOwnerUser,string folder,string destFolderUser,string destFolder,IMAP_MessageInfo messageInfo) { /* Implementation notes: *) Validate values. Throw ArgumnetExcetion if invalid values. *) We don't need to map shared folder, check security, it done by GetMessage and StoreMessage methods. *) Copy message. */ //--- Validate values -------------------// ArgsValidator.ValidateUserName(folderOwnerUser); ArgsValidator.ValidateFolder(folder); ArgsValidator.ValidateUserName(destFolderUser); ArgsValidator.ValidateFolder(destFolder); ArgsValidator.ValidateNotNull(messageInfo); //---------------------------------------// //--- Copy message EmailMessageItems msgItems = new EmailMessageItems(messageInfo.ID,IMAP_MessageItems_enum.Message); GetMessageItems(accessingUser,folderOwnerUser,folder,msgItems); StoreMessage("system",destFolderUser,destFolder,msgItems.MessageStream,messageInfo.InternalDate,messageInfo.Flags); msgItems.MessageStream.Dispose(); }