[VBS] wysyłanie załącznika w mailu, Lista zainstalowanych pr

Witam.

Problem nr.1

Mam skrypt wysyłania maila i wszystko dobrze działa, ale jak chcę wysłać mailem załącznik takim kodem:

.AddAttachment "users.txt"

to wyskakuje taki błąd:

Co robić? Problem nr. 2 Mam taki kod:

Set oWS=CreateObject("Wscript.Shell") 

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objTextFile = objFSO.CreateTextFile(".\InstalledPrograms\install.txt", True)

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _

    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colSoftware = objWMIService.ExecQuery _

    ("Select * from Win32_Product")

objTextFile.WriteLine "Caption" & vbtab & _

    "Data instalacji" & vbtab & "Lokacja programu" & vbtab & _

    "Install State" & vbtab & "Nazwa" & vbtab & _ 

    "Vendor" & vbtab


For Each objSoftware in colSoftware

    objTextFile.WriteLine objSoftware.Caption & vbtab & _  

    objSoftware.InstallDate2 & vbtab & _

    objSoftware.InstallLocation & vbtab & _

    objSoftware.InstallState & vbtab & _

    objSoftware.Name & vbtab & _

    objSoftware.Vendor & vbtab

Next

wscript.echo "Lista została utworzona w pliku Install.txt w katalogu InstalledPrograms"

objTextFile.Close

oWS.Run "./InstalledPrograms/install.txt"

Chciałbym zrobić tak, żeby lista zainstalowanych programów była w zmiennej a nie w pliku tekstowym.

Add 2:

strComputer = "."

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colSoftware = objWMIService.ExecQuery("SELECT * FROM Win32_Product")


If colSoftware.Count > 0 Then


	result = "Caption" & vbtab & _

	"Data instalacji" & vbtab & _

	"Lokacja programu" & vbtab & _

	"Install State" & vbtab & _

	"Nazwa" & vbtab & _

	"Vendor" & vbCrLf


    For Each objSoftware in colSoftware

        result = result & objSoftware.Caption & vbtab & _

		objSoftware.InstallDate2 & vbtab & _

		objSoftware.InstallLocation & vbtab & _

		objSoftware.InstallState & vbtab & _

		objSoftware.Name & vbtab & _

		objSoftware.Vendor & vbCrLf

    Next


    WScript.Echo result

Else

    WScript.Echo "Nie można odczytać listy zainstalowanych programów na tym komputerze."

End If

Lista zainstalowanych programów jest w zmiennej result. Po zakończeniu działania skrypt wyświetla zawartość tej zmiennej tak więc wciąż możesz całą zawartość przesłać do pliku, np w ten sposób: cscript nazwaskryptu.vbs > “jakis plik (pelna sciezka musi zostac podana).txt”

Zerknij także na ten link http://msdn.microsoft.com/en-us/library/aa394378%28v=vs.85%29.aspx. Pokazuje jakie informacje możesz odczytać o danym programie.

Add 1:

Możesz pokazać kod?

EDIT: Z tego linku http://classicasp.aspfaq.com/email/why-does-cdo-message-give-800c000d-errors.html wynika, że musisz podać pełną ścieżkę do załącznika. Prawdopodobnie ścieżki względne nie działają.

mój kod wysyłania emaila jest taki:

Set objEmail = CreateObject("CDO.Message")



  with objEmail.Configuration.Fields

     .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2

     .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") ="poczta.o2.pl" 

     .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 587

     .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1

     .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "szypo@o2.pl"

     .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "hasło"

     .Update

  end with


  With objEmail

     .From = "szypo@prokonto.pl"

     .To = "szypo@tlen.pl"  

     .Subject = "tytuł"


     .Textbody = "tekst"

     .AddAttachament ("F:\V1\users.txt") 



   .Send

  end with

podałem pełną ścieżkę i itak mi nie wysyła załącznika. Może spróbować skorzystać z hotmail a nie z o2?

Dodane 10.03.2011 (Cz) 13:26

dzięki za listę programów w zmiennej.

Twój kod wysyłania wiadomości e-mail jest poprawny. Problem leży gdzieś indziej. Może jakiś firewall blokuje Ci skrypt?

Trochę tylko zmodyfikowałem ten kod, żeby używane było szyfrowanie w trakcie komunikacji z serwerem, ale to co masz też powinno działać.

Const cdoSendUsingPickup = 1 'Send message using the local SMTP service pickup directory. 

Const cdoSendUsingPort = 2 'Send the message using the network (SMTP over the network). 

Const cdoAnonymous = 0

Const cdoBasic = 1 'Clear text

Const cdoNTLM = 2 'NTLM


Set objEmail = CreateObject("CDO.Message")


With objEmail.Configuration.Fields

  .Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = cdoSendUsingPort

  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "poczta.o2.pl"

  .Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465

  .Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = true

  .Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic

  .Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "login"

  .Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "haslo"

  .Update

End With


With objEmail

  .From = ""

  .To = ""

  .Subject = "tytul"

  .TextBody = "tekst"

  .Addattachment "F:\V1\users.txt"

  .Send

End With


'Bezpieczne połączenia szyfrowane SSL (zalecane):

' Serwer poczty przychodzącej POP3 poczta.o2.pl Port: 995

' Serwer poczty wychodzącej SMTP poczta.o2.pl Port: 465


