2012-05-30 4 views
1

을 사용하여 다운로드 한 메시지의 UID를 저장합니다. OpenPop.Net 라이브러리를 사용할 때 POP 서버의 메시지에서 내 데이터베이스에 고유 ID를 저장하려면 어떻게합니까? 여기에 "FetchMessage"기능입니다 :POP 프로토콜 C#

public static List<OpenPop.Mime.Message> FetchUnseenMessages(string hostname, int port, bool useSsl, string username, string password, List<string> seenUids) 
    { 
     // The client disconnects from the server when being disposed 
     using (Pop3Client client = new Pop3Client()) 
     { 
      // Connect to the server 
      client.Connect(hostname, port, useSsl); 

      // Authenticate ourselves towards the server 
      client.Authenticate(username, password, AuthenticationMethod.UsernameAndPassword); 

      // Fetch all the current uids seen 
      List<string> uids = client.GetMessageUids(); 



      // Create a list we can return with all new messages 
      List<OpenPop.Mime.Message> newMessages = new List<OpenPop.Mime.Message>(); 

      // All the new messages not seen by the POP3 client 
      for (int i = 0; i < uids.Count; i++) 
      { 
       string currentUidOnServer = uids[i]; 
       if (!seenUids.Contains(currentUidOnServer)) 
       { 
        // We have not seen this message before. 
        // Download it and add this new uid to seen uids 

        // the uids list is in messageNumber order - meaning that the first 
        // uid in the list has messageNumber of 1, and the second has 
        // messageNumber 2. Therefore we can fetch the message using 
        // i + 1 since messageNumber should be in range [1, messageCount] 
        OpenPop.Mime.Message unseenMessage = client.GetMessage(i + 1); 

        // Add the message to the new messages 
        newMessages.Add(unseenMessage); 

        // Add the uid to the seen uids, as it has now been seen 
        seenUids.Add(currentUidOnServer); 
       } 
      } 

      // Return our new found messages 
      return newMessages; 
     } 
    } 

그리고 여기에 "가령 getMail"기능 (위의 하나를 호출 한)의 일부 (또한 코멘트에 ... 포르투갈어) :

