Dazoot Software

RSS 2.0
Catalin Constantin in How to, IT news | Niciun comentariu

Prezentare Newsman la OBF Pitesti 2009

În data de 29 septembrie 2009, la Hotel Campus (sala de conferinţe), Pitesti, a avut loc a doua editie a Online Business Forum, eveniment ce se doreşte a fi doar primul pas al unei serii de conferinţe pe termen lung, dedicate utilizării instrumentelor online în afaceri.

Picture 1253

In program a fost inclusa si o prezentare sustinuta de NewsMan: „Emailing pentru Publisheri și E-Commerce”, ce contine o lista cu principalele puncte ce trebuie atinse si de care trebuie tinut cont in momentul in care te decizi sa iti incluzi in modelul tau de business marketarea prin intermediul newsletterelor, si modul in care NewsMan le trateaza.

image001

Descarca gratuit prezentarea in format ppt:

newsmannou-091022033927-phpapp02-thumbnail-2
„Emailing pentru Publisheri și E-Commerce”

Pentru orice informatii referitoare la modalitati de trimitere a newsletterelor cu ajutorul NewsMan va rugam sa ne contactati.

Picture 1257

Picture 1252

Etichete: ,
Catalin Constantin in Code, How to | Niciun comentariu

Procesare bounce-uri in real time

De multe ori este important ca lista de utilizatori ai unui site sau de abonati la un newsletter sa fie “clean”. Prin clean ma refer in primul rand la eliminarea adreselor inexistente.
Conform RFC, erorile de tip 5.1.1 reprezinta erori permanente (Bad destination mailbox address). Daca toti ar fi RFC Compliant, totul ar fi foarte simplu, dar din pacate multe servere de mail (SMTP) au propriile error codes. Noi la Newsman.ro incercam sa “construim” o lista de mesaje de eroare parsabile care identifica o adresa de mail inexistenta. Solutia noastra este listata mai jos. Folosim Python, dar in mod sigur mesajele RAW email pot fi parsate si in alte limbaje de programare. De exemplu in PHP5 mesajele email pot fi parsate foarte bine si rapid folosind libraria Zend.

Python Bounce Detector:

import email, re
 
NO_USER_FOUND_MSGS = [
    "user unknown", # web.de
    "unknown local part", # web.de
    "user is unknown", # gmx.de
    "MAILBOX NOT FOUND", # aol.com
    "But, your recipient never logged onto their free AIM Mail account.", # aim.com by AOL
    re.compile("554 delivery error\: dd.*cannot be delivered.*disabled or discontinued.*yahoo", re.I), # yahoo
    re.compile("554 delivery error\: dd This user doesn\'t have a.*yahoo", re.I), # yahoo
    "Requested action not taken: mailbox unavailable", # hotmail
    "550 unrouteable address", # freenet.de
    "sorry, that mailbox isn't in my list of allowed mailboxes", # cabanova.com
    "551 not our customer", # att.net
    "Addressee unknown", # sbcglobal.net
    "user not found", # mail.ru
    "invalid mailbox", # mail.ru
    "No such user.", # k.ro
    "DOESN'T EXIST", # k.ro
    "no such mailbox", # qmail
    "No Such User", # text
    "No Such mailbox", # text
    "Unknown user", # easynet, text
    "Unknown mailbox", # text
    "Invalid recipient", # text
    "Recipient unknown", # text
    "No such email", # text, apropo.ro
    "No such mail", # text
    "unknown recipient", # text
    "No such person at this address", # as.ro
    "#5.1.0 Address rejected", # text
    re.compile("55\d sorry, no mailbox", re.I), # text, qmail
    "invalid address", # text
    "User account is unavailable", # text
    "Recipient not found", # text
    "User account is unavailable", # text
    "does not exist", # text
    "No account by that name here", # text
    "Mailbox is inactive", # text
    "Nonexistent user", # text
    "no mailbox here by that name", # text
    "mail not found", # text
    "Mailbox disabled", # text
    "No such recipient", # text
    "5.1.1", # text - freemail.hu
    ]
   
 
