Outlook->Access Rozdzielenie nazw i adresów mailowych

Pytania, problemy, uwagi związane ze starszymi wersjami Microsoft Outlook 2003, 2002 (XP), 2000, 98

Moderator: Moderatorzy

Outlook->Access Rozdzielenie nazw i adresów mailowych

Postprzez pzpr2007 » Cz 25.10.2007 11:11

Witam!
Jestem tu nowy i baaardzo proszę o pomoc. Mam za zadanie wyeksportować maile do access'a z folderu publicznego. Żeby uniknąć komunikatów ochrony Outlooka, robię to z poziomu VB Outlooka.
Nie mogę rozdzielić adresów mailowych od ich nazw. Z właściwością senderName i senderEmailAddress jeszcze sobie radzę (mimo, że w sendername pojawiają sie czasem maile jak nie ma do nich nazwy), ale gorzej jest z właściwościami: to, cc i bcc - tu naprzemian są nazwy i adresy mailowe (i nie mam jak dostać się do adresów email kryjących się pod nazwami!) .

Pytania:
1. Może jest jakaś właściwość obiektu: MailItem w rodzaju: toEmailAddress, ccEmailAddress i bccEmailAddress jak przy właściwości sender?

2. A może można nazwy i maile w jakiś inny sposób rozdzielić?

Już wolałbym żeby zawsze pokazywały sie tylko adresy mailowe, a nie czasami zamiast tego przyporządkowane im nazwy.

A przy okazji z innej beczki:
Jak w zdarzeniu Application_startup umieszczam kod, który cyklicznie wywołuje się co minutę (i jw. eksportuje maile do accessa) to cały czas mam klepsydrę jako kursor, ekran jest 'zamrożony' i nic nie można w outlooku zrobić.

3. Czy można coś zaradzić na takie 'zamrażanie' ekranu przez ciągle działajacy w tle skrypt?

Bardzo zależy mi na odpowiedzi. Proszę o pomoc!!! :roll:
pzpr2007
 
Posty: 13
Dołączył(a): Cz 25.10.2007 10:29

Re: Outlook->Access Rozdzielenie nazw i adresów mailowych

Postprzez OShon » Cz 25.10.2007 18:50

pzpr2007 napisał(a):Może jest jakaś właściwość obiektu: MailItem w rodzaju: toEmailAddress, ccEmailAddress i bccEmailAddress jak przy właściwości sender?

Dim mailCopy
Set mailCopy = Item.Copy
.Email1Address = mailCopy.Recipients(1).Address
.FullName = mailCopy.Recipients(1).Name
http://www.codetwo.pl/articles/macros/kontakty_z_maili.php

pzpr2007 napisał(a):Jak w zdarzeniu Application_startup umieszczam kod, który cyklicznie wywołuje się co minutę (i jw. eksportuje maile do accessa) to cały czas mam klepsydrę jako kursor, ekran jest 'zamrożony' i nic nie można w outlooku zrobić.

Co wykorzystujesz do wywoływania co minute procedury?
jakiejś kontrolki ?
np ietimer czy opierasz sie na odczytywaniu czasu rzeczywistego w pętli?

pzpr2007 napisał(a):Czy można coś zaradzić na takie 'zamrażanie' ekranu przez ciągle działajacy w tle skrypt?

Tak - wystarczy wpisać DoEvents
o ile jest tam proces w pętli.
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10348
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez pzpr2007 » Cz 25.10.2007 21:38

Serdeczne dzięki za odpowiedź.
Rozdzielanie odbiorców dopasowałem do swoich potrzeb i działa rewelacyjnie.

Jeśli chodzi o 'zamrażanie' ekranu to opóźnienie wykonania pętli for realizuję tak:
Kod: Zaznacz cały
start:

  pauza = Timer + 60 'sekund
  While Timer < pauza
  Wend

For Each itm In folder.Items
...
...
next

goto start


Pewnie nie jest to za eleganckie, ale to wymyśliłem na szybko.
Próbowałem dodawać: doEvents w różnych miejscach kodu i 'zamrażanie' dalej występowało.

Może jakaś propozycja na wielokrotne powtarzanie kodu np. co minutę?
Ostatnio edytowano So 27.10.2007 00:05 przez pzpr2007, łącznie edytowano 1 raz
pzpr2007
 