//primeiro obter informação de contas 
     SqlCeConnection Con = conecao.ligardb(); //ligar a base de dados 
     Con.Open(); 
     string myQuery = "SELECT * FROM Contas"; //construir query 
     SqlCeCommand myCommand = new SqlCeCommand(myQuery, Con); //construir comando 
     SqlCeDataReader myDataReader = myCommand.ExecuteReader(); //executar comando e armazenar informações 

     while (myDataReader.Read()) //ler data reader repetidamente 
     { 
      int tipo = Convert.ToInt32(myDataReader["Tipo"]); //obter tipo de conta 
      bool seguro = Convert.ToBoolean(myDataReader["Seguro"]); //obter se e seguro ou nao 
      int idConta = Convert.ToInt32(myDataReader["ID"]); //obter id de conta 

      if (tipo == 1 && seguro == false) //POP3 sem SSL 
      { 
       string hostname = Convert.ToString(myDataReader["Serv_Recep"]); //obter servidor de recepçao 
       string user = Convert.ToString(myDataReader["User"]); //obter id de utilizador 
       string pass = Convert.ToString(myDataReader["Pass"]); //obter pass de utilizador 

       List<string> Uids = new List<string>(); //lista para obter e-mails ja obtidos 

       //Obter pasta 
       string query_pasta = "SELECT id FROM Pastas WHERE [email protected] AND [email protected]"; 
       SqlCeCommand cmd_pasta = new SqlCeCommand(query_pasta, Con); 
       cmd_pasta.Parameters.AddWithValue("@id", idConta); 
       cmd_pasta.Parameters.AddWithValue("@nome", "Recebidas"); 


       SqlCeDataReader dr_pasta = cmd_pasta.ExecuteReader(); 
       dr_pasta.Read(); 
       int idPasta = Convert.ToInt32(dr_pasta["id"]); 

       //obrer e-mails ja obtidos 
       string query = "SELECT Uids FROM Mensagens WHERE [email protected] AND [email protected]"; //contruir query 
       SqlCeCommand command = new SqlCeCommand(query, Con); //construir comando 
       //atribuir parametros 
       command.Parameters.AddWithValue("@id", idConta); 
       command.Parameters.AddWithValue("@pasta", idPasta); 

       SqlCeDataReader datareader = command.ExecuteReader(); //executar e ler comando 

       while (datareader.Read()) //ler datareader 
       { 
        string ids = Convert.ToString(datareader["Uids"]); //obter uid 
        Uids.Add(ids); //adicionar uid 

       } 

       List<OpenPop.Mime.Message> NewMessage = new List<OpenPop.Mime.Message>(); //criar lista de mensagens 
       NewMessage = FetchUnseenMessages(hostname, 110, false, user, pass, Uids); //obter mensagens 

       for (int y = 0; y < NewMessage.Count; y++) 
       { 
        //Guardar mensagem em disco 
        string file_name = NewMessage[y].Headers.MessageId; 
        file_name = file_name + ".eml"; 



        string path = System.Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "\\izzy_mail\\" + Convert.ToString(myDataReader["Endereço"]) + "\\Recebidos\\"; //Criar directorioa de destino do .eml 
        if (!Directory.Exists(path)) 
        { 
         Directory.CreateDirectory(path); 

        } 

        path = path + file_name; 

        FileStream File = System.IO.File.Create(path); 

        NewMessage[y].Save(File); 




        //Guardar na base de dados 
        string assunto = NewMessage[y].Headers.Subject;//obter assunto 
        string origem = NewMessage[y].Headers.From.Address; //obter origem 
        string uid = NewMessage[y].Headers.MessageId; //obter id da mensagem 
        //criar nova query 
        string query_ins = "INSERT INTO Mensagens (Assunto, De, Pasta, Uri, Uids, Conta) VALUES (@assunto, @de, @pasta, @uri, @uid, @id)"; //contruir query 
        SqlCeCommand cmd_ins = new SqlCeCommand(query_ins, Con); //construir comando 
        //parametrizar o comando 
        cmd_ins.Parameters.AddWithValue("@assunto", assunto); 
        cmd_ins.Parameters.AddWithValue("@de", origem); 
        cmd_ins.Parameters.AddWithValue("@id", idConta); 
        cmd_ins.Parameters.AddWithValue("@pasta", idPasta); 
        cmd_ins.Parameters.AddWithValue("@uid", uid); 
        cmd_ins.Parameters.AddWithValue("@uri", path); 


        cmd_ins.ExecuteNonQuery(); //Executar insert 



       } 


      } 
      else if 

누구든지 내 문제를 해결하는 방법에 대한 아이디어가 있습니까? 사전에

감사합니다 ...이 솔루션에 왔어요 벤의 도움으로 이렇게

+0

을 다음 FetchUnseenMessages를 작동하려면 다음과 같은 추가

CREATE PROCEDURE dbo.getAllSeenUuids AS SELECT uuid FROM seenUuids RETURN CREATE PROCEDURE dbo.saveToSeenUuids (@seenUuid varchar(50)) AS INSERT INTO seenUuids (uuid) VALUES (@seenUuid) RETURN 

:

protected void Page_Load(object sender, EventArgs e) { //connection to db; } 

을 다음 저장 프로 시저 만들기 . UID가 바로 있습니다! – Ben

+0

좋아, 내가 거기에 중요한 세부 사항을 놓친 것 같아요 ... 이것은 데이터베이스가 보여주는 것입니다 : ([email protected]) 그리고이 Uid : (1325787968.21747.store5.netvisao.pt, S = 63627) ... –

+0

UID를 저장하지 않습니다. UID를 저장하려면 그냥 저장하십시오. 'FetchUnseenMessages'는 UID를 알고 있으므로 데이터베이스에 넣기 만하면됩니다. – Ben

답변

0

: 나는 UID

  • 추가라는 이름의 공개 목록을 만들었습니다

    1. FetchUnseenMessages() 함수의 newMessage.Add() 뒤에 나오는 코드는 다음과 같습니다.

      Uid.Add (currentUidOnServer);

    2. 대체

      문자열은 newMessage UID = [Y] .Headers.MessageId; // obter ID 다 mensagem

    :

    string uid = Uid[y]; //obter id da mensagem 
    

    그리고 지금은 작동한다!

  • 1

    DB를 연결하십시오 : 나는 당신의 문제가 무엇인지 전혀 모른다

    DataSet ds = new DataSet(); 
    ds = DB.ExecuteQuery_SP("getAllSeenUuids"); 
    List<string> uuids = pop3Client.GetMessageUids(); 
    List<string> listSeenUuids = new List<string>(); 
    List<string> newListSeenUuids = new List<string>(); 
    List<Message> newMessages = new List<Message>(); 
    List<string> listUnreadUuids = new List<string>(); 
    for (int i = 0; i < ds.Tables[0].Rows.Count; i++) 
    { 
        listSeenUuids.Add(ds.Tables[0].Rows[i][0].ToString()); 
    } 
    for (int i = uuids.Count - 1; i >= 0; i--) 
    { 
        if (!listSeenUuids.Contains(uuids[i])) 
        { 
         Message unseenMessage = pop3Client.GetMessage(i + 1); 
         newMessages.Add(unseenMessage); 
         object[,] parArray = new object[,] { { "@seenUuid", uuids[i] } }; 
         //Call Stored Procedure_SP("saveToSeenUuids", parArray); 
        } 
    }