class NoDeliveryStatusException(Exception):
    pass
 
class WrongDeliveryStatusException(Exception):
    pass
   
class BounceParser:   
    def __init__(self, raw_msg=None):
        self.matched_msg = None
        if raw_msg is not None:
            self.parse(raw_msg)
   
    def parse(self, raw_msg):
        self._parsed = False
       
        self.status = None
        self.diagnostic_message = None
        self.action = None
       
        self.msg = email.message_from_string(raw_msg)
        self.dsmsg = None
        for part in self.msg.get_payload():
            if type(part) is str:
                raise NoDeliveryStatusException("No message/delivery-status part found.")
            if part.get_content_type() == "message/delivery-status":
                self.dsmsg = part
                break
        if self.dsmsg is None:
            raise NoDeliveryStatusException("No message/delivery-status part found.")
       
        if not self.dsmsg.is_multipart():
            self.status = self.dsmsg.get("Status", None)
            self.diagnostic_message = self.dsmsg.get("Diagnostic-Code", None)
            self.action = self.dsmsg.get("Action", None)
        else:
            for part in self.dsmsg.get_payload():
                if part.has_key("Status"):
                    self.status = part.get("Status")
                if part.has_key("Diagnostic-Code"):
                    self.diagnostic_message = part.get("Diagnostic-Code", None)
                if part.has_key("Action"):
                    self.action = part.get("Action", None)
       
        if self.status is None:
            raise WrongDeliveryStatusException("No Status: found in message/delivery-status part.")
        if self.action is None:
            raise WrongDeliveryStatusException("No Action: found in message/delivery-status part.")
        if self.diagnostic_message is not None:
            self.diagnostic_message = self.diagnostic_message.replace("\r", "").replace("\t", " ").replace("\n", " ")
       
        self._parsed = True
    
    def isParsed(self):
        return self._parsed
 
    def isFailed(self):
        return self.action.lower() == "failed"
    
    def is5xx(self):
        return self.status.find("5.") == 0
   
    def is4xx(self):
        return self.status.find("4.") == 0
   
    def getDiagnosticMessage(self):
        return self.diagnostic_message
   
    def isNoUserFound(self):
        if not self.isFailed():
            return False
       
        if not self.is5xx():
            return False
       
        if self.status == "5.1.1":
            # @see <a href="http://rfc.sunsite.dk/rfc/rfc2034.html">http://rfc.sunsite.dk/rfc/rfc2034.html</a>
            # 5.1.1 is always no such user / mailbox
            return True
       
        if self.diagnostic_message is None:
            # Missing diagnostig message =&gt; no can do parse :D
            return False
           
        diagnostic_message = self.diagnostic_message.lower().strip()
        for m in NO_USER_FOUND_MSGS:
            if type(m) is str:
                if diagnostic_message.find(m.lower()) != -1:
                    self.matched_msg = m
                    return True
            else:
                if m.search(diagnostic_message):
                    return True
       
        return False
   
    def getAction(self):
        return self.action
       
    def getStatus(self):
        return self.status
       
    def getMatchedMsg(self):
        return self.matched_msg

Dana Constantin in How to | Niciun comentariu

Spyware: Cum depistam daca suntem infectati?

Programele tip spyware si adware pot fi la fel de daunatoare si enervante ca si virusii de calculator putand provoca scaderi insemnate in performanta si lovind in dreptul nostru la mentinerea unui caracter privat al datelor stocate pe calculator prin trimiterea de informatii personale pe care nu dorim sa le impartasim cu nimeni. In plus ne mai trezim de multe ori si cu anunturi sau reclame tip pop-up deosebit de iritante mai ales atunci cand lucrezi la un proiect care necesita maxima concentrare.

Ne dam seama ca ceva nu e in regula si putem suspecta infectarea cu spyware si adware daca observam schimbari bruste in performantele calculatorului, aparitia unor ferestre pop-up, schimbari in bara de instrumente a browserului folosit in mod regulat sau icoane cu totul noi care apar pe Desktop sau sau in folderul My Documents. In aceasta situatie, pentru a fi siguri ca nu ne inselam, este intru totul recomandat sa instalam un program antispyware sau sa facem o scanare de rutina daca avem un program antivirus eficient care poate depista si elimina astfel de amenintari.