'Połączenie bez szyfrowania (nie zalecane):

' Serwer poczty przychodzącej POP3 poczta.o2.pl Port: 110

' Serwer poczty wychodzącej SMTP poczta.o2.pl Port: 587

jak używam tego z szyfrowaniem to mi w ogóle nie wysyła emaila

Specjalnie założyłem konto na o2.pl, żeby przetestować obie metody. I u mnie obie działają (z szyfrowaniem i bez). Wysyłałem testowy mail na skrzynkę o2 oraz wp. Ale jeśli u Ciebie nie działa to powinien pokazać się jakiś komunikat błędu. Jak możesz to go wrzuć. Może uda się ustalić co jest nie tak. Może to firewall? Może jakieś specyficzne ustawienia Twojej skrzynki pocztowej (ja testowałem na domyślnych)? Może nie można odczytać z dysku załącznika ze względu na brak uprawnień?

a u mnie skrypt dziala poprawnie gdy ustawiłem port poczty wychodzącej =25.

Na porcie 587 nie działa. Podobnie jest innymi kontami pocztowymi takimi jak: onet, interia.

Na. o2.pl działa też na porcie 465

Najwyraźniej można korzystać z trzech portów na serwerze o2.pl dla poczty wychodzącej, tj. 25 (który jest standardowym portem dla protokołu SMTP), 587 oraz 465 (który jest standardowym portem dla protokołu SMTPS). Port 587 został udostępniony także w przypadku poczty na onecie (być może również w przypadku poczty interii). Warto przeczytać ten komunikat http://poczta.onet.pl/oferta/komunikaty.html.

Skoro u Ciebie nie działa ten skrypt dla portu 587 to obstawiam, że to sprawka firewalla. Sprawdź, czy nie masz reguły, która blokuje ruch w sytuacji, gdy port docelowy to 587 (nie jest to port standardowy). Poza tym w trakcie wykonywania skryptu powinien był pojawić się jakiś komunikat.

A gdzie się ustawia port poczty wychodzącej?

na serwerze pocztowym.

Chodziło mi tylko o taką zmianę:

.Item(“http://schemas.microsoft.com/cdo/configuration/smtpserverport”) = 25

Dobra wszystko już działa. tylko nie da się jakoś ominąć tego żeby podawać pełną ścieżkę załącznika?

Nie da się. I sprawdź ten firewall, bo na porcie 587 też musi działać. Dodaj regułę zezwalająca na ruch, gdy port docelowy to 587. Możesz też wkleić komunikat błędu (co już zresztą pisałem). Zresztą najlepiej jakby Ci się udało uruchomić ten skrypt na porcie 465.

A jest jakaś zmienna środowiskowa , która podaje ścieżkę katalogu w którym uruchamiany jest ten skrypt? bo jak chcę to wrzucić na pendrive’a

I uruchamiać taki skrypt na innych komputerach to na każdym komputerze pendrive jest pod inną nazwą

Dodane 10.03.2011 (Cz) 21:01

ok już mi działa na porcie 587

Dodane 10.03.2011 (Cz) 21:03

tylko z tym katalogiem problem :confused: bo jak też komuś dam ten program to nie wiadomo w jakim katalogu ten ktoś umieści ten program i później będzie ten ktoś się mnie pytał dlaczego mu skrypt nie działa :confused:

.Addattachment Replace(WScript.ScriptFullName, WScript.ScriptName, "") & "users.txt"

Powyższy kod zadziała jeśli skrypt będzie w tym samym folderze co plik users.txt (w ten sposób możesz utworzyć taką pseudowzględną ścieżkę do pliku users.txt)

ok. działa. dzięki. A mogę wysłać kilka załączników naraz?

Nie ma za co. Powinno się dać. Spróbuj dla każdego załącznika wywołać metodę Addattachment.

Tu jest przykład: http://msdn.microsoft.com/en-us/library/aa493944%28v=exchg.80%29.aspx

dobra dzięki jeszcze raz za pomoc. Na pewno się przydała :slight_smile:

Dodane 14.03.2011 (Pn) 19:48

Mam problem. Uruchomiłem ten skrypt:

strComputer = "."

Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colSoftware = objWMIService.ExecQuery("SELECT * FROM Win32_Product")


If colSoftware.Count > 0 Then


   result = "Caption" & vbtab & _

   "Data instalacji" & vbtab & _

   "Lokacja programu" & vbtab & _

   "Install State" & vbtab & _

   "Nazwa" & vbtab & _

   "Vendor" & vbCrLf


    For Each objSoftware in colSoftware

        result = result & objSoftware.Caption & vbtab & _

      objSoftware.InstallDate2 & vbtab & _

      objSoftware.InstallLocation & vbtab & _

      objSoftware.InstallState & vbtab & _

      objSoftware.Name & vbtab & _

      objSoftware.Vendor & vbCrLf

    Next


    WScript.Echo result

Else

    WScript.Echo "Nie można odczytać listy zainstalowanych programów na tym komputerze."

End If

na innym komputerze i wyskakuje mi komunikat o błędzie rodzajowym. o co chodzi???

Jeszcze nie wiem. Podaj dokładny komunikat błędu i jaki system operacyjny jest zainstalowany na tamtym komputerze.

ok jak będę znowu na tym komputerze to podam komunikat