Virtuele e-mail counter?

Forum over Homeseer scripts (DUTCH forum)

Moderators: TANE, Ruud

Post Reply
User avatar
Noel
Senior Member
Senior Member
Posts: 1887
Joined: Tue Feb 12, 2008 12:13 am
Location: Netherlands
Contact:

Virtuele e-mail counter?

Post by Noel »

Iemand hier die misschien weet hoe ik een "virtuele" e-mail counter (of hoe het ook mag heten) kan maken?

Ik wil graag in HomeSeer aan bv code E20 een tellertje hangen dat laat zien hoeveel e-mail er in mijn pop3 inbox zit.

--

Never start anything you can't fi
User avatar
esschenk
Member
Member
Posts: 426
Joined: Sun Feb 17, 2008 10:34 pm
Location: Netherlands
Contact:

Virtuele e-mail counter?

Post by esschenk »

Hoi Noel,

Ik gebruik het pakket van Jon00
POP3 Email package for Homeseer
hiermee kan je een teller aansturen
voor elk email account krijg je een device.
Je kunt ook triggeren via email.
Een veelzijdige plugin


Ed
User avatar
Noel
Senior Member
Senior Member
Posts: 1887
Joined: Tue Feb 12, 2008 12:13 am
Location: Netherlands
Contact:

Virtuele e-mail counter?

Post by Noel »

Ed. Bedankt voor de info.
Ik ga gelijk even zoeken en testen.

--

Never start anything you can't fi
User avatar
RdP
Advanced Member
Advanced Member
Posts: 989
Joined: Thu May 04, 2006 10:14 am
Location: Netherlands

Re: Virtuele e-mail counter?

Post by RdP »

Hi,

Zit al een uur te Google-en en raak gefrustreerd dat ik niets kan vinden voor Apple mail (iCloud/Me.com) Deze heeft geen POP3 ondersteuning(alleen IMAP), maar ik wil wel simpel een counter van het aantal mails (liefst inclusief de ongelezen mails). Alle hulp is welkom....

Thanks,
Rien
Rien
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by Digit »

Rien,
Een IMAP client is relatief eenvoudig zelf te programmeren. Bv., om het ongelezen aantal op te vragen doe je een "$ STATUS INBOX (UNSEEN)" en je krijgt het aantal terug. Dat gebruik ik ook op mijn touchscreen. Daarvoor gebruik ik een IMAP VB.Net class die ik ooit ergens gevonden heb en die heb ik hier en daar wat aangepast. Als je denkt daar wat mee te kunnen dan roep maar :)
Of hier, een willekeurige link over hoe IMAP werkt: http://www.dovecot.org/imap-client-coding-howto.html
Of RFC 3501, http://tools.ietf.org/html/rfc3501
User avatar
RdP
Advanced Member
Advanced Member
Posts: 989
Joined: Thu May 04, 2006 10:14 am
Location: Netherlands

Re: Virtuele e-mail counter?

Post by RdP »

Hi Robert,

Nu ben ik niet zo'n programmeur en zelfs eenvoudig is voor mij lastig zonder een goed voorbeeld. Heb wel weer wat gegoogled en wat voorbeelden gevonden, maar krijg ze niet aan de praat.

Zou jij je script met me willen delen, dan kan ik kijken hoe ik hem homeseer geschikt maak.....

Alvast bedankt,

Rien
Rien
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by Digit »

Geen script helaas, maar een class dus.
Zie bijgevoegde IMAP.zip, wat in werkelijkheid IMAP.vb heet, maar is gerenamed i.v.m. forum rules. (unzippen hoeft dus niet!)

Voorbeeld gebruik om ongelezen mail in een label te krijgen:

Code: Select all

Private Sub RetrieveUnreadCount(ByVal cUser As String, ByVal cPassword As String, ByVal Label As Label)    
    Dim IMAPConn As IMAP = New IMAP
    Dim MsgCount As Integer

    IMAPConn.IMAPConnect("somemailserver.nl", cUser, cPassword)
    MsgCount = IMAPConn.GetUnReadMailCount()
    IMAPConn.CloseConn()
    Label.Text = MsgCount.ToString