Din pacate piata programelor antispyware este atat de plina de oferte de tot felul incat este o sarcina grea sa identifici acele programe care sa faca o treaba buna fara a provoca conflicte cu antivirusul instalat anterior si fara a scadea simtitor performantele generale ale calculatorului prin alocarea de resurse pretioase. Unele astfel de programe sunt chiar ele purtatoare de tot felul de amenintari ascunse sub promisiunile autorilor ca veti scapa de spyware pentru totdeauna si nu va mai trebui sa va faceti probleme din acest punct de vedere. Un program bun antispyware este totusi necesar intotdeauna mai ales pentru cei care navigheaza in mod frecvent pe Internet deoarece antivirusul, oricat de performant ar fi, nu va reusi mereu sa elimine astfel de probleme sau macar sa le identifice ca amenintari serioase.

Cele mai bune programe antispyware de la ora actuala de pe piata sunt disponibile fie gratuit, direct de pe website-ul autorilor, fie contra unor preturi modice care pot fi platite de asemenea in regim online direct de pe website-ul producatorilor. Intr-o ordine aleatorie acestea sunt urmatoarele:

- Ad-Aware, produs de compania Lavasoft (gratuit pentru utilizatori casnici si contra-cost pentru uz comercial);

- Spybot Search and Destroy, produs de Safer Networking Ltd. (gratuit, oferit si in limba romana, cu invitatia de a dona sume de bani la alegere pentru a mentine proiectul viabil);

- Windows Defender, cunoscut in trecut ca Microsoft AntiSpyware, este probabil cel mai puternic antispyware de pe piata si vine integrat cu sistemele de operare Windows Vista si Windows 7, fiind disponibil prin download gratuit si pentru utilizatorii de Windows XP-Sp2 si Windows Server 2003 cu licenta genuina.

Articol preluat de pe egirl.ro


Catalin Constantin in How to | Niciun comentariu

Must have in optimizarea site-urilor LAMP

Nu de multe ori, VITEZA de incarcare a unui site PHP / MYSQL / Apache se poate reduce “vizibil” facand 3 mici chestii:
1. Activare compresie GZIP pentru content-ul TEXT (html, xml, plain text, css, javascript):
Exemplu pentru Apache:

LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so
AddOutputFilterByType DEFLATE text/html text/plain text/xml application/x-javascript text/css

2. Activare Opcode Cache penru PHP. Cel mai cuonscut optimizator pentru PHP este Eaccelerator.

3. Enable Mysql Query cache. In felul asta select-urile din tabele care NU s-au schimbat sunt retinute in “memorie”, in acest fel reducand server load-ul si viteza de raspuns.

Exemplu:

#
# * Query Cache Configuration
#
query_cache_limit = 1000M
query_cache_size = 1500M
query_cache_type = 1

Te poti astepta la:
- reducerea volumului de date transferate la Apache cu pana la 50%
- cresterea vitezei de raspuns a script-urilor PHP cu peste 200% (uneori chiar mai mult)


Catalin Constantin in How to | Niciun comentariu

Mini Book Shop in Symfony

Am lansat acum câteva zile pentru un client site-ul http://www.amsta.ro/. Un mini SHOP pentru cărţile editurii (puţine pentru moment).
Am avut 3 variante în realizarea shop-ului:
1. Folosire engine intern, Dazoot Shop:http://www.fisela.ro/
2. Implementare shop pe platforma open source (Magento Commerce)
3. From scratch în Symfony Framework

Timpul era FOARTE scurt din cauza târgului aşa că am ales varianta 3. A mers EXTREM de rapid development-ul, cu tot cu Admin şi optimizări SEO.
Concluzia: Vă recomand cu cea mai mare încredere: Symfony Framework.

Etichete: , ,
Pagina:12»