Как заменить 'at' на @ - PullRequest
       19

Как заменить 'at' на @

5 голосов
/ 02 декабря 2011

У меня около 17 тысяч электронных писем с заказами, новостями, контактами и т. Д. За последние 11 лет.

Адреса электронной почты пользователей были зашифрованы, чтобы остановить сканеры и спам, изменив значение @ на *@* или 'at'.

Я пытаюсь создать разделенный запятыми список для создания базы данных наших пользователей.

Код работает с записью файла и зацикливанием папок, потому что, если я запишу адрес электронной почты отправителя в файл, в котором я в настоящее время использую тело письма, он печатается нормально.

проблема в том, что Replace s не меняется *at* и т. д. на @.

  1. Прежде всего, почему бы и нет?
  2. Есть ли лучший способ для меняделать это в целом?
Private Sub Form_Load()

   Dim objOutlook As New Outlook.Application
   Dim objNameSpace As Outlook.NameSpace
   Dim objInbox As MAPIFolder
   Dim objFolder As MAPIFolder
   Dim fldName As String

   fldName = "TEST"

   ' Get the MAPI reference

   Set objNameSpace = objOutlook.GetNamespace("MAPI")

   ' Pick up the Inbox

   Set objInbox = objNameSpace.GetDefaultFolder(olFolderInbox)

   'Loop through the folders under the Inbox
   For Each objFolder In objInbox.Folders
       RecurseFolders fldName, objFolder
   Next objFolder

End Sub

Public Sub RecurseFolders(targetFolder As String, currentFolder As MAPIFolder)
   If currentFolder.Name = targetFolder Then
       GetEmails currentFolder
   Else
       Dim objFolder As MAPIFolder
       If currentFolder.Folders.Count > 0 Then
           For Each objFolder In currentFolder.Folders
               RecurseFolders targetFolder, objFolder
           Next
       End If
     End If
End Sub

Sub WriteToATextFile(e As String)
    MyFile = "c:\" & "emailist.txt"
    'set and open file for output
    fnum = FreeFile()
    Open MyFile For Append As fnum
    Print #fnum, e; ","
    Close #fnum
End Sub

Sub GetEmails(folder As MAPIFolder)
    Dim objMail As MailItem

    ' Read through all the items
    For i = 1 To folder.Items.Count
        Set objMail = folder.Items(i)
        GetEmail objMail.Body              
    Next i

End Sub

Sub GetEmail(s As String)
    Dim txt = s
    Do Until InStr(txt, "@") <= 0
        Dim tleft As Integer
        Dim tright As Integer
        Dim start As Integer
        Dim text As String
        Dim email As String

        text = Replace(text, " at ", "@", VbCompareMethod.vbTextCompare)
        text = Replace(text, "'at'", "@", VbCompareMethod.vbTextCompare)
        text = Replace(text, "*at*", "@", VbCompareMethod.vbTextCompare)
        text = Replace(text, "*at*", "@", VbCompareMethod.vbTextCompare)

        text = Replace(text, "<", " ", VbCompareMethod.vbTextCompare)
        text = Replace(text, ">", " ", VbCompareMethod.vbTextCompare)
        text = Replace(text, ":", " ", VbCompareMethod.vbTextCompare)

        'one two ab@bd.com one two
        tleft = InStr(text, "@") '11

        WriteToATextFile Str(tleft)
        WriteToATextFile Str(Len(text))

        start = InStrRev(text, " ", Len(text) - tleft)
        'WriteToATextFile Str(start)
        'WriteToATextFile Str(Len(text))
        'start = Len(text) - tleft
        text = left(text, start)
        'ab@bd.com one two

        tright = InStr(text, " ") '9
        email = left(text, tright)
        WriteToATextFile email

        text = right(text, Len(text) - Len(email))
        GetEmail txt
    Loop
End Sub

Ответы [ 2 ]

5 голосов
/ 03 декабря 2011

