We rise up for the things we believe in over and over again

Поднадоел photobucket.com. Вот реально поднадоел. Интерфейс неповоротливый, реклама всякая опять же.
Присмотрелся поближе к imgur.com. Раньше он меня жутко бесил своими тормозами, сейчас его в этом плане облагородили. Но не только в этом. Есть там интересная возможность - заливать картинки через почту. Весьма удобно для пакетной обработки, а еще это дело можно заскриптовать.
Не думал, что эта задачка будет настолько интересной :)


А теперь разбираем по складам.
Весь блок #setting up variables ничего особого из себя не представляет. Там описываются все параметры доступа к картинкам и ящику, через который будем все отсылать. Мой ящик - на gmail.com, потому работаем на примере этого почтового сервиса.
Выбрать все картинки из указанной папки - тоже ничего особого. Вся коллекция будет сохранена в переменной $files.
Блок #setting up smtp client уже любопытнее. Там любопытна конструкция

$smtp.Credentials = New-Object System.Net.NetworkCredential($SMTPUsername, $SMTPPassword)
$smtp.EnableSSL = $true

которая говорит скрипту, что с почтой надо общаться по зашифрованному каналу связи. В противном случае gmail пошлет нас подальше с вердиктом

The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required

Еще одна деталь. Для того, чтобы это все сработало необходимо уже в настройках аккаунта gmail включить доступ для небезопасных приложений. Материал по этому поводу в сети есть. Если этого не сделать - gmail будет отбивать любые попытки работы скрипта с ящиком.
Блок #settung up message также не представляет ничего особого. Более того, там обязательными для заполнения полями будут всего лишь $msg.To.add($MailTo) и $msg.From = $MailFrom (Куда и от кого, соответственно). Адресом отправки всегда будет [email protected], а по адресу отправителя будет ясно, какая учетка на самом Imgur.com шлет картинки.
А вот секция #attach files in upload folder выпила у меня крови в три своих горла.
Сама по себе она стандартнейшая. Для каждого файла в коллекции $files, собранной ранее, делаем вложение в письмо с этим файлом. Все бы ничего, но в первой версии этого блока картинки цеплялись к письму и отсылались, но на Imgur ничего не появлялось. В чем проблема?
Как раз пока писалась первая версия скрипта, шел диалог с  Линда Кайе по поводу ранее не срабатывавшей отправки картинок. Среди предположений были и лишние символы в имени файлов, и длина имени... В итоге сошлись на том, что картинки рушил формат письма. Линда, я тебя и огорчу, и порадую. Это не совсем так.
Сравнивая два письма, посланных через скрипт и через web-интерфейс самого Gmail, выяснил, что формат их был один и тот же - multipart/mixed. Тем не менее, скриптовое письмо вложения по дороге теряло. А вот в чем отличие нашлось, так это в формате самих вложений: в письмах, отправленных через web-интерфейс, формат картинок JPG показывался как Content-Type: image/jpg. А в сообщениях, сформированных скриптом, те же картинки шли в виде Content-Type: application/octet-stream. И вот именно это и не позволяло уже самому Imgur найти в письме картинки и обработать их. Для того, чтобы избавиться от этой напасти в блок формирования вложений в скрипт и добавлена строка:

$MailAttachment.ContentType.MediaType = "image/$($file.extension.substring(1))"

Причем действует она хитро. В зависимости от того, какое расширение у обрабатываемой картинки, она сменит тип контента. Есть JPG - будет "image/JPG", обрабатываем PNG - получим "image/PNG".
Завершающая же строка скрипта проста как пара копеек, просто отправляем сформированное письмо.

@музыка: Koan - Back to the Silent Lagoon - Blue Mix

@темы: PowerShell, Scripting

Комментарии
12.02.2015 в 03:06

Тотальная неудачница и убийца жёстких дисков.
Я сверю content-type чуть позже, а пока хочу сказать, что когда писала свой вэб-сервер (на VB), то его брала прямо из реестра. Правда, с PNG случилась проблема - тогда это был экзотический формат, и его Content Type был в реестре указан неверно. Но в принципе, такой подход соответствует тому же lighttpd - у него конфиг тоже из системных настроек типы набирает (правда, у него при запуске, а у меня тип файла запрашивался каждый раз).
12.02.2015 в 03:09

Тотальная неудачница и убийца жёстких дисков.
Еще одна деталь. Для того, чтобы это все сработало необходимо уже в настройках аккаунта gmail включить доступ для небезопасных приложений. Материал по этому поводу в сети есть. Если этого не сделать - gmail будет отбивать любые попытки работы скрипта с ящиком.

Не помню такой галочки OO На какие именно клиенты она влияет? OO
12.02.2015 в 03:11

Тотальная неудачница и убийца жёстких дисков.
С утра торможу =_=

Зашла по VNC и глянула.

Content-Type: image/jpeg; name="gallery1.jpg"
Content-Disposition: attachment; filename="gallery1.jpg"
Content-Transfer-Encoding: base64


Это прямо в заголовке письма. Потом пустая строка и картинка в Base64.
12.02.2015 в 03:12

Тотальная неудачница и убийца жёстких дисков.
Ну тоесть тип файла указывать нужно правильно, но это не отменяет того, что imgur умеет только multipart/mixed.
12.02.2015 в 12:25

We rise up for the things we believe in over and over again
Не помню такой галочки OO
Ее относительно недавно ввели.