End Sub
Of om een grid op het scherm te vullen met info over de laatste x mailtjes:

Code: Select all

Private Sub IMAPUser(ByVal cUser As String, ByVal cPassword As String)

    Dim IMAPConn As IMAP = New IMAP
    Dim MsgCount As Integer
    Dim cFrom As String = ""
    Dim cSubject As String = ""
    Dim cReceived As String = ""

    Me.DataGridView1.Rows.Clear()

    IMAPConn.IMAPConnect("somemailserver.nl", cUser, cPassword)
    MsgCount = IMAPConn.GetMailCount()

    If MsgCount > 0 Then

      IMAPConn.SelectInBox()

      Dim MinIdx As Integer = IIf(MsgCount - 19 < 1, 1, MsgCount - 19)
      Dim MaxIdx As Integer = MsgCount
      IMAPConn.FetchHeadersFT(MinIdx, MaxIdx, "from subject date")

      Dim RspCounter As Integer = 1
      Dim LineCounter As Integer = 1
      Dim cLine As String = ""

      While LineCounter < IMAPConn.ImapResponse.Count

        cLine = IMAPConn.ImapResponse(LineCounter).ToString
        WriteDebug(cLine)

        If cLine.ToLower.StartsWith("* ") Then
          cFrom = ""
          cSubject = ""
          cReceived = ""
        Else
          If cLine.ToLower.StartsWith("from:") Then

            cFrom = cLine.ToString
            cFrom = cFrom.Replace("from:", "").Trim()
            cFrom = DecodeB64(cFrom)

          Else
            If cLine.ToLower.StartsWith("subject:") Then

              cSubject = cLine
              cSubject = cSubject.Replace("subject:", "").Trim()

              cSubject = DecodeB64(cSubject)

              If cSubject.Length > 60 Then
                cSubject = cSubject.Substring(0, 57) + "..."
              End If

            Else
              If cLine.ToLower.StartsWith("date:") Then
                cReceived = cLine
                cReceived = cReceived.Replace("date:", "").Trim()
              Else
                If cLine.ToLower.StartsWith(")") Then
                  Me.DataGridView1.Rows.Insert(0, cFrom, cSubject, cReceived)
                Else

                End If
              End If
            End If
          End If
        End If

        LineCounter += 1
      End While
    End If

    IMAPConn.CloseConn()

    Me.DataGridView1.Rows.Item(0).Selected = True
  End Sub
Succes!
IMAP.zip
(3.89 KiB) Downloaded 368 times
User avatar
RdP
Advanced Member
Advanced Member
Posts: 989
Joined: Thu May 04, 2006 10:14 am
Location: Netherlands

Re: Virtuele e-mail counter?

Post by RdP »

Hi Robert,

Bedankt, maar dit gaat echt te ver voor mij. Krijg het na een uur prutsen niet aan de praat. Ik ga maar eens op het HS forum een berichtje plaatsen.

Maar in elk geval, super bedankt voor de moeite....

Gr,
Rien
Rien
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by Digit »

Graag gedaan hoor. Ach, en wie weet brengt het iemand anders nog op een ideetje :)
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by AshaiRey »

Een 'no programmeer' oplossing is dus wat je zoekt en wat je krijgt.

Neem een gmail account
Installeer het eerder genoemde Jon00 POP3 Email package for Homeseer pakket

Zet dit op zodat het POP3 berichten van gmail ophaalt
Zet je gmail account op dat het POP3 ondersteunt, incl. je voorkeur settings
bijvoorbeeld wis mailtjes na gelezen te hebben. Dit leegt je mailbox als je een POP3 oproep doet.

Ga nu naar je Apple mail account en laat alles als een copy forwarden naar je gmail account.
Bram
User avatar
RdP
Advanced Member
Advanced Member
Posts: 989
Joined: Thu May 04, 2006 10:14 am
Location: Netherlands