А как насчет использования регулярных выражений?

Что-то вроде:

Public Function ReplaceAT(ByVal sInput as String)
     Dim RegEx As Object
     Set RegEx = CreateObject("vbscript.regexp")
     With RegEx
      .Global = True
      .IgnoreCase = True
      .MultiLine = True
      .Pattern = "( at |'at'|<at>)"
     End With
     ReplaceAT = RegEx.Replace(sInput, "@")
     Set RegEx = Nothing
End Function

Просто заменяйте регулярные выражения на все возможные случаи.
См. http://www.regular -expressions.info / для получения дополнительных советов и информации.

4 голосов
/ 03 декабря 2011

Я воспользовался этим, чтобы извлечь электронные письма, такие как приведенный ниже пример, в котором три адреса электронной почты, выделенные желтым цветом в приведенном ниже примере сообщения, будут перенесены в файл csv

  1. Любые действительные электронные письма записываются в CSV-файл Set objTF = objFSO.createtextfile("c:\myemail.csv")
  2. Этот код сканирует все электронные письма в папке с именем temp в Inbox . Я исключаю вашу рекурсивную часть тестирования и простоты
  3. Есть четыре строковые манипуляции
  4. Эта строка преобразует все непечатные пробелы в обычные пробелы strMsgBody = Replace(strMsgBody, Chr(160), Chr(32) (маловероятно, но это произошло в моем тестировании)
  5. Regex1 преобразует любое "at" или " at " и т. Д. В "@" "(\s+at\s+|'at'|<at>|\*at\*|at)"
  6. Regex2 преобразует любую "точку" или " точку " и т. Д. В "." "(\s+dot\s+|'dot'|<dot>|\*dot\*|dot)"
  7. Regex3 преобразует любой из "<" ">" или ":" в "" .Pattern = "[<:>]"
  8. Regex4 извлекает любое действительное письмо от emailbody
  9. Любые действительные электронные письма записываются в файл csv с использованием objTF.writeline objRegM

    enter image description here

код ниже

Public Test()
Dim objOutlook As New Outlook.Application
Dim objNameSpace As Outlook.NameSpace
Dim objFolder As MAPIFolder
Dim strfld As String
Dim objRegex As Object
Dim objRegMC As Object
Dim objRegM As Object
Dim objFSO As Object
Dim oMailItem As MailItem
Dim objTF As Object
Dim strMsgBody As String    
Set objRegex = CreateObject("vbscript.regexp")
Set objFSO = CreateObject("scripting.filesystemobject")
Set objTF = objFSO.createtextfile("c:\myemail.csv")

With objRegex
    .Global = True
    .MultiLine = True
    .ignorecase = True
    strfld = "temp"
    'Get the MAPI reference
    Set objNameSpace = objOutlook.GetNamespace("MAPI")
    'Pick up the Inbox
    Set objFolder = objNameSpace.GetDefaultFolder(olFolderInbox)
    Set objFolder = objFolder.Folders(strfld)
    For Each oMailItem In objFolder.Items
        strMsgBody = oMailItem.Body
        strMsgBody = Replace(strMsgBody, Chr(160), Chr(32))
        .Pattern = "(\s+at\s+|'at'|<at>|\*at\*|at)"
        strMsgBody = .Replace(strMsgBody, "@")
        .Pattern = "(\s+dot\s+|'dot'|<dot>|\*dot\*|dot)"
        strMsgBody = .Replace(strMsgBody, ".")
        .Pattern = "[<:>]"
        strMsgBody = .Replace(strMsgBody, vbNullString)
        .Pattern = "[\w-\.]{1,}\@([\da-zA-Z-]{1,}\.){1,}[\da-zA-Z-]{2,3}"
        If .Test(strMsgBody) Then
            Set objRegMC = .Execute(strMsgBody)
            For Each objRegM In objRegMC
                objTF.writeline objRegM
            Next
        End If
    Next
End With
objTF.Close
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...