Posty: 13
Dołączył(a): Cz 25.10.2007 10:29

Postprzez OShon » Pt 26.10.2007 00:17

No niestety
Używasz Timera systemowego, który za każdym przebiegiem sprawdza stan z systemu. Co za tym idzie masz 100% użycia proca.

Outlook nie ma .OnTime co można by wymusić na pewien okres wywołanie innej procedury. np:
Kod: Zaznacz cały
Application.OnTime Now + TimeValue("00:00:06"), "my_Procedure"
tutaj to nie zadziała.

VBA nie ma obsługi Timera z VB6 co by było najlepszym posunięciem - bo on posiada swój licznik, a co za tym idzie wykonywane pętle w jego obrębie nie angażują systemowego licznika czasu.
Nie ma też obsługi komendy Sleep ;( wiec nie można przerwać pętli na jakiś czas.

Aby cyklicznie wywoływać pewne procesy ja podpiołem sie do procedury wew:
Kod: Zaznacz cały
Application_ItemSend(ByVal Item As Object, Cancel As Boolean)
Gdzie przekazywnie danych na serwer wymuszone jest po każdym wysłaniu wiadomości....
Trochę na około, ale nie znalazłem innego sposobu, który by był lekki dla użytkownika.

Jest kontrolka IeTimer jednakże jakoś nie udało mi sie na niej wykonać nic sensownego, stosownego do tego przypadku. (raz działa raz nie..)
Możesz spróbować.
Kod: Zaznacz cały
Private Sub odpal()
MsgBox "wywołane procedury po " & Forma.IeTimer1.Interval
End Sub

Private Sub Timer1_Timer()
   Static state As Integer
   
   If state = 1 Then
      state = 0
      odpal
      Forma.IeTimer1.Enabled = False
   Else
      state = 1
   End If
End Sub
Ustawiasz kontrolke na formie (jakiejkolwiek) ustawiasz wartość Interwal na 1000 lub 6000 (ms)

kontrolka do zassania
http://oskar.veracomp.pl/Pliki/IETimer_kontrolka.zip
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10348
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez pzpr2007 » Pt 26.10.2007 21:50

Dzięki za propozycje. Poszukam jeszcze innych rozwiązań - jak coś znajdę to napiszę. Myślałem ewentualnie o tym, żeby ustawić odbieranie poczty np. co 5 minut i pod to zdarzenie podpiąć moją procedurę.

Jeśli można to mam jeszcze jedno pytanie - chyba najtrudniejsze.

Potrzebuję przy eksporcie do Accessa zapisywać kopię każdego maila w tabeli. Do tej pory robiłem to z Accessa przez pobranie pliku z dysku i osadzenie w formularzu połaczonym z odpowiednią tabelą (tabelą co prawda SQL-ową, ale połączoną w Accessie). Szukałem długo, ale nie znalazłem sposobu na umieszczenie pliku w tabeli SQL prosto z kodu VB.
To moje stare rozwiązanie ewentualnie mogłoby pozostać, ale wolałbym nie pozostawiać Accessa włączonego, żeby co jakiś czas poszukiwał plików w folderze. Pytanie więc brzmi:

1. Czy można prosto z kodu VB Outlooka osadzić maila (z rozszerzeniem .msg) wprost w tabeli SQL? (linkowanie plików nie wchodzi w grę)

...ewentualnie...

2. Jak można w kodzie VB Outlooka wykorzystać formularz Assessowy?

...albo...

3. Jak zdalnie uruchomić w Accessie wykonanie konkretnego kodu (który to kod otworzy sobie w Accessie formularz, osadzi plik i zamknie formularz, żeby osadzić plik w tabeli SQL)?

Dodam, że mowa o Acessie 2003.
pzpr2007
 
Posty: 13
Dołączył(a): Cz 25.10.2007 10:29

Postprzez pzpr2007 » Pt 26.10.2007 23:01

OK, co do punktu trzeciego to jest to banalnie proste:

a) W referencjach VB zaznaczyć "Microsoft Access..."
b)
Kod: Zaznacz cały
Dim acApp as Access.Application
Set acApp = GetObject("c:\test.mdb", "Access.Application")
acApp.DoCmd.RunMacro ("test")


Połączenie z formularzem pewnie też.