Re: Virtuele e-mail counter?

Post by RdP »

AshaiRey wrote:Een 'no programmeer' oplossing is dus wat je zoekt en wat je krijgt.

Neem een gmail account
Installeer het eerder genoemde Jon00 POP3 Email package for Homeseer pakket

Zet dit op zodat het POP3 berichten van gmail ophaalt
Zet je gmail account op dat het POP3 ondersteunt, incl. je voorkeur settings
bijvoorbeeld wis mailtjes na gelezen te hebben. Dit leegt je mailbox als je een POP3 oproep doet.

Ga nu naar je Apple mail account en laat alles als een copy forwarden naar je gmail account.
:oops:
Dit is wel erg omslachtig, maar bedankt voor de tip....
Er zit denk ik nog wel wat tussen deze oplossing en het helemaal zelf programmeren..... :mrgreen:

Gr,
Rien
Rien
User avatar
RdP
Advanced Member
Advanced Member
Posts: 989
Joined: Thu May 04, 2006 10:14 am
Location: Netherlands

Re: Virtuele e-mail counter?

Post by RdP »

Hi,

Heb mijn zoon gevraagd om op basis van de code van Robert, het geschikt te maken voor HomeSeer. Hij studeert Informatica en was met 5 min klaar :D
Voel me afentoe wel dom, maar goed er zijn nog altijd dingen die ik beter weet of kan :lol: (al denkt ie zelf van niet)

Het werkt voor SSL en niet SSL IMAP accounts. Ik moet het nog even wat mooier maken door netjes met variabelen te werken en de overbodige zaken er uit halen, maar dit werkt in ieder geval.

Zie onder.
Gr,
Rien

Code: Select all

Imports System.Text
Imports System.Text.RegularExpressions
Imports System.Net.Security

Public Class IMAPSSL

  Public ImapResponse As New Collections.ArrayList

  Dim TCP As Net.Sockets.TcpClient
  Dim IMAPStream As System.Net.Security.SslStream
  Dim inStream As System.IO.StreamReader
  Dim strDataIn, strNumMains(2) As String
  Dim intNoEmails As Integer

  Sub IMAPConnect(ByVal strServer As String, ByVal strUserName As String, ByVal strPassword As String)
      TCP = New Net.Sockets.TcpClient
      TCP.Connect(strServer, 993)
      IMAPStream = New System.Net.Security.SslStream(TCP.GetStream, false)
      IMAPStream.AuthenticateAsClient(strServer)
      inStream = New System.IO.StreamReader(IMAPStream)

      'hs.writelog("IMAP", "Logging in...")
      SendData("$ LOGIN " & strUserName + " " & strPassword)
      WaitFor("$ OK")
  End Sub
  Function GetMailCount() As Integer

    Try
      SendData("$ STATUS INBOX (messages)")
      WaitFor("$ OK")
      Dim rsp As String = ImapResponse(0).ToString
      'hs.writelog("IMAP", "Mailcount response:" & rsp)
      Dim RegexObj As Regex = New Regex("[0-9]*[0-9]")
      Dim MatchObj As Match = RegexObj.Match(rsp)
      'hs.writelog("IMAP", "Match:" & MatchObj.ToString)
      Return CInt(MatchObj.ToString)

    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function GetUnReadMailCount() As Integer

    Try
      SendData("$ STATUS INBOX (UNSEEN)")
      WaitFor("$ OK")
      Dim rsp As String = ImapResponse(0).ToString
      'hs.writelog("IMAP", "Mailcount response:" & rsp)
      Dim RegexObj As Regex = New Regex("UNSEEN ([0-9]*[0-9])")
      Dim MatchObj As Match = RegexObj.Match(rsp)
      'hs.writelog("IMAP", "Match:" & MatchObj.ToString)
      Return CInt(MatchObj.ToString.Substring(7))

    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function SelectInBox() As Integer

    Try
      SendData("$ SELECT INBOX")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function FetchHeaders(ByVal i As Integer, ByVal Headers As String) As Integer

    Try
      SendData("$ FETCH " & i.ToString & " (body[header.fields (" & Headers & ")])")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function FetchHeadersFT(ByVal FromNr As Integer, ByVal ToNr As Integer, ByVal Headers As String) As Integer

    Try
      SendData("$ FETCH " & FromNr.ToString.Trim & ":" & ToNr.ToString.Trim & " (body[header.fields (" & Headers & ")])")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Public Function WaitFor(ByVal strTarget As String) As Boolean

    While True
      strDataIn = inStream.ReadLine
      ImapResponse.Add(strDataIn)
      'hs.writelog("IMAP", strDataIn)
      If InStr(strDataIn, strTarget) Then
        WaitFor = True
        Exit While
      Else
        WaitFor = False
      End If
    End While

  End Function
  Public Function Response() As String

    strDataIn = inStream.ReadLine
    'hs.writelog("IMAP", strDataIn)
    Return strDataIn

  End Function
  Sub CloseConn()

    Try
      SendData("$ LOGOUT")
      inStream.Close()
      IMAPStream.Close()
    Catch ex As Exception
      hs.writelog("IMAP", ex.Message)
    End Try

  End Sub

  Sub SendData(ByVal strCommand As String)

    Dim outBuff As Byte()
    'hs.writelog("IMAP", strCommand)
    outBuff = ConvertStringToByteArray(strCommand & vbCrLf)
    IMAPStream.Write(outBuff, 0, strCommand.Length + 2)
    ImapResponse.Clear()

  End Sub
  Public Shared Function ConvertStringToByteArray(ByVal stringToConvert As String) As Byte()
    Return (New System.Text.ASCIIEncoding).GetBytes(stringToConvert)
  End Function

End Class

Public Class IMAP

  Public ImapResponse As New Collections.ArrayList

  Dim TCP As Net.Sockets.TcpClient
  Dim IMAPStream As System.IO.Stream
  Dim inStream As System.IO.StreamReader
  Dim strDataIn, strNumMains(2) As String
  Dim intNoEmails As Integer

  Sub IMAPConnect(ByVal strServer As String, ByVal strUserName As String, ByVal strPassword As String)
      TCP = New Net.Sockets.TcpClient
      TCP.Connect(strServer, 143)
      IMAPStream = TCP.GetStream
      inStream = New System.IO.StreamReader(IMAPStream)

      'hs.writelog("IMAP", "Logging in...")
      SendData("$ LOGIN " & strUserName + " " & strPassword)
      WaitFor("$ OK")
  End Sub
  Function GetMailCount() As Integer

    Try
      SendData("$ STATUS INBOX (messages)")
      WaitFor("$ OK")
      Dim rsp As String = ImapResponse(0).ToString
      'hs.writelog("IMAP", "Mailcount response:" & rsp)
      Dim RegexObj As Regex = New Regex("[0-9]*[0-9]")
      Dim MatchObj As Match = RegexObj.Match(rsp)
      'hs.writelog("IMAP", "Match:" & MatchObj.ToString)
      Return CInt(MatchObj.ToString)

    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function GetUnReadMailCount() As Integer

    Try
      SendData("$ STATUS INBOX (UNSEEN)")
      WaitFor("$ OK")
      Dim rsp As String = ImapResponse(0).ToString
      'hs.writelog("IMAP", "Mailcount response:" & rsp)
      Dim RegexObj As Regex = New Regex("UNSEEN ([0-9]*[0-9])")
      Dim MatchObj As Match = RegexObj.Match(rsp)
      'hs.writelog("IMAP", "Match:" & MatchObj.ToString)
      Return CInt(MatchObj.ToString.Substring(7))

    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function SelectInBox() As Integer

    Try
      SendData("$ SELECT INBOX")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function FetchHeaders(ByVal i As Integer, ByVal Headers As String) As Integer

    Try
      SendData("$ FETCH " & i.ToString & " (body[header.fields (" & Headers & ")])")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Function FetchHeadersFT(ByVal FromNr As Integer, ByVal ToNr As Integer, ByVal Headers As String) As Integer

    Try
      SendData("$ FETCH " & FromNr.ToString.Trim & ":" & ToNr.ToString.Trim & " (body[header.fields (" & Headers & ")])")
      WaitFor("$ OK")
    Catch ex As Exception
      hs.writelog("IMAP", "Unexpected Error:" & vbNewLine & ex.Message)
    End Try

  End Function
  Public Function WaitFor(ByVal strTarget As String) As Boolean

    While True
      strDataIn = inStream.ReadLine
      ImapResponse.Add(strDataIn)
      'hs.writelog("IMAP", strDataIn)
      If InStr(strDataIn, strTarget) Then
        WaitFor = True
        Exit While
      Else
        WaitFor = False
      End If
    End While

  End Function
  Public Function Response() As String

    strDataIn = inStream.ReadLine
    'hs.writelog("IMAP", strDataIn)
    Return strDataIn

  End Function
  Sub CloseConn()

    Try
      SendData("$ LOGOUT")
      inStream.Close()
      IMAPStream.Close()
    Catch ex As Exception
      hs.writelog("IMAP", ex.Message)
    End Try

  End Sub

  Sub SendData(ByVal strCommand As String)

    Dim outBuff As Byte()
    'hs.writelog("IMAP", strCommand)
    outBuff = ConvertStringToByteArray(strCommand & vbCrLf)
    IMAPStream.Write(outBuff, 0, strCommand.Length + 2)
    ImapResponse.Clear()

  End Sub
  Public Shared Function ConvertStringToByteArray(ByVal stringToConvert As String) As Byte()
    Return (New System.Text.ASCIIEncoding).GetBytes(stringToConvert)
  End Function

End Class

Sub Main(ByVal param As Object)
    Dim IMAPConn As IMAPSSL = New IMAPSSL
    Dim MsgCount, UnseenMsgCount As Integer
    IMAPConn.IMAPConnect("imap.mail.me.com", "Userid", "Password")
    UnseenMsgCount = IMAPConn.GetUnReadMailCount()
    MsgCount = IMAPConn.GetMailCount()
    IMAPConn.CloseConn()
    hs.writelog("Check mail", MsgCount.ToString)
    hs.writelog("Check UNseen mail", UnseenMsgCount.ToString)
    hs.setdevicestring("V41", MsgCount & "  (" & UnSeenMsgCount & ")")	

    Dim IMAPConn2 as IMAP = New IMAP
    ' Dim MsgCount, UnseenMsgCount As Integer
    IMAPConn2.IMAPConnect("imap.strato.com", "Useried", "Password")
    UnseenMsgCount = IMAPConn2.GetUnReadMailCount()
    MsgCount = IMAPConn2.GetMailCount()
    IMAPConn2.CloseConn()
    hs.writelog("Check mail", MsgCount.ToString)
    hs.writelog("Check UNseen mail", UnseenMsgCount.ToString)
    hs.setdevicestring("V40", MsgCount & "  (" & UnSeenMsgCount & ")")	
   
End Sub
Rien
Digit
Global Moderator
Global Moderator
Posts: 3388
Joined: Sat Mar 25, 2006 10:23 am
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by Digit »

Komisch en mooi dat het toch nog is goedgekomen Rien! :lol:
AshaiRey
Senior Member
Senior Member
Posts: 1310
Joined: Mon Feb 02, 2009 5:27 pm
Location: Netherlands
Contact:

Re: Virtuele e-mail counter?

Post by AshaiRey »

Bedankt voor het delen.
Ik zie dat het toch niet zo eenvoudig was als men het laat lijken en was het werkelijk slechts 5(0) minuten... ;-)
Bram
Post Reply

Return to “Homeseer Scripts Forum”