<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; Мониторинг почты и отправка вложений на облака]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=13476&amp;type=atom" />
	<updated>2018-07-18T17:10:35Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=13476</id>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=127135#p127135" />
			<content type="html"><![CDATA[<p><strong>Xameleon</strong>, хорошо.<br />Я, правда, не уверен, что настолько полезно (времени написать нормальный пример сейчас нет).</p><p>Код на Powershell (можно заменить любым языком, что поддерживает вызовы из .Net библиотек), для работы с IMAP используется <a href="http://www.mimekit.net/">MailKit</a> и встроенные средства. Версия интерпретатора должна быть не ниже 3 (лучше выше), но, при необходимости, можно переписать пару моментов и заработает в 2-ке. Я думаю, что большого труда перенести это на Python/AutoIt/что-то_другое не составит.</p><p><strong>Пример 1.</strong><br />Цепляемся к IMAP-серверу mail.example.com для пользователя user. Получаем непрочитанные сообщения для подпапки (точнее для двух дочерних, относительно INBOX&#039;а, folder1 и folder2). В теле письма есть ссылка на файл (с определённого домена, example.org, на этом домене web-сервер с авторизацией, но скачать файл он вам даст только по https, хотя ссылки будут приходить на http, и ссылка выдирается и htmlbody письма с заменой uri.scheme), скачиваем его (имя берётся из htmlbody, т.к. на web-сервере ссылки вида &quot;example.org/files/xxxxxxxxxxxx&quot;, а Powershell не умеет нормально content-disposition) и пересылаем исходник письма на др. адрес (user2, на том же домене example.com, но это не принципиально) вложив скачанный файл (тема письма заменяется на &quot;FW: имя файла&quot;). SMTP-авторизация в примере не используется. После обработки исходное письмо письмо будет отмечено прочитанным.<br /></p><div class="codebox"><pre><code>
# я не устанавливал mailkit, mimekit, bounce_castle, т.к. требовалось &quot;портабельное&quot; решение.
# библиотеки положить вместе со скриптом ну или установить.
$loadedassemblies = [appdomain]::currentdomain.getassemblies()
&#039;BouncyCastle.Crypto&#039;, &#039;mimekit&#039;, &#039;mailkit&#039; | %{ $assemblyname = $_
    if (! (($loadedassemblies | %{($_.FullName -split &#039;,&#039;)[0]}) -contains $assemblyname)) {
        Add-Type -Path &quot;$(Join-Path $PSScriptRoot ($_ + &#039;.dll&#039;))&quot;
    }
}


$mll = New-Object MailKit.Net.Imap.ImapClient
$ctoken = New-Object System.Threading.CancellationToken ($false)
$ssl = [MailKit.Security.SecureSocketOptions]::SslOnConnect
$mll.Connect(&#039;mail.example.com&#039;, 993, $ssl, $ctoken)
$mll.Authenticate(([System.Text.Encoding]::UTF8) , &quot;user@example.com&quot;, &quot;strongpassword&quot; , $ctoken)

$folders = &#039;folder1&#039;,&#039;folder2&#039;
foreach ($folder in $folders) {
$inbox = $mll.Inbox
$inbox.Open([MailKit.FolderAccess]::ReadOnly) | Out-Null

$inbox = $inbox.GetSubfolders($false) | ?{$_.Name -eq $folder}
$inbox.Open([MailKit.FolderAccess]::ReadWrite) | Out-Null

$msgs =  $inbox.Search([MailKit.Search.SearchQuery]::NotSeen)
foreach ($msg in $msgs) { 
    try {
        $eml = $inbox.GetMessage([MailKit.UniqueId]$msg.Id)
    }
    catch {
        $_
    }

    $emlhtml = New-Object -Com &quot;HTMLFile&quot;
    $content = $eml.HtmlBody
    try {
        $emlhtml.IHTMLDocument2_write($content)
    }
    catch {
        $src = [System.Text.Encoding]::Unicode.GetBytes($content)
        $emlhtml.write($src)
    }
    $files = $emlhtml.links | ?{$_.hostname -eq &#039;example.org&#039;} | %{
        $url = [System.Uri]$_.Href
        if ($url.Scheme -eq &#039;http&#039;) {
            $url = [System.Uri]$(&#039;https://&#039; + $url.Host + $url.AbsolutePath)
        }
        $file = $_.TextContent
        $username = &quot;user&quot;
        $password = &quot;password&quot;
    
        $encoded =  [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($username + &quot;:&quot; + $password))  
        $headers = @{Authorization = &quot;Basic &quot;+$encoded}
        $cred = (New-Object System.Management.Automation.PSCredential($username,($password | ConvertTo-SecureString -AsPlainText -Force)))
        $useragent = &quot;Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0&quot;

        $outFilePath = Join-Path $PSScriptRoot $file
        try {
            $r = Invoke-WebRequest -Uri $url -Headers $headers -UserAgent $useragent -Method get -OutFile $outFilePath -PassThru
        }
        catch {
            $site = $_.Exception.Response
        }
        gi $outFilePath
    }
    Send-MailMessage -To &quot;user2@example.com&quot; -Subject $(&#039;FW: &#039; + $files.Name) -Body $($emlhtml | %{$_.Body.OuterHtml}) -BodyAsHtml -Encoding UTF8 -SmtpServer &quot;mail.example.com&quot; -From &quot;user@example.com&quot; -Port 25 -Attachments $files.FullName
    $inbox.AddFlags([MailKit.UniqueId]$msg.Id, ([MailKit.MessageFlags]::Seen), $true)
}
$inbox.Close()
}
$mll.Disconnect($true , $ctoken)
</code></pre></div><p>Комментариев почти нет, но если кому-то будет интересно, то набросаю ещё несколько примеров на выходных (нормальных, а не как этот) и приведу в порядок этот (например, вынесу переменные и нормальные имена и комментарии напишу - увы, работа сейчас не позволяет хорошо написать пример). Код выглядит страшно, но работает (во всяком случае, когда я проверял возможности Mailkit, подойдёт ли она мне для работы - этот пример вполне себе работал). Возможные примеры, которые смогу набростать - обработка вложений, загрузка файлов на WEB-сервер (POST), обработка вложенных xls/xlsx (получение данных и/или сохранение в csv), и конкретно для IMAP-сервера: рекурсивный обход папок, получение всех сообщений (и можно даже сделать mirror в др. ящик), сортировка/перемещение сообщений, фильтрация списка сообщений по дате, отправителю, теме и т.п., проверку сертификата перед подключением (в примере подключение идёт по TLS, но валидность сертификата не проверяется).</p><p>Рабочие скрипты у меня &quot;покрасивше&quot; с &quot;функциями и обработкой ошибок&quot;, но перелопатить неск. сот кб. скриптов я попросту не успеваю.</p><p>Модуль PSGSuite для Powershell умеет работать с GMAIL, но что конкретно он умеет, я особо не смотрел (ну кроме очевидного - подключиться к ящику, получить список непрочитанных, получить сообщения) - возможно он уже умеет то, что просил ТС.</p><p>Если захотим не пересылать письмо, а сохранить его куда-нибудь в WEB, то на помощь придёт Invoke-RestMethod (заставить его работать для тех же dropbox, bitbucket, в принципе, возможно), который, можно заменить на curl.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2018-07-18T17:10:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=127135#p127135</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=127127#p127127" />
			<content type="html"><![CDATA[<p><strong>UNDYING</strong>, думаю будет крайне полезно ! )</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-07-18T07:07:01Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=127127#p127127</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=127024#p127024" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>для современных почтовых серверов, использующих TLS</p></blockquote></div><p>М.б. offlineimap (требует Python, но, я думаю, можно собрать standalone-приложение) и ripmime+curl? Такая связка больше подходит для *nix систем, но на Windows тоже можно завести.<br />На работе получаю &quot;техническую почту&quot; (всякие csv-таблицы и архивы) через MailKit-библиотеку (могу выложить пару скриптов как пример), TLS она точно умеет.</p>]]></content>
			<author>
				<name><![CDATA[UNDYING]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27822</uri>
			</author>
			<updated>2018-07-13T00:12:40Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=127024#p127024</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=124395#p124395" />
			<content type="html"><![CDATA[<p><strong>DnsIs</strong>, </p><div class="quotebox"><blockquote><p>Из за неработающего TLS.</p></blockquote></div><p>1) Я же написал в том же сообщении<br /></p><div class="quotebox"><blockquote><p>но для современных почтовых серверов, использующих TLS, придётся ещё поднимать соединение через OpenSSL или что-то подобное.</p></blockquote></div><div class="quotebox"><blockquote><p>На сайте намек есть:<br />Don&#039;t hesitate. Try it out before you pay!</p></blockquote></div><p>2) В разделе Purchase отсутствует возможность приобретения <strong>EAGetMail Background Service</strong> + при запуске этого сервиса нигде нет вкладок упоминающих о том, что он работает в триальном режиме или кнопки для покупки</p><p>Из чего я сделал вывод, что возможно он бесплатен.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-04-02T09:57:06Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=124395#p124395</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=124393#p124393" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>DnsIs, не понял. Почему getmail &quot;уже не катит&quot; ?</p></blockquote></div><p>Из за неработающего TLS.<br /></p><div class="quotebox"><cite>Xameleon пишет:</cite><blockquote><p>Но пока не могу понять триальный он или нет.</p></blockquote></div><p>На сайте намек есть:<br /><strong>Don&#039;t hesitate. Try it out before you pay!</strong></p>]]></content>
			<author>
				<name><![CDATA[DnsIs]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26282</uri>
			</author>
			<updated>2018-04-02T09:38:34Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=124393#p124393</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=124067#p124067" />
			<content type="html"><![CDATA[<p><strong>DnsIs</strong>, не понял. Почему getmail &quot;уже не катит&quot; ?</p><p>Кстати, нашёл любопытный вариант - <a href="https://www.emailarchitect.net/downloads.aspx">EAGetMail Background Service</a></p><p>Но пока не могу понять триальный он или нет.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-03-15T09:53:54Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=124067#p124067</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=124066#p124066" />
			<content type="html"><![CDATA[<p>Долго искал консольную утилиту для забора почты, так и не нашел. Вся проблема именно в TLS. <strong>getmail.exe</strong> уже не катит. Для отправки почты конечно лучше всего использовать клиенты, которые просто будут синхронизировать папку. Но есть еще один вариант для yandex.disk. Он работает по протоколу WebDav и для отправки файлов может помочь <a href="https://curl.haxx.se/">cURL</a>, как то так:<br /></p><div class="codebox"><pre><code>curl.exe --user &quot;user:password&quot; -k -T FILE https://webdav.yandex.ru/FILE</code></pre></div>]]></content>
			<author>
				<name><![CDATA[DnsIs]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=26282</uri>
			</author>
			<updated>2018-03-15T09:11:38Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=124066#p124066</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=123843#p123843" />
			<content type="html"><![CDATA[<p>Для получения почты можно использовать <strong>getmail.exe</strong> (эту консольную утилитку легко найти на просторах интернета), но для современных почтовых серверов, использующих TLS, придётся ещё поднимать соединение через <strong>OpenSSL</strong> или что-то подобное.<br />Либо использовать <strong>Outlook.Application</strong>, поставив Outlook из пакета офиса.</p><p>Для копирования в облако, думаю можно воспользоваться клиентом <strong>google drive</strong>. Он позволяет создать папку синхронизации на ПК. Если копировать в неё файлы, то клиент, автоматически воссоздавая структуру, будет загонять содержимое в облако.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-02-27T16:45:33Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=123843#p123843</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Мониторинг почты и отправка вложений на облака]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=123766#p123766" />
			<content type="html"><![CDATA[<p>Всем привет!<br />Я новенький. И это мой первый вопрос.<br />Мне приходят много писем от коллег с различными вложенными файлами.<br />Что можно придумать, чтобы содержимое нужных писем отправлялось на g.drive/ya.disk/dropbox ?</p><p>Т.е. грубо говоря, я прописываю правило для определённых емейлов, там перенаправлять куда-то, или что делать вот, я не знаю.<br />Их нужно куда-то редиректить, на какой-то сервис, который бы уже заливал вложение на облако.<br />Может есть идеи? </p><p>Сейчас я просто захожу на почту по вебморде, и тупо открываю каждый файл и скачиваю. Жутко хлопотно.</p>]]></content>
			<author>
				<name><![CDATA[Толстый Тони]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=39079</uri>
			</author>
			<updated>2018-02-18T12:52:00Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=123766#p123766</id>
		</entry>
</feed>
