Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Zapisz załączniki z plików MSG

Dzisiaj dzwoni do mnie Pani, że ma dokumenty w wielu(setki) folderach i musi je wszystkie wydrukować...

Okazało się, że te foldery to były pliki Outlooka w formacie MSG (ups). Żeby to normalnie wydrukować, trzeba by było każdy plik otworzyć i zapisać załączniki. Roboty mnóstwo. No więc przychodzi mi z pomocą Powershell (jak zawsze).

Napisałem skrypt, który z każdego pliku wyciąga załączniki i zapisuje je w tym samym folderze. Skrypt działa bardzo prosto. Otwórz plik w Outlooku, zapisz wszystkie załączniki, zamknij plik. Dla uproszczenia pominąłem podawanie ścieżki do zapisu, czy sprawdzanie czy plik już istnieje. Funkcję można znacznie rozbudować.

Po wykonaniu takiego skryptu można wszystkie pliki zaznaczyć i puścić do druku lub skorzystać z mojego poprzedniego wpisu i przerobić wszystkie pliki na jeden plik PDF(jeśli są otwieralne w Wordzie).

Miłego skryptowania:

Function Export-MSGAttachments{ <# .SYNOPSIS Export mail attachments and save as files .DESCRIPTION Function takes .msg files as parameter and foreach retrieves attachments and saves in the same folder as .msg file .PARAMETER file .msg file. Can be piped. .EXAMPLE PS C:\> Get-Childitem | Export-MSGAttachments .NOTES Author: BlinDRooD #> Param( [Parameter(Mandatory = $true, ValueFromPipeline = $true)] #Test to see if it is a file with .msg extension [ValidateScript({(-not $_.psiscontainer)-and ($_.Extension -eq ".msg")})] $file ) Begin{ #enum for closing file without saving $close = [Microsoft.Office.Interop.Outlook.OlInspectorClose]::olDiscard #outlook object $ol = New-Object -ComObject Outlook.Application } Process{ #to open msg file you have to treat it as template $temp = $ol.CreateItemFromTemplate($file.FullName) #saving every attachment $temp.Attachments | ForEach-Object { $_.SaveAsFile( (Join-Path $file.Directory $_.FileName))} #closing file $temp.Close($close) } End{ #closing outlook [System.Runtime.Interopservices.Marshal]::ReleaseComObject($ol) } } Proste prawda? 

windows oprogramowanie porady

Komentarze

Druedain   10 #1 20.01.2012 16:02

2 razy bym się zastanowił nim bym wrzucił wszystkie dokumenty do jednego PDFa. Wystarczy, że coś się pokiełbasi w czasie drukowania i szukaj wtedy człowieku, które strony się wydrukowały.

Czy Word jest jedynym programem eksportującym do PDFa?

  #2 20.01.2012 16:48

@Druedrain
Zapewne autor korzysta z Windowsa, w firmie jest pakiet Office więc mu łatwiej to załatwić za pomocą Worda niż szukać jakiegoś Open Source'owego cukiereczka ;-)

Druedain   10 #3 20.01.2012 17:47

Uderz w stół, a nożyce się odezwą… Idź hejtować gdzieś indziej.

Pytanie nadal otwarte.

djfoxer WSPÓŁPRACOWNIK  12 #4 20.01.2012 19:08

Kto wie, kiedy może się przydać. Thx :)

  #5 20.01.2012 19:38

@Druedain
Nie. Writer (pakiet LibreOffice) też to potrafi.

command-dos   13 #6 20.01.2012 20:18

@Druedain - PDFCreator.

Co do wpisu... odczytać wiadomości z msg, to pikuś w porównaniu do otrzymania załącznika w wiadomości w formie winmail.dat - to jest paranoja... Dobrze, że nie natrafiłeś na tego typu wiadomości - ot, kompatybilność ms'u...

  #7 20.01.2012 20:44

Druedain
Jest mnóstwo narzędzi, którymi możnaby to zrobić w sposób automatyczny.
Ja wybieram produkty pakietu Office ze względu na prostotę działania obiektów COM oraz świetną dokumentację. Jak opracujesz ciekawe skrypty z LibreOffice to z chęcią się poduczę :).

BTW. Mam sporo skryptów Powershella wykonywanych przez reguły Outlooka. Uwielbiam dłubać w nosie i patrzeć jak coś za mnie się wykonuje :)

  #8 20.01.2012 20:56

Co do pierwszej wypowiedzi to:
U mnie w firmie drukuje się masowo dokumenty w formatach: sxw, pdf, doc, tiff (wg tej kolejności) i nigdy nie było problemów, że "coś się pokiełbasiło". Masowy wydruk z jednego pliku jest najszybszym podejściem.

iluzion   5 #9 20.01.2012 22:43

Można też skorzystać z "gotowca" http://www.codeproject.com/Articles/32899/Reading-an-Outlook-MSG-File-in-C lub... Wykorzystując klasę OutlookStorage z podanego przykładu napisać w IronPythonie kilka linijek o postaci zbliżonej do tego fragmentu http://i.imgur.com/JnLiL.png

Druedain   10 #10 21.01.2012 11:43

Znów nieporozumienie :D

Po prostu chodziło mi o to, że ograniczając się do Worda można sobie tylko utrudnić życie jeśli się okaże, że jakiegoś formatu nie obsługuje. To było pytanie retoryczne do autora…

command-dos   13 #11 21.01.2012 16:18

@Druedain - OpenOffice ;)

blindrood   2 #12 22.01.2012 20:19

@Druedain:
Używaj narzędzia jakie Ci odpowiada. W mojej firmie dokumenty Wordem 2010 stoją i tego też używam.

Jeśli chodzi o konwersję do PDFa plików to gdy któryś plik nie otworzy się to Powershell rzuci wyjątkiem przy tym pliku i będzie dalej kontynuował.

OpenOffice\LibreOffice też nie otworzą wszystkich plików a ich wsparcie dla .docx jest nadal marnej jakości (W porównaniu do Worda 2010, który ma świetne wsparcie dla .odt)

  #13 30.03.2012 21:25

Hej a wiecie czy w powershellu da się zrobić konwertera z plików pdf do xls ?
I jeszcze pytanie dodatkowe - jaki skrypt może mi pomóc, gdy chcę aby za każdym razem gdy jest uaktualniany plik abc.pdf na nową wersję na stronie xyx.pl skrypt badał zmianę po wielkości pliku i wysyłał notyfikację do mnie na maila o tym fakcie ?