Időzített e-mail küldés Windows alól
2010-06-07T14:55:13+02:00
2010-07-29T10:24:11+02:00
2022-08-02T13:30:28+02:00
Tommy07
Sziasztok!

A következő probléma megoldásában kérném segítségeteket. WAMP szerver fut a számítógépemen, ami egy helyi hálózat egy munkaállomása. Egy webes alkalmazást futtatok ezen a Windows-os munkaállomásomon, melyet olyan funkcionalitással szeretnék felruházni, hogy naponta reggel 8 órakor lefusson egy php script, ami kapcsolódik egy adatbázishoz, majd a lekérdezésekből összeszedett adatok alapján bizonyos e-mail címekre üzenetet küld.

A problémám a következő: a levélküldés nem működik. Ha web böngészővel nyitom meg a script.php-t [a script, amit minden nap 8-kor szeretnék lefuttatni], tökéletesen lefut, az e-mailek kimennek. Ha azonban a Windows feladatütemezőjében felveszem a feladatot "C:\WAMP\PHP\PHP.EXE C:\WAMP\WWW\script.php" futtatási paranccsal, azt az üzenetet kapom DOS ablakban az ütemezett feladat azonnali lefuttatásakor, hogy nem tud kapcsolódni a localhost smtp szerverhez a 25ös porton, nézzem meg a php.ini-t, vagy a set_ini()-vel állítsam be a megfelelő változókat.
Ami érdekes, hogy a php.ini file-ban ezek mind be vannak állítva [hiszen másképp web-böngészőből futtatva nem futna le a script, nem mennének ki a levelek]. Ekkor a set_ini() segítségével beállítottam a szükséges változókat a forráskódban:

<?php ini_set("SMTP","xxx.xx"); ini_set("smtp_port","25"); ini_set("sendmail_from","xx@x.hu"); mail ("yy@y.hu","Próba levél","Levél szövege"); ?>

Így futtatva az ütemezett feladatot a következő üzenet jött a DOS-ablakban: nem tud csatlakozni az xxx.xx smtp-szerverhez a 25-ös porton, állítsam be a php.ini file-t, vagy használjam a set_ini() függvényt a forráskódban [tehát figyelembe vette a script-ben set_ini()-vel meghatározott beállításokat, mégsem tud csatlakozni az smtp-szerverhez].

Tehát fentiek mentén az volna a kérdésem, hogy miért van az, hogy web-böngészőben vígan lefut minden megfelelően, és ütemezett feladatként pedig nem.

Segítségeteket előre is nagyon köszönöm.

Üdvözlettel,
Tamás
Mutasd a teljes hozzászólást!
Szia!

Tehát fentiek mentén az volna a kérdésem, hogy miért van az, hogy web-böngészőben vígan lefut minden megfelelően, és ütemezett feladatként pedig nem.

Ha böngészőben vígan elfut, akkor ha jobb megoldás nem akad, akkor meg tudod hívni az url-t egy wget.exe-vel a windows feladatütemezőben beállítva a parancssort:
c:/path/to/wget.exe http://localhost/script.php

