• 【helpdesk】启明星helpdesk7.0版本里,实现邮件提交功能介绍和原理


    在启明星helpdesk7.0版本里,新增了一个功能:邮件提交。所谓邮件提交就是用户直接发送邮件到IT。当然IT通常会公开一个公共邮件,例如support@dotnetcms.org.下面介绍一下启明星Helpdesk邮件提交的功能介绍,稍后介绍实现原理。

    1.用户通过邮件发送邮件到 test@dotnetcms.org 提交问题。

    2.系统接收到邮件后,将会自动发出一封回复。回复的时间间隔最长10分钟。邮件会提醒用户您的邮件已经收到。用户可以直接回复邮件点击链接查看问题或补充。

    3.管理员/用户也可以通过helpdesk直接回复,这些回复会以邮件的形式告诉给用户。

    4.用户也可以通过helpdesk查看提交的问题。

    技术实现:

    在整个邮件提交过程中,核心部分是邮件的接收和发送。目前几乎所有邮件都支持SMTP/POP协议。所有使用这个协议就可以获取或者发送邮件。

    另外,在我们实现的过程中,部分企业使用的是Exchange2007.对于微软这个邮件服务器,许多企业默认是不启用SMTP/POP协议,微软使用的Exchange

    web service(EWS)接口发送或者接收邮件,所以我们提供了两种方式:SMTP/POP方式和EWS方式。

    (注:对于Exchange2003,微软还支持webdav方式,但是在exchange2007不推荐使用该方式。所以我们没有再考虑exchange2003情况,如果您使用的是exchange2003,可以开启SMTP/POP协议)

    SMTP发送邮件核心代码:

                    SmtpClient smtpClient = new SmtpClient();
                    MailMessage message = new MailMessage();
                    MailAddress fromAddress = new MailAddress(mail, friendlyname);
                    smtpClient.Host = smtp;
                    smtpClient.Port = int.Parse(smtp_port);
                    NetworkCredential nc = new NetworkCredential(username, password);
                    smtpClient.UseDefaultCredentials = false;
                    smtpClient.Credentials = nc;
                    smtpClient.EnableSsl = smtp_use_ssl;
                    message.From = fromAddress;
    
                    if (email != "")
                    {
                        message.To.Add(_email);
                    }
                    if (_sendto != "")
                    {
                        message.CC.Add(_sendto);
                    }
                    message.Subject = title;
                    message.IsBodyHtml = true;
                    message.Body = content;
                    smtpClient.Send(message);
    

    SMTP接收邮件

    接收邮件使用了OpenPOP.dll

    https://files.cnblogs.com/mqingqing123/OpenPop.rar

                using (Pop3Client client = new Pop3Client())
                {
                    client.Connect(pop, int.Parse(pop_port), pop_use_ssl);
                    client.Authenticate(username, password);
                    int messageCount = client.GetMessageCount();
                    List<OpenPop.Mime.Message> allMessages;
    
                    if (messageCount > maxcount)
                    {
                        allMessages = new List<OpenPop.Mime.Message>(maxcount);
                        Max = maxcount;
                    }
                    else
                    {
                        allMessages = new List<OpenPop.Mime.Message>(messageCount);
                        Max = messageCount;
                    }
    

     处理邮件的代码

    public static void ProcessEmail(OpenPop.Mime.Message msg, DateTime baseTime)
            {
    
     
                email = msg.Headers.From.Address;
                createdate = msg.Headers.DateSent.AddHours(timezone);
                title = msg.Headers.Subject;
            MessagePart html = msg.FindFirstHtmlVersion();
                if (html != null)
                {
                    contents = html.GetBodyAsText();
                }
    
    }

    采用EWS方式:

            public static void GetOutlookEmail()
            {
    
    
                DateTime basicTime = DateTime.Now.AddMinutes(-10);
                string username = Helper.GetWebconfig("username");
                string password = Helper.GetWebconfig("password");
                string domain = Helper.GetWebconfig("domain");
                string url = Helper.GetWebconfig("exchangewebservice");
                int timezone = int.Parse(Helper.GetWebconfig("timezone"));
                int maxcount = int.Parse(Helper.GetWebconfig("every_time_fetch_max_count"));
     
    
    
    
    
                ExchangeServiceBinding esb = new ExchangeServiceBinding();
                esb.Credentials = new NetworkCredential(username, password, domain);
                esb.Url = url;
               
     
                 
    
    
               FindItemType findItemRequest = new FindItemType();
               findItemRequest.Traversal = ItemQueryTraversalType.Shallow;
    
    
               ItemResponseShapeType itemProperties = new ItemResponseShapeType();
                
               ////获取邮件地址
               PathToExtendedFieldType PidTagSenderSmtpAddress = new PathToExtendedFieldType();
               PidTagSenderSmtpAddress.PropertyTag = "0x5D01";
               PidTagSenderSmtpAddress.PropertyType = MapiPropertyTypeType.String;
              
    
               // Define which item properties are returned in the response
            
               itemProperties.BaseShape = DefaultShapeNamesType.AllProperties;
               findItemRequest.ItemShape = itemProperties;  // Add properties shape to request
    
               itemProperties.AdditionalProperties = new BasePathToElementType[1];
               itemProperties.AdditionalProperties[0] = PidTagSenderSmtpAddress;
    
    
               // Identify which folders to search to find items
               DistinguishedFolderIdType[] folderIDArray = new DistinguishedFolderIdType[1];
               folderIDArray[0] = new DistinguishedFolderIdType();
               folderIDArray[0].Id = DistinguishedFolderIdNameType.inbox;
    
               // Add folders to request
               findItemRequest.ParentFolderIds = folderIDArray;
    
               //Create unread only restriction --------------------------
               RestrictionType restriction = new RestrictionType();
               IsEqualToType isEqualTo = new IsEqualToType();
               PathToUnindexedFieldType pathToFieldType = new PathToUnindexedFieldType();
               pathToFieldType.FieldURI = UnindexedFieldURIType.messageIsRead;
    
    
               FieldURIOrConstantType constantType = new FieldURIOrConstantType();
               ConstantValueType constantValueType = new ConstantValueType();
               constantValueType.Value = "0";
               constantType.Item = constantValueType;
               isEqualTo.Item = pathToFieldType;
               isEqualTo.FieldURIOrConstant = constantType;
               restriction.Item = isEqualTo;
               findItemRequest.Restriction = restriction;
    
    
    
               FindItemResponseType findItemResponse = esb.FindItem(findItemRequest);
               FindItemResponseMessageType folder = (FindItemResponseMessageType)findItemResponse.ResponseMessages.Items[0];
               ArrayOfRealItemsType folderContents = new ArrayOfRealItemsType();
               folderContents = (ArrayOfRealItemsType)folder.RootFolder.Item;
               ItemType[] items = folderContents.Items;
    
    
    
               int count = items.Length;
               int Max = 0;
          
    
               if (count > maxcount)
               {
    
                   Max=maxcount;
               }
               else
               {
    
                   Max = count;
               }
    
    
               int c = 0;
               for (int i = Max; c < Max; i--)
               {
                   try
                   {
                       ProcessEmail(items[i-1], basicTime);
                   }
                   catch(Exception ex)
                   {
                       WriteLog(ex.ToString());
                   
                   }
                   c++;
               }
             
                
            
        }
    

     最后处理获取的邮件

                ////// 获取邮件的内容 //
            
    
                 GetItemType g = new GetItemType();  
                g.ItemShape = new ItemResponseShapeType();  
                g.ItemShape.BaseShape = DefaultShapeNamesType.AllProperties;
                g.ItemIds = new BaseItemIdType[] { itemType.ItemId };  
                GetItemResponseType p_mailResponse = esb.GetItem(g);  
                ArrayOfResponseMessagesType arrMail = p_mailResponse.ResponseMessages;  
                ResponseMessageType[] responseMessages = arrMail.Items;
    
                foreach (ResponseMessageType respmsg in responseMessages)
                {
    
                    if (respmsg is ItemInfoResponseMessageType)
                    {
                        ItemInfoResponseMessageType createItemResp = (respmsg as ItemInfoResponseMessageType);
                        ArrayOfRealItemsType aorit = createItemResp.Items;
                        foreach (MessageType myMessage in aorit.Items)
                        {
    
                            if (myMessage.Body.BodyType1 == BodyTypeType.Text)
                            {
                                contents = myMessage.Body.Value.Replace(Environment.NewLine, "<br />");
                            }
                            else
                            {
                                contents = myMessage.Body.Value;
                            }
    
                            if (myMessage.From != null)
                            {
                                email = myMessage.From.Item.EmailAddress;
                            }
    
                        }
                    }
                }
    

     采用EWS发送邮件的核心代码

                emailMessage.Subject = title; 
                emailMessage.Body = new BodyType(); 
                emailMessage.Body.BodyType1 = BodyTypeType.HTML; //specify HTML or plain 
                emailMessage.Body.Value = contents;
    
                CreateItemType emailToSave = new CreateItemType(); 
                emailToSave.Items = new NonEmptyArrayOfAllItemsType(); 
                emailToSave.Items.Items = new ItemType[1]; 
                emailToSave.Items.Items[0] = emailMessage; 
                emailToSave.MessageDisposition = MessageDispositionType.SendAndSaveCopy; 
                emailToSave.MessageDispositionSpecified = true;
    
    
                try
                {
                    CreateItemResponseType response = esb.CreateItem(emailToSave);
                    ResponseMessageType[] rmta = response.ResponseMessages.Items;
                }
                catch(Exception ex)
                {
    
                    WriteLog(ex.ToString()); 
                }
    
  • 相关阅读:
    Linux getcwd()的实现【转】
    关于__GNU_SOURCE 这个宏---如何开启【转】
    UBI 文件系统移植 sys 设备信息【转】
    Linux USB驱动框架分析【转】
    局部变量、全局变量、堆、堆栈、静态和全局【转】
    C语言字节对齐问题详解【转】
    usb驱动的基本结构和函数简介【转】
    makefile函数集锦【转】
    非常好!!!Linux源代码阅读——内核引导【转】
    JQuery日记6.9 Promise/A之Callbacks
  • 原文地址:https://www.cnblogs.com/mqingqing123/p/2859173.html
Copyright © 2020-2023  润新知