2012-05-30 44 views
1

我在這裏向您詢問以下內容:在使用OpenPop.Net庫時,如何將POP服務器中的消息中的唯一ID存儲到我的數據庫中?這裏的「FetchMessage」功能:從使用POP協議下載的消息中存儲UID 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; 
     } 
    } 

而這裏的「GetEMail」功能(即調用上面的一個的一個)的一部分(同樣的評論是在葡萄牙...):

//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

我不知道你的問題是什麼。 UID就在那裏! – Ben

+0

好吧我想我錯過了一個重要的細節...這是數據庫顯示的內容:([email protected])和這個Uid:(1325787968.21747.store5.netvisao.pt,S = 63627)... –

+0

您不存儲UID。如果你想存儲的UID只是存儲它。 'FetchUnseenMessages'知道UID,所以你所要做的就是把它放在數據庫中。 – Ben

回答

0

因此,與本的幫助,我是來此解決方案:

  1. 我創建了一個名爲UID
  2. 添加了一個公開名單以下代碼位於FetchUnseenMessages()函數的newMessage.Add()之後:

    Uid.Add(currentUidOnServer);

  3. 代替

    串的uid = NewMessage作爲[Y] .Headers.MessageId; // obter ID達mensagem

有了:

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

而現在它的作品!

1

使數據庫連接:

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

創建以下存儲過程:

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 

添加以下的功能FetchUnseenMessages

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); 
    } 
}