(apropos cyklicznego powtarzania procedury - przyszło mi na myśl, że możnaby zdalnie przechwycić zdarzenie w formularzu accessowym: Form_Timer i podpiąć pod to wykonanie kodu w outlooku. Albo wykorzystać do tego celu to co wcześniej napisałeś:
Kod: Zaznacz cały
Application.OnTime Now + TimeValue("00:00:06"), "my_Procedure"

Co ty na to?)

Ale punkt 1-szy - osadzanie pliku w tabeli SQL wprost zkodu VB - to już jest zagwozdka, co?
Ostatnio edytowano So 27.10.2007 00:04 przez pzpr2007, łącznie edytowano 1 raz
pzpr2007
 
Posty: 13
Dołączył(a): Cz 25.10.2007 10:29

Postprzez OShon » Pt 26.10.2007 23:42

pzpr2007 napisał(a):ustawić odbieranie poczty np. co 5 minut i pod to zdarzenie podpiąć moją procedurę.

Niestety sie nie da. nie ma procedury zdarzeniowej pod odbieranie emaila. Prawdopodobnie to z winy możliwości wysyłania niepowołanych danych z wykorzystaniem Outlooka. Wiem że można by to obejść tworząc dodatek. Niestety sam nie mam w tym doświadczenia. Sam podpinam się dlatego pod wysyłanie wiadomości a nie jak zamierzałem pod połączeniem z serwerem podczas odbierania wiadomości.

pzpr2007 napisał(a):Czy można prosto z kodu VB Outlooka osadzić maila

Jeśli chodzi o treść to podobnie jak adresy
Kod: Zaznacz cały
mailCopy.Recipients(1).Body
Jeśli chodzi o całe msg to myślę że możesz spokojnie oprzeć się na zadaniu raz już opracowanego przez Michu http://www.outlook.pl/forum/viewtopic.php?t=601&highlight=msg


pzpr2007 napisał(a):...wprost w tabeli SQL

Sądzę że tak. Wystarczy na podstawie select Insert into wprowadzić dane do bazy.
Sam mam doświadczenie w Oracle'u ale znalazłem coś takiego: http://www.coderscity.net/ftopic6656.html&highlight=zapis+sql
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10348
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl

Postprzez michu » So 27.10.2007 10:14

Niestety sie nie da. nie ma procedury zdarzeniowej pod odbieranie emaila.

Tzn. dokładniej mówiąc jest zdarzenie, jeśli przychodzi nowa wiadomość. Nie ma zdarzenia, że Outlook uruchamia proces sprawdzania nowej poczty.

Można jeszcze zrobić pewien workaround. Utworzyć z poziomu kodu nowy termin w kalendarzu i ustawić mu czas przypomnienia na "za 5 minut". Potem korzystamy ze zdarzenia Application_Reminder. Jeśli widzimy, że to nasz reminder to:
1. Zmieniamy czas reminderowi, żeby powtórzył się znowu za 5 minut.
2. Wykonujemy swoją procedurę.

Oczywiście rozwiązanie doskonałe nie jest, użytkownik zawsze może nam naszego remindera wygrzebać i usunąć mu przypomnienie.

Ogólna zasada jest taka, że makra w Outlook'u są do wykonywania tylko prostych czynności. Dla bardziej skomplikowanych implementuje się COM Addiny. Osobiście bałbym się robić w Outlook'u coś poważniejszego przy pomocy makr :D
Pozdrawiam
Michu
michu
 
Posty: 4190
Dołączył(a): N 05.02.2006 17:49
Lokalizacja: Jelenia Góra

Postprzez OShon » So 27.10.2007 20:09

michu napisał(a):Osobiście bałbym się robić w Outlook'u coś poważniejszego przy pomocy makr :D

Zaśmiał się swoim szyderczym śmiechem... ;)
Obrazek
Oskar Shon - MVP Office Dev. 11/20, 3x MCC, 4/9/22 TechNet
Forum moderator: Outlook.pl | ExcelForum.pl | MSDN dział VBA
Zobacz fajne dodatki: Outlooka, Excela, Worda lub PowerPointa
OShon
 
Posty: 10348
Dołączył(a): Cz 19.10.2006 08:31
Lokalizacja: Projekt autorski VBATools.pl


Powrót do Microsoft Outlook

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości