Misc.bas
上传用户:bcdefg2008
上传日期:2013-02-28
资源大小:144k
文件大小:19k
源码类别:

Email服务器

开发平台:

Visual Basic

  1. Attribute VB_Name = "Misc"
  2. '--------------------------------------------------------------------------
  3. Option Explicit
  4. Public Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyName As Any, ByVal lsString As Any, ByVal lplFilename As String) As Long
  5. Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationname As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
  6. Public Mails() As Mail
  7. Public Type Attachments
  8.     Name    As String
  9.     Data()  As String
  10. End Type
  11. Public Type Mail
  12.     Header           As String
  13.     from             As String
  14.     To               As String
  15.     Date             As String
  16.     Subject          As String
  17.     Message          As String 'Plain Text Message
  18.     HTMLMessage      As String 'HTML Message Part
  19.     Size             As Long
  20.     AttachedFiles    As Integer
  21.     Attachments() As Attachments
  22. End Type
  23. Public strlines()          As String
  24. Public strLine()           As String
  25. Public tmpAttachmntStr     As String
  26. Public AttachmentCounter   As Integer
  27. 'Declarations for very fast String Array Routines
  28. Declare Sub CopyMemory Lib "kernel32" Alias _
  29.         "RtlMoveMemory" (dest As Any, Source As Any, _
  30.         ByVal numBytes As Long)
  31. Declare Sub ZeroMemory Lib "kernel32" Alias _
  32.         "RtlZeroMemory" (dest As Any, ByVal numBytes As Long)
  33. 'Base64 Class
  34. Public pbBuffer1() As Byte
  35. Public pbBuffer2() As Byte
  36. Public ptSpan()    As String
  37. 'Class for the multi language support
  38. Global cLanguage As New clsLanguagePack
  39. 'Prevent the showing of the right click Internet Explorer window
  40. Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
  41. Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
  42. Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
  43. Public Declare Function GetCurrentThreadId Lib "kernel32" () As Long
  44. Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
  45.     
  46. Public Const WM_RBUTTONUP = &H205
  47. Public Const WH_MOUSE = 7
  48. Public Type POINTAPI
  49.     X As Long
  50.     Y As Long
  51. End Type
  52. Public Type MOUSEHOOKSTRUCT
  53.     pt As POINTAPI
  54.     hwnd As Long
  55.     wHitTestCode As Long
  56.     dwExtraInfo As Long
  57. End Type
  58.     
  59. Public gLngMouseHook As Long
  60.     
  61. Public Function MouseHookProc(ByVal nCode As Long, ByVal wParam As Long, mhs As MOUSEHOOKSTRUCT) As Long
  62. Dim strBuffer As String
  63. Dim strClassName As String
  64. Dim lngResult As Long
  65. If (nCode >= 0 And wParam = WM_RBUTTONUP) Then
  66.         'Preinitialize string
  67.         strBuffer = Space(255)
  68.         
  69.        ' lngBufferLen = Len(strBuffer)
  70.         
  71.         'This is the string that holds the class name that we are looking for
  72.         strClassName = "Internet Explorer_Server"
  73.         
  74.         'Debug.Print strClassName
  75.         
  76.         'Get the classname for the Window that has been clicked, making sure something is returned
  77.         'If the function returns 0, it has failed
  78.         lngResult = GetClassName(mhs.hwnd, strBuffer, Len(strBuffer))
  79.                 
  80.         'Debug.Print Left$(strBuffer, lngResult)
  81.                 
  82.         If lngResult > 0 Then
  83.             'Check to see if the class of the window we clicked on is the same as above
  84.             If Left$(strBuffer, lngResult) = strClassName Then
  85.                 
  86.                 'Value is the same. Squash the command
  87.                 MouseHookProc = 1
  88.                 
  89.                 Exit Function
  90.                 
  91.             End If
  92.             
  93.         End If
  94.     End If
  95. MouseHookProc = CallNextHookEx(gLngMouseHook, nCode, wParam, mhs)
  96. End Function
  97. Public Function CheckExistence(Pclist As ComboBox, Data As String) As Boolean
  98. Dim Counter As Integer
  99. For Counter = 0 To Pclist.ListCount
  100.     If Pclist.List(Counter) = Data Then
  101.         CheckExistence = True
  102.         Exit Function
  103.     End If
  104. Next Counter
  105. End Function
  106. Function SaveIni(KeySection As String, strKey As String, KeyValue As String)
  107.   Dim lngResult As Long
  108.   Dim strFilename
  109.     strFilename = App.Path & "Pop3Popper.ini" 'Declare your ini file !
  110.     lngResult = WritePrivateProfileString(KeySection, strKey, KeyValue, strFilename)
  111.     SaveIni = lngResult
  112. End Function
  113. Function LoadIni(KeySection As String, strKey As String)
  114.     
  115.     Dim lngResult As Long
  116.     Dim strFilename As String
  117.     Dim strResult As String * 100
  118.     Dim KeyValue As String
  119.     
  120.     strFilename = App.Path & "Pop3Popper.ini" 'Declare your ini file !
  121.     
  122.     lngResult = GetPrivateProfileString(KeySection, _
  123.                 strKey, "", strResult, Len(strResult), _
  124.                 strFilename)
  125.     
  126.     If lngResult = 0 Then
  127.         'An error has occurred
  128.         LoadIni = ""
  129.     Else
  130.         KeyValue = Trim(strResult)
  131.         KeyValue = Replace(KeyValue, Chr(0), "")
  132.         LoadIni = KeyValue
  133.     End If
  134.     
  135. End Function
  136. 'Glue several lines together that belong together
  137. Public Function UnfoldArray(fromLine As Long, toLine As Long, ByRef FoldedArray() As String) As String()
  138. Dim Counter As Integer, UCounter As Integer
  139. Dim strHeader As String
  140. Dim TempArray() As String
  141. On Error GoTo error
  142. 'Extract only the Mime Headers
  143. ReDim TempArray(toLine - fromLine)
  144. For Counter = fromLine To toLine
  145.     TempArray(UCounter) = FoldedArray(Counter)
  146.     UCounter = UCounter + 1
  147. Next
  148. strHeader = Join(TempArray, vbCrLf)
  149. 'Hmm I try to unfold the Mail Header...
  150. strHeader = Replace(strHeader, vbCrLf + Chr$(9), " ")
  151. strHeader = Replace(strHeader, vbCrLf + Chr$(11), " ")
  152. strHeader = Replace(strHeader, vbCrLf + Chr$(32), " ")
  153. strHeader = Replace(strHeader, vbCrLf + Chr$(255), " ")
  154. UnfoldArray = Split(strHeader, vbCrLf)
  155. error:
  156. End Function
  157. 'Returns the Line that contains a String (reversed for speed reasons)
  158. Public Function RevfindEmptyLine(ByRef strLine() As String) As Long
  159. Dim Counter As Long
  160. Dim TmpLngt As Long
  161. Dim TmpString As String
  162. On Error GoTo error
  163. TmpLngt = UBound(strLine)
  164. Counter = TmpLngt
  165.     Do
  166.         Counter = Counter - 1
  167.             
  168.         TmpString = strLine(Counter + 1)
  169.         
  170.        
  171.         
  172.             If TmpString = "" Then
  173.                 RevfindEmptyLine = Counter + 1
  174.                 Exit Function
  175.             
  176.         End If
  177.     
  178.             
  179.     Loop Until Counter = 0
  180.     
  181. error:
  182.     RevfindEmptyLine = -1
  183. End Function
  184. 'Finds a line that only contain one Crlf
  185. Public Function findEmptyLine(intPosition As Long, ByRef strlines() As String) As Long
  186.   Dim Counter As Long
  187.   Dim TmpLngt As Long
  188.   Dim strTemp As String
  189.     On Error GoTo error
  190.     If intPosition < 0 Then
  191.         findEmptyLine = -1
  192.         Exit Function
  193.     End If
  194.     TmpLngt = UBound(strlines)
  195.     Do
  196.         Counter = Counter + 1
  197.         strTemp = strlines(intPosition + Counter - 1)
  198.     Loop Until Counter = TmpLngt Or Len(strTemp) = 0
  199.     If strlines(intPosition + Counter - 1) = "" Then
  200.         findEmptyLine = intPosition + Counter - 1
  201.       Else
  202. error:
  203.         findEmptyLine = -1
  204.     End If
  205. End Function
  206. 'Returns the Line of an array that contains a String
  207. Public Function findLine(intPosition As Long, SearchStr As String, strlines() As String, Optional IgnoreInstrWord As Boolean) As Long
  208.   Dim Counter As Long
  209.   Dim TmpLngt As Long
  210.   Dim TmpLngt2 As Long
  211.     On Error GoTo error
  212.     TmpLngt = UBound(strlines)
  213.     Counter = Counter + intPosition
  214.     If Counter >= TmpLngt Then
  215.         GoTo error
  216.     End If
  217.     Do
  218.         Counter = Counter + 1
  219.         Select Case IgnoreInstrWord
  220.             Case False
  221.                 TmpLngt2 = InStrWord(strlines(Counter - 1), SearchStr)
  222.             Case True
  223.                 TmpLngt2 = InStr(strlines(Counter - 1), SearchStr)
  224.         End Select
  225.         
  226.         If TmpLngt2 > 0 Then
  227.             findLine = Counter - 1
  228.             Exit Function
  229.         End If
  230.     Loop Until Counter = TmpLngt
  231. error:
  232.     findLine = -1
  233. End Function
  234. 'Get the Value from an E-Mail Header
  235. Public Function GetInfo(intPosition As Long, SearchStr As String, ByRef strlines() As String) As String
  236.   Dim strTemp As String
  237.   Dim strValue As String
  238.   Dim Counter As Integer
  239.   Dim StartPosi As Integer
  240.   Dim Counter2 As Integer
  241.   Dim strarray As String
  242.     On Error GoTo error
  243.     strarray = strlines(intPosition)
  244.     StartPosi = InStr(LCase$(strarray), SearchStr) + Len(SearchStr)
  245.     Do
  246.         strValue = strValue + strTemp
  247.         strTemp = Mid$(strarray, StartPosi + Counter, 1)
  248.         Counter = Counter + 1
  249.         Counter2 = Len(strarray)
  250.     Loop Until strTemp = vbCrLf Or Counter = Counter2
  251.     'Remove the ""
  252.     If Left$(strValue, 1) = Chr$(34) Then strValue = Right$(strValue, Len(strValue) - 1)
  253.     If Right$(strValue, 1) = Chr$(34) Then strValue = Left$(strValue, Len(strValue) - 1)
  254.     GetInfo = Replace(strValue, " ", "")
  255. Exit Function
  256. error:
  257.     GetInfo = ""
  258. End Function
  259. 'Returns the Line that contains a String (reversed for speed reasons)*
  260. Public Function RevfindLine(SearchStr As String, ByRef strlines() As String) As Long
  261.   Dim Counter As Long
  262.   Dim TmpLngt As Long
  263.   Dim TmpString As String
  264.     On Error GoTo error
  265.     TmpLngt = UBound(strlines)
  266.     Counter = TmpLngt
  267.     Do
  268.         Counter = Counter - 1
  269.         TmpString = strlines(Counter + 1)
  270.         If InStr(TmpString, SearchStr) > 0 Then
  271.             RevfindLine = Counter + 1
  272.             Exit Function
  273.         End If
  274.     Loop Until Counter = 0
  275. error:
  276.     RevfindLine = -1
  277. End Function
  278. 'Checks if a string contains a special seperated word
  279. Public Function InStrWord( _
  280.                           ByRef Text As String, _
  281.                           ByRef Word As String _
  282.                           ) As Long
  283.   'Deklarationen:
  284.   Dim WordLen As Long
  285.   Dim TextEnd As Long
  286.   Dim OK As Boolean
  287.     WordLen = Len(Word)
  288.     If WordLen = 0 Then
  289.         Exit Function
  290.     End If
  291.     TextEnd = Len(Text) - WordLen + 1
  292.     InStrWord = InStr(1, Text, Word, vbTextCompare)
  293.     Do While InStrWord
  294.         If InStrWord = 1 Then
  295.             OK = True
  296.           Else
  297.             OK = IsWordSep(Mid$(Text, InStrWord - 1, 1))
  298.         End If
  299.         'Ggf. Zeichen hinter dem Wort checken:
  300.         If OK And (InStrWord < TextEnd) Then
  301.             OK = IsWordSep(Mid$(Text, InStrWord + WordLen, 1))
  302.         End If
  303.         'Treffer zur點kgeben oder weitersuchen:
  304.         If OK Then
  305.             Exit Do
  306.         End If
  307.         InStrWord = InStr(InStrWord + WordLen, Text, Word, vbTextCompare)
  308.     Loop
  309. End Function
  310. 'Returns true if a char is a known seperator
  311. Public Function IsWordSep(ByVal Char As String) As Boolean
  312.     If Char = " " Or Char = vbCr Or Char = vbLf Or Char = vbTab Or Char = Chr$(34) Or Char = vbCrLf Or Char = "-" Then
  313.         IsWordSep = True
  314.     End If
  315. End Function
  316. '**************************************************************************************
  317. 'Replace function
  318. '
  319. 'Author: unknown
  320. '
  321. 'Desc:
  322. '
  323. 'this functions are a lot faster than the original functions and usefull
  324. 'for VB5 User
  325. ''**************************************************************************************
  326. Public Function Replace(ByRef Text As String, _
  327.                         ByRef sOld As String, ByRef sNew As String, _
  328.                         Optional ByVal Start As Long = 1, _
  329.                         Optional ByVal Count As Long = 2147483647, _
  330.                         Optional ByVal Compare As VbCompareMethod = vbBinaryCompare _
  331.                         ) As String
  332.     If LenB(sOld) Then
  333.         If Compare = vbBinaryCompare Then
  334.             ReplaceBin Replace, Text, Text, _
  335.                        sOld, sNew, Start, Count
  336.           Else
  337.             ReplaceBin Replace, Text, LCase$(Text), _
  338.                        LCase$(sOld), sNew, Start, Count
  339.         End If
  340.       Else 'Suchstring ist leer:
  341.         Replace = Text
  342.     End If
  343. End Function
  344. Private Static Sub ReplaceBin(ByRef Result As String, _
  345.                 ByRef Text As String, ByRef Search As String, _
  346.                 ByRef sOld As String, ByRef sNew As String, _
  347.                 ByVal Start As Long, ByVal Count As Long _
  348.                 )
  349.   Dim TextLen As Long
  350.   Dim OldLen As Long
  351.   Dim NewLen As Long
  352.   Dim ReadPos As Long
  353.   Dim WritePos As Long
  354.   Dim CopyLen As Long
  355.   Dim Buffer As String
  356.   Dim BufferLen As Long
  357.   Dim BufferPosNew As Long
  358.   Dim BufferPosNext As Long
  359.     'Ersten Treffer bestimmen:
  360.     If Start < 2 Then
  361.         Start = InStrB(Search, sOld)
  362.       Else
  363.         Start = InStrB(Start + Start - 1, Search, sOld)
  364.     End If
  365.     If Start Then
  366.         OldLen = LenB(sOld)
  367.         NewLen = LenB(sNew)
  368.         Select Case NewLen
  369.           Case OldLen 'einfaches 躡erschreiben:
  370.             Result = Text
  371.             For Count = 1 To Count
  372.                 MidB$(Result, Start) = sNew
  373.                 Start = InStrB(Start + OldLen, Search, sOld)
  374.                 If Start = 0 Then
  375.                     Exit Sub
  376.                 End If
  377.             Next Count
  378.             Exit Sub
  379.           Case Is < OldLen 'Ergebnis wird k黵zer:
  380.             'Buffer initialisieren:
  381.             TextLen = LenB(Text)
  382.             If TextLen > BufferLen Then
  383.                 Buffer = Text
  384.                 BufferLen = TextLen
  385.             End If
  386.             'Ersetzen:
  387.             ReadPos = 1
  388.             WritePos = 1
  389.             If NewLen Then
  390.                 'Einzuf黦enden Text beachten:
  391.                 For Count = 1 To Count
  392.                     CopyLen = Start - ReadPos
  393.                     If CopyLen Then
  394.                         BufferPosNew = WritePos + CopyLen
  395.                         MidB$(Buffer, WritePos) = MidB$(Text, ReadPos, CopyLen)
  396.                         MidB$(Buffer, BufferPosNew) = sNew
  397.                         WritePos = BufferPosNew + NewLen
  398.                       Else
  399.                         MidB$(Buffer, WritePos) = sNew
  400.                         WritePos = WritePos + NewLen
  401.                     End If
  402.                     ReadPos = Start + OldLen
  403.                     Start = InStrB(ReadPos, Search, sOld)
  404.                     If Start = 0 Then
  405.                         Exit For
  406.                     End If
  407.                 Next Count
  408.               Else
  409.                 'Einzuf黦enden Text ignorieren (weil leer):
  410.                 For Count = 1 To Count
  411.                     CopyLen = Start - ReadPos
  412.                     If CopyLen Then
  413.                         MidB$(Buffer, WritePos) = MidB$(Text, ReadPos, CopyLen)
  414.                         WritePos = WritePos + CopyLen
  415.                     End If
  416.                     ReadPos = Start + OldLen
  417.                     Start = InStrB(ReadPos, Search, sOld)
  418.                     If Start = 0 Then
  419.                         Exit For
  420.                     End If
  421.                 Next Count
  422.             End If
  423.             'Ergebnis zusammenbauen:
  424.             If ReadPos > TextLen Then
  425.                 Result = LeftB$(Buffer, WritePos - 1)
  426.               Else
  427.                 MidB$(Buffer, WritePos) = MidB$(Text, ReadPos)
  428.                 Result = LeftB$(Buffer, WritePos + LenB(Text) - ReadPos)
  429.             End If
  430.             Exit Sub
  431.           Case Else 'Ergebnis wird l鋘ger:
  432.             'Buffer initialisieren:
  433.             TextLen = LenB(Text)
  434.             BufferPosNew = TextLen + NewLen
  435.             If BufferPosNew > BufferLen Then
  436.                 Buffer = Space$(BufferPosNew)
  437.                 BufferLen = LenB(Buffer)
  438.             End If
  439.             'Ersetzung:
  440.             ReadPos = 1
  441.             WritePos = 1
  442.             For Count = 1 To Count
  443.                 CopyLen = Start - ReadPos
  444.                 If CopyLen Then
  445.                     'Positionen berechnen:
  446.                     BufferPosNew = WritePos + CopyLen
  447.                     BufferPosNext = BufferPosNew + NewLen
  448.                     'Ggf. Buffer vergr鲞ern:
  449.                     If BufferPosNext > BufferLen Then
  450.                         Buffer = Buffer & Space$(BufferPosNext)
  451.                         BufferLen = LenB(Buffer)
  452.                     End If
  453.                     'String "patchen":
  454.                     MidB$(Buffer, WritePos) = MidB$(Text, ReadPos, CopyLen)
  455.                     MidB$(Buffer, BufferPosNew) = sNew
  456.                   Else
  457.                     'Position bestimmen:
  458.                     BufferPosNext = WritePos + NewLen
  459.                     'Ggf. Buffer vergr鲞ern:
  460.                     If BufferPosNext > BufferLen Then
  461.                         Buffer = Buffer & Space$(BufferPosNext)
  462.                         BufferLen = LenB(Buffer)
  463.                     End If
  464.                     'String "patchen":
  465.                     MidB$(Buffer, WritePos) = sNew
  466.                 End If
  467.                 WritePos = BufferPosNext
  468.                 ReadPos = Start + OldLen
  469.                 Start = InStrB(ReadPos, Search, sOld)
  470.                 If Start = 0 Then Exit For
  471.             Next Count
  472.             'Ergebnis zusammenbauen:
  473.             If ReadPos > TextLen Then
  474.                 Result = LeftB$(Buffer, WritePos - 1)
  475.               Else
  476.                 BufferPosNext = WritePos + TextLen - ReadPos
  477.                 If BufferPosNext < BufferLen Then
  478.                     MidB$(Buffer, WritePos) = MidB$(Text, ReadPos)
  479.                     Result = LeftB$(Buffer, BufferPosNext)
  480.                   Else
  481.                     Result = LeftB$(Buffer, WritePos - 1) & MidB$(Text, ReadPos)
  482.                 End If
  483.             End If
  484.             Exit Sub
  485.         End Select
  486.       Else
  487.         Result = Text
  488.     End If
  489. End Sub
  490. Public Sub MoveStringArray(Source() As String, dest() As String, firstEl As Long, lastEL As Long)
  491.   Dim numBytes As Long
  492. On Error GoTo error
  493.     numBytes = (lastEL - firstEl + 1) * 4
  494.     ' start with a fresh new array
  495.     '(it clears all its descriptors)
  496.     ReDim dest(0 To lastEL - firstEl) As String
  497.     ' copy all the descriptors from source() to dest()
  498.     CopyMemory ByVal VarPtr(dest(0)), _
  499.                ByVal VarPtr(Source(firstEl)), numBytes
  500.     ' manually clear all the descriptors in source()
  501.     ZeroMemory ByVal VarPtr(Source(firstEl)), numBytes
  502. error:
  503. End Sub
  504. ':) Ulli's VB Code Formatter V2.12.7 (19.06.2002 23:13:06) 48 + 401 = 449 Lines