Перечислите электронные письма в папке «Входящие» и нажмите на все ссылки в письме. - PullRequest
0 голосов
/ 21 марта 2019

Я пытаюсь создать сценарий, который перечисляет все электронные письма в папке входящих сообщений Outlook и щелкает все ссылки во всех электронных письмах. Это то, что у меня есть, и для тестирования я получаю только первые 10 писем с переменной $emails.

Я думаю, что моя проблема в invoke-webrequest, потому что из 10 протестированных мною электронных писем только 4 из них, похоже, успешно вызвали веб-запрос (по крайней мере, в ISE powershell это показывает мне успешное соединение, которое просто показывает ответ 200 от запроса GET).

Итак, еще один вопрос, который у меня возникает, даже если не удалось установить соединение, он все еще пытается установить соединение или эта проблема является частью регулярного выражения, в котором неправильно хранятся некоторые URL-адреса? Я тестирую некоторое программное обеспечение, которое должно оповещать о кликах по ссылкам на известные плохие домены.

Мой третий вопрос - это мое -match регулярное выражение, которое, по моему мнению, соответствует только первой URL-ссылке регулярного выражения в сообщении электронной почты и сохраняет ее в хеш-таблице совпадений. Я хотел бы, чтобы он совпадал с ALL ссылками в письме, если у кого-то есть улучшения, пожалуйста, дайте мне знать.

# Build the inbox ingestion
Add-type -assembly "Microsoft.Office.Interop.Outlook" | out-null
$olFolders = "Microsoft.Office.Interop.Outlook.olDefaultFolders" -as [type] 

# Create a new Comobject which leverages the advantages of the COM 
# interfaces for system administration
$outlook = new-object -comobject outlook.application

# Use the Microsoft Application Programming Interface
$namespace = $outlook.GetNameSpace("MAPI")
$folder = $namespace.getDefaultFolder($olFolders::olFolderInBox)
$emails = $folder.items | Select-Object Body | Select-Object -f 10 

# Build the empty Array to store url links
$URLArray = @()

# loop through all the emails within the inbox
foreach ($email in $emails) {
    # store a matched regex which is a url nd select the url from the stored hash table of $matches,
    # The values is a member of a method from the .NET framework
    $LinksEmail = $email -match "\b(?:(?:https?|ftp|file)://|www\.|ftp\.)(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[A-Z0-9+&@#/%=~_|$])"
    $values = $matches | select values

    # This is our first inner loop within the loop of email enumeration, at each email within the all emails loop this loop
    # will execute and store the values from the url matches hash table into a position within the
    # $URLArray array data structure
    foreach ($value in $values) {$URLArray += $value.values}
    # write-output $value.values
}

# this is not an inner loop but aloop after we have built our $URLArray array which uses a try-catch 
# block to attempt to invoke a web request which should be a stored url at each indexed position
# in the array
# write-output $URLArray
foreach ($item in $URLArray) {
    try {
        Invoke-WebRequest -verbose $Item
        write-output "This was successful"
    }
    catch { write-output "This Failed $item"}
}

1 Ответ

0 голосов
/ 22 марта 2019

Как вы проверили свое регулярное выражение?

This ...

$ LinksEmail = $ email -match

… вернет только true или false для самого первого совпадения и остановки.

$UrlList = @'
this is the URL https://stackoverflow.com/&20%
http://stackoverflow.com
http://www.SomeSite.com this is oure main site
http://www.SomeSite.com
ftp://www.somesite.com
ftp://somesite.com
ftp\SomeSite.com
If you want the file go there: file://SomeSite.com
'@
($values = $UrlList -match "\b(?:(?:https?|ftp|file)://|www\.|ftp\.)(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[-A-Z0-9+&@#/%=~_|$?!:,.])*(?:\([-A-Z0-9+&@#/%=~_|$?!:,.]*\)|[A-Z0-9+&@#/%=~_|$])")
True

($values = $matches | select values)

Values
------
{https://stackoverflow.com/&20%}

Несмотря на это, когда я помещаю его в инструмент PowerRegEx от Sapien и заполняю несколько URL-адресов, он не получает их все или только часть.Конечно, зависит от формата

URL - это базовый плюс любая строка, которая следует за ним, разумеется, и вы хотите, чтобы проверялся только базовый URL, а вы вообще не обрабатываете это из того, что показано здесь.

Попробуйте и посмотрите, поможет ли это.Этот захватывает целую строку не только основание, но это можно легко изменить.

$UrlList = @'
this is the URL https://stackoverflow.com/&20%
http://stackoverflow.com
http://www.SomeSite.com this is our main site
http://www.SomeSite.com
ftp://www.somesite.com
ftp://somesite.com
ftp\SomeSite.com
If you want the file go there: file://SomeSite.com
'@ 

[RegEx]::Matches($UrlList, '(ftp:|ftp|http:|https:|file:)(//.([^\s]+)|\\.([^\s]+))').value

https://stackoverflow.com/&20%
http://stackoverflow.com
http://www.SomeSite.com
http://www.SomeSite.com
ftp://www.somesite.com
ftp://somesite.com
ftp\SomeSite.com
file://SomeSite.com
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...