A wget.exe-t a netről tudsz tölteni.
Mutasd a teljes hozzászólást!

  • Nem akarok hulyeseget mondani, de ha jol emlekszem, akkor a WAMP CLI-kent mas php.ini-t hasznal. Ami 'default' az az apache konyvtaraban van, probald meg azt, hogy azt atmasolod a php.ini helyere, ami a php konyvtarban van. Persze keszits belole backupot elotte!
    Mutasd a teljes hozzászólást!
  • Szia Meow@!

    Köszi a választ. Megnéztem, valóban van egy "apache2" nevű könyvtár a wamp könyvtárban, ami tartalmaz egy php.ini file-t [ahogyan a wamp "PHP" nevű könyvtára is tartalmaz php.ini-t]. A két php.ini file tartalma eltérő. Nevezetesen az apache2 könyvtárban levő php.ini-ben ott volt a helyes beállítás az smtp-szerverre és annak portjára vonatkozóan, míg a PHP könyvtárban levő php.ini file-ban smtp szerverként "localhost" volt megadva, port pedig nem volt megadva.

    Gondoltam egyet, és beírtam a PHP könyvtárban levő php.ini-be is ezeket az smtp-re vonatkozó adatokat. Eredmény: ugyanaz, mint eddig.

    Próbaképp kiszedtem a script forráskódjából a set_ini()-s sorokat, melyekben külön beállítom az smtp-re vonatkozó elérési utat és portszámot. Így lefuttatva a script-et a feladatütemezőben az látszik, hogy ha nem használok set_ini()-t, akkor mivel a PHP könyvtárban található PHP.EXE-t paraméterezem a srcipt.php file elérési útjának megadásával, ezért a PHP könyvtárban levő php.ini file beállításait veszi figyelembe a php.exe, mikor php-filet futtat. Ennyivel "okosabb" :) lettem, de megoldás még nincs a problémára, továbbra sem érem el az SMTP-szervert a 25-ös porton feladatütemezőből futtatva a script-et, és továbbra is működik a script web-böngésző címsorába gépelve és indítva.

    Üdv,
    Tamás
    Mutasd a teljes hozzászólást!
  • http://prog.hu/tudastar/118134-8/Levelkuldes+PHP-bol+SMTP+hitelesite..

    ha nem akarod ilyen fsockopen()-esre és ha elküldöd az smtp szerver címét és a hozzáféréseket pm-ben, akkor összedobom neked c++ -ban az smtp átjárót. és utána működni fog (remélem) a következő php.ini beállításokkal is, ileltve nálam működik.

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
    új - karakterlánc (REG_SZ) - név (akarmi lehet) - érték (C:\ahova\rakod\program.exe)

    sendmail_from= SMTP=127.0.0.1 smtp_port=25
    Mutasd a teljes hozzászólást!
  • Szia, Péter!

    Köszönöm válaszodat és a hozzáállásodat is. Lehet, hogy az fsockopen()-es megoldást kipróbálom. A másik megoldás [SMTP-átjáró] bizonyos okok miatt nem járható, de hálás köszönet a felajánlásért.

    Egyelőre feldobtam cégünk IT-s szervezeti egységének a problémát, remélem, hamar előrukkolnak valamivel. Hiszen egy probléma van csak: CLI-n keresztül nem érem el az SMTP-szervert. Lehet, hogy ha ezt az elérést [ami talán biztonsági okok miatt tiltott] engedélyeznék, megoldódna a probléma. Persze csak ötletelek, egyelőre várom, mit mondanak. Emellett szerintem adhatok egy esélyt az Általad korábban megírt és belinkelt megoldásnak.

    Jelentkezem, ha van valami. Addig is, ha esetleg butaságo(ka)t írtam volna, valamit rosszul gondolok, vagy van valakinek mentő ötlete, várom.

    Üdv,
    Tamás
    Mutasd a teljes hozzászólást!
  • na mind1 ha mégis meggondolod magad itt a kód. tölts le egy dev-cpp -ot és csináld meg ezt a 2 fájlt notepad++ -ban vagy jegyzettömbben.

    mail.cpp
    #include <string> #include <winsock2.h> using namespace std; DWORD WINAPI receive_thread(LPVOID lpv){ string tmp,frm,snd,msg;int rcv,soc=(int)lpv;char buf[1024]; fd_set fds;FD_ZERO(&fds);FD_SET(soc,&fds); timeval tim;tim.tv_sec=0;tim.tv_usec=10000; send(soc,"220\r\n",5,0);recv(soc,buf,1024,0); send(soc,"250\r\n",5,0);rcv=recv(soc,buf,1024,0);tmp=buf;frm=tmp.substr(0,rcv); send(soc,"250\r\n",5,0);rcv=recv(soc,buf,1024,0);tmp=buf;snd=tmp.substr(0,rcv); send(soc,"250\r\n",5,0);recv(soc,buf,1024,0); send(soc,"354\r\n",5,0);while(rcv=recv(soc,buf,1024,0)){tmp=buf;msg+=tmp.substr(0,rcv);if(!select(soc,&fds,0,0,&tim)){break;}} send(soc,"250\r\n",5,0);recv(soc,buf,1024,0); send(soc,"221\r\n",5,0);closesocket(soc); sockaddr_in sai;sai.sin_family=2;sai.sin_port=6400; memcpy(&sai.sin_addr.s_addr,gethostbyname("smtp.hdsnet.hu")->h_addr,4); int som=socket(2,1,6);connect(som,(sockaddr*)&sai,16); recv(som,buf,1024,0);send(som,"EHLO x\r\n",8,0); recv(som,buf,1024,0);send(som,"AUTH LOGIN\r\n",12,0); recv(som,buf,1024,0);send(som,"***\r\n",***,0); recv(som,buf,1024,0);send(som,"***\r\n",***,0); recv(som,buf,1024,0);send(som,(char*)frm.c_str(),frm.length(),0); recv(som,buf,1024,0);send(som,(char*)snd.c_str(),snd.length(),0); recv(som,buf,1024,0);send(som,"DATA\r\n",6,0); recv(som,buf,1024,0);send(som,(char*)msg.c_str(),msg.length(),0); recv(som,buf,1024,0);send(som,"QUIT\r\n",6,0); recv(som,buf,1024,0);closesocket(som); return 0; } DWORD WINAPI accept_thread(LPVOID a){int b=16;while(CreateThread(0,0,receive_thread,(void*)accept((SOCKET)a,0,&b),0,0));return 0;} int main(){ WSADATA wsa;WSAStartup(0x0202,&wsa); sockaddr_in sai;sai.sin_family=2;sai.sin_port=21248;sai.sin_addr.s_addr=0; int soc=socket(2,1,6);bind(soc,(sockaddr*)&sai,16);listen(soc,1024); WaitForSingleObject(CreateThread(0,0,accept_thread,(void*)soc,0,0),INFINITE); }

    *** rész base64_encode(user) \r\n , *** ennek a hossza
    *** rész base64_encode(pass) \r\n , *** ennek a hossza

    Linker=-lws2_32
    Projekt Beállítások (Alt + P) => Típus: win32_gui
    smtp.hdsnet.hu -t pedig cseréld le a sajátodra.

    mail.dev
    [Project] FileName=mail.dev Name=mail UnitCount=1 Type=0 Ver=1 ObjFiles= Includes= Libs= PrivateResource=mail_private.rc ResourceIncludes= MakeIncludes= Compiler= CppCompiler= Linker=-lws2_32_@@_ IsCpp=1 Icon=mail.ico ExeOutput= ObjectOutput= OverrideOutput=0 OverrideOutputName=mail.exe HostApplication= Folders= CommandLine= UseCustomMakefile=0 CustomMakefile= IncludeVersionInfo=0 SupportXPThemes=0 CompilerSet=0 CompilerSettings=0000000001001000000000 [Unit1] FileName=mail.cpp CompileCpp=1 Folder= Compile=1 Link=1 Priority=1000 OverrideBuildCmd=0 BuildCmd= [VersionInfo] Major=0 Minor=1 Release=1 Build=1 LanguageID=1033 CharsetID=1252 CompanyName= FileVersion= FileDescription= InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion= AutoIncBuildNr=0
    Mutasd a teljes hozzászólást!
  • Már megint azzal a thread erdővel állsz elő?
    Mutasd a teljes hozzászólást!
  • na akkor mutass egy rendes kódot mester amúgy működik, csak nem lehet olyan rossz.
    Mutasd a teljes hozzászólást!
  • Én csak annyit kérek tőled, hogy mondd el azt, hogy hogyan állítod le ezt a csodaprogramot.

    Egyébként nem tudom mit ugrálsz, mert amiket itt írtál részben a fórumtagoktól ollóztad össze. Persze nem is tudom hányan figyelmeztettek, hogy jópár dolgot nem jól írsz, csak te nem vetted figyelembe. Hát ez van, a te dolgod, de akkor ne mutasd a hülyeségeidet másnak is, úgy mint egy mesterművet.
    Mutasd a teljes hozzászólást!
  • miért kéne leállítani?

    fent írtam hogy registry-be bekerűl és a system indítja.
    hát akkor gondolom én ez ebből következik, hogy mint egy szervíz folyamat addig fut amíg ki nem kapcsolod a gépet. tehát miért rakjak bele egy exit funkciót?

    nem szoktam ugrálni, bár ahogy nézem te műveltebbnek érzed magad, a hülyeségeimet pedig te írtad, hogy úgy ollóztam össze, így tehát nem az én hülyeségeim (hanem pl a tieid is?)

    és nem mestermű, de otthonra nekem jó működik. szerettem volna segíteni, (amíg egyesekről nem mondható el ugyanez) mert a kérdezőnek hasonló a gondja, mint nekem volt. ezért ez egy megoldás. de írtam másik megoldást is.

    a kódodat még mindig várom.
    Mutasd a teljes hozzászólást!
  • a kódodat még mindig várom.

    Gondolom nem ingyen.
    Mutasd a teljes hozzászólást!
  • Sziasztok!

    Egy alternatív megoldást találtam. Egyáltalán nem elegáns, sőt távol áll tőle: a PHP srcipt-et nem a PHP.EXE paraméterezésével hívom meg a Windows feladatütemezőjében, hanem - mivel ahogy korábban írtam, böngészőben szépen lefut a script - a számítógépen telepített egy böngésző [pl. Mozilla Firefox] futtatható állományának paraméterezésével [pl. "[path]\firefox.exe [path]\srcipt.php"]

    Ekkor elindul a megadott időben egy firefox böngésző ablak, amiben a script lefut, majd automatikusan bezáródik, mivel a feladatütemezőben megadtam, hogy a feladat futása az indítás után mennyi idővel érjen véget. A kis script pár mp alatt lefut, tehát még ha 30 percet is adok meg futtatás indítása utáni leállásnak, akkor is jó vagyok. Gagyi, de működik. Az IT-s kollegáim még nem válaszoltak a levelemre, melyben segítségüket kértem. Holnap rájuk kérdezek.

    Az ötleteket továbbra is köszönettel várom. Kellemes estét kívánok mindenkinek.

    Üdv,
    Tamás
    Mutasd a teljes hozzászólást!
  • mennyit kérsz érte?
    Mutasd a teljes hozzászólást!
  • Szia!

    Tehát fentiek mentén az volna a kérdésem, hogy miért van az, hogy web-böngészőben vígan lefut minden megfelelően, és ütemezett feladatként pedig nem.

    Ha böngészőben vígan elfut, akkor ha jobb megoldás nem akad, akkor meg tudod hívni az url-t egy wget.exe-vel a windows feladatütemezőben beállítva a parancssort:
    c:/path/to/wget.exe http://localhost/script.php

    A wget.exe-t a netről tudsz tölteni.
    Mutasd a teljes hozzászólást!
  • Szia, Oszi!

    Köszönöm az ötletet, utánanézek a wget.exe-nek. Sajna nem volt sok időm foglalkozni a témával, holnaptól meg nyaralás, úgyhogy amint tudok, visszajelzek, hogy működik-e a dolog. Köszönöm még egyszer.

    Üdv,
    Tamás
    Mutasd a teljes hozzászólást!
  • Szia, Oszi!

    Köszönöm szépen. Kipróbáltam, működik. Ez volt az az egyszerű megoldás, amire szükségem volt/van. Ott a pont! :)

    Szeretném megköszönni minden kedves hozzászóló segítségét is. Szép napot kívánok mindenkinek.

    Tisztelettel és üdvözlettel,
    Tamás
    Mutasd a teljes hozzászólást!
abcd