На какие именно клиенты она влияет? OO
Вот веришь, я сам еще не разобрался с этим до конца. PSH скрипты под эту категорию попали, а вот какие еще проги могут отказать работать - пока без рулей.
Сам доступ настраивается в свойствах аккаунта Google: www.google.com/settings/security/lesssecureapps

imgur умеет только multipart/mixed
Найду, как в PSH изменить формат самого сообщения - проверю :)
12.02.2015 в 13:14

Тотальная неудачница и убийца жёстких дисков.
Ее относительно недавно ввели.

У меня Вкл стоит OO

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

Пришли мне письмо из скрипта. Я подозреваю, что PoSH на CDO полагается, с соответствующим X-Mailer.

Найду, как в PSH изменить формат самого сообщения - проверю :)

^^
12.02.2015 в 15:32

We rise up for the things we believe in over and over again
Пришли мне письмо из скрипта.
Лови :)
12.02.2015 в 16:13

Тотальная неудачница и убийца жёстких дисков.
А X-Mailer-то вообще нет. Скорее всего я ошибаюсь ^^'
12.02.2015 в 16:17

We rise up for the things we believe in over and over again
То, что X-Mailer'а нет - я давно заметил. Но это все равно мало, что дает.

Скорее всего я ошибаюсь ^^'
Помнишь, что я сказал относительно CDO? ^.^
13.02.2015 в 07:51

Тотальная неудачница и убийца жёстких дисков.
Я полагаю, что Гугл фильтрует письма по X-Mailer. Помнится, масса вирусов слала почту с X-Mailer от CDO, поскольку юзала оный и авторы не сильно беспокоились о замене этой строчки.

Помнишь, что я сказал относительно CDO? ^.^

PoSH может внутрях его юзать OO
13.02.2015 в 07:53

Тотальная неудачница и убийца жёстких дисков.
Помнишь, что я сказал относительно CDO? ^.^

/* Честно гвооря, нет ^^' */
13.02.2015 в 08:02

We rise up for the things we believe in over and over again
/* Честно гвооря, нет ^^' */
Линда Кайе (19:28:32 11/02/2015)
CDO ^^'

Hikedaya (19:28:39 11/02/2015)
НАФИГ!

Но вообще, PSH может и через CDO почту слать. Вот пример такого с технета:

Но это осталось в тех же временах, где остался Exchange 2003, ибо так обычно работали именно с ним.
13.02.2015 в 08:16

Тотальная неудачница и убийца жёстких дисков.
Не помню, где это обсуждалось, но запощу здесь. Короче, у меня есть обёртка для CDO в виде COM объекта. Там всё автоматизировано и красиво. Эту обёртку использует AJPapps - Simple mailer. Только что отправила картинку сама себе с пустым телом. CDO сваял письмо с одним аттачментом и без multipart/mixed. Вот интересные заголовки:

X-Mailer: AJPapps - Simple mailer 1.01.0017
Content-Type: image/jpeg; name="B9i3lBHIEAAZgjl.jpg large.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="B9i3lBHIEAAZgjl.jpg large.jpg"
Content-Class: urn:content-classes:message
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6090


X-Mailer моя программа устанавливает (вроде бы обёртка тоже это делает по дефолту, просто потом внешняя программа может дать своё значение. А вот X-MimeOLE остаётся то, что укажет CDO. Вот по нему "вирусы" и детектили.

К слову, когда-то письма отправленные через CDO называли "вирусы, использующие дырявый Аутлук".
13.02.2015 в 08:24

We rise up for the things we believe in over and over again
"вирусы, использующие дырявый Аутлук"
Хм... не слышал о таком :)
13.02.2015 в 08:50

Тотальная неудачница и убийца жёстких дисков.
А, ясно. Думала, что там были аргументы против, а не альтернатива ^^

Хм... не слышал о таком :)

В конце девяностых - начале нулевых было такое ^^
13.02.2015 в 08:50

Тотальная неудачница и убийца жёстких дисков.
Хотя в принципе CDO с Windows 2000 стартовала. Может быть там MAPI имели в виду?
13.02.2015 в 14:45

We rise up for the things we believe in over and over again
В конце девяностых - начале нулевых
Это время моего студенчества. Тогда у меня доступ к инету был крайне ограничен, может быть даже более ограничен, чем у тебя. Потому и не слышал о таких зверях :)
13.02.2015 в 18:25

Тотальная неудачница и убийца жёстких дисков.
Начнём с того, что Инет дома у меня появился в 2006, в то время как периодически я там стала появляться году в 2003. Но вот в журналах вроде СИ и Game.EXE про интернеты писали ещё до кризиса 1998.
13.02.2015 в 19:00

We rise up for the things we believe in over and over again
СИ и Game.EXE... до кризиса 1998
А вот эти вещи в наших краях в те времена не светились :(
13.02.2015 в 20:18

Тотальная неудачница и убийца жёстких дисков.
Зря. Рулили тогда, не то что нынче. СИ был особенно шикарен, а потом бабахнул кризис, и они перешли на газетную бумагу.
13.02.2015 в 20:38

We rise up for the things we believe in over and over again
Ну... теперь остается разве что вздохнуть, вспоминая те времена, и жить дальше, работая с тем, что есть. А есть немало :)
14.02.2015 в 10:41

Тотальная неудачница и убийца жёстких дисков.
^^'