Exemple #1
0
Session = sessionmaker(bind=engine)
dbconn = Session()

em = '*****@*****.**'
em1 = '*****@*****.**'
em2 = '*****@*****.**'
em3 = '*****@*****.**'
em4 = '*****@*****.**'
em5 = '*****@*****.**'

msg = MIMEMultipart()
msg['From'] = '*****@*****.**'
msg['To'] = em
msg['Subject'] = '*** REPORT HD ***'
msg.set_charset('utf-8')
msg.set_default_type("text/html")
now = datetime.datetime.now()
delta1 = now + datetime.timedelta(days=-1)
mess = "<b>%s</b><br/>Задачи, закрытые за %s.<br/>" % (
    now.strftime('%Y-%m-%d %H:%M'), delta1.strftime('%Y-%m-%d'))
mess += """
<br>
<table border='1' cellpadding="0" cellspacing="0" ><tr><td>Исполнитель</td><td>Задачи</td></tr><tr><td colspan='2'>HELPDESK</td></tr>
"""
do = False
for email, profile_id, fio in dbconn.query(
        Userprofile.email, Userprofile.id, Userprofile.fio
):  #.filter(sqlalchemy.or_(Userprofile.system_id == 2, Userprofile.id.in_((54, 29, 30, 31)))):
    threads = [
        str(r[0]) for r in dbconn.query(Threads.id_global).filter(
            Threads.closed_by_id == profile_id).filter(
Exemple #2
0
def parse_and_deliver(maildir, url, statedir):
    feedhandle = None
    headers = None
    # first check if we know about this feed already
    feeddb = dbm.open(os.path.join(statedir, "feeds"), "c")
    if feeddb.has_key(url):
        data = feeddb[url]
        data = cgi.parse_qs(data)
        response = open_url("HEAD", url)
        headers = None
        if response:
            headers = response.getheaders()
        ischanged = False
        try:
            for header in headers:
                if header[0] == "content-length":
                    if header[1] != data["content-length"][0]:
                        ischanged = True
                elif header[0] == "etag":
                    if header[1] != data["etag"][0]:
                        ischanged = True
                elif header[0] == "last-modified":
                    if header[1] != data["last-modified"][0]:
                        ischanged = True
                elif header[0] == "content-md5":
                    if header[1] != data["content-md5"][0]:
                        ischanged = True
        except:
            ischanged = True
        if ischanged:
            response = open_url("GET", url)
            if response != None:
                headers = response.getheaders()
                feedhandle = response
            else:
                sys.stderr.write("Failed to fetch feed: %s\n" % (url))
                return
        else:
            return  # don't need to do anything, nothings changed.
    else:
        response = open_url("GET", url)
        if response != None:
            headers = response.getheaders()
            feedhandle = response
        else:
            sys.stderr.write("Failed to fetch feed: %s\n" % (url))
            return

    fp = feedparser.parse(feedhandle)
    db = dbm.open(os.path.join(statedir, "seen"), "c")
    for item in fp["items"]:
        # have we seen it before?
        # need to work out what the content is first...

        if item.has_key("content"):
            content = item["content"][0]["value"]
        else:
            if item.has_key("description"):
                content = item["description"]
            else:
                content = u""

        md5sum = md5.md5(content.encode("utf-8")).hexdigest()

        # make sure content is unicode encoded
        if not isinstance(content, unicode):
            cd_res = chardet.detect(content)
            chrset = cd_res["encoding"]
            print "detected charset %s for item %s" % (chrset, item["link"])
            content = content.decode(chrset)

        prevmessageid = None

        db_guid_key = None
        db_link_key = (url + u"|" + item["link"]).encode("utf-8")

        # check if there's a guid too - if that exists and we match the md5,
        # return
        if item.has_key("guid"):
            db_guid_key = (url + u"|" + item["guid"]).encode("utf-8")
            if db.has_key(db_guid_key):
                data = db[db_guid_key]
                data = cgi.parse_qs(data)
                if data["contentmd5"][0] == md5sum:
                    continue

        if db.has_key(db_link_key):
            data = db[db_link_key]
            data = cgi.parse_qs(data)
            if data.has_key("message-id"):
                prevmessageid = data["message-id"][0]
            if data["contentmd5"][0] == md5sum:
                continue

        try:
            author = item["author"]
        except:
            author = url

        # create a basic email message
        msg = MIMEMultipart("alternative")
        messageid = (
            "<"
            + datetime.datetime.now().strftime("%Y%m%d%H%M")
            + "."
            + "".join([random.choice(string.ascii_letters + string.digits) for a in range(0, 6)])
            + "@"
            + socket.gethostname()
            + ">"
        )
        msg.add_header("Message-ID", messageid)
        msg.set_unixfrom('"%s" <rss2maildir@localhost>' % (url))
        msg.add_header("From", '"%s" <rss2maildir@localhost>' % (author.encode("utf-8")))
        msg.add_header("To", '"%s" <rss2maildir@localhost>' % (url.encode("utf-8")))
        if prevmessageid:
            msg.add_header("References", prevmessageid)
        createddate = datetime.datetime.now().strftime("%a, %e %b %Y %T -0000")
        try:
            createddate = datetime.datetime(*item["updated_parsed"][0:6]).strftime("%a, %e %b %Y %T -0000")
        except:
            pass
        msg.add_header("Date", createddate)
        msg.add_header("X-rss2maildir-rundate", datetime.datetime.now().strftime("%a, %e %b %Y %T -0000"))
        title = html.fromstring(item["title"]).text
        title = re.sub(u"<", u"&lt;", title)
        title = re.sub(u">", u"&gt;", title)
        msg.add_header("Subject", str(Header(title.encode("utf-8"), "utf-8")))
        msg.set_default_type("text/plain")

        htmlcontent = content.encode("utf-8")
        htmlcontent = "%s\n\n<p>Item URL: <a href='%s'>%s</a></p>" % (content, item["link"], item["link"])
        htmlpart = MIMEText(htmlcontent.encode("utf-8"), "html", "utf-8")
        msg.attach(htmlpart)

        # start by working out the filename we should be writting to, we do
        # this following the normal maildir style rules
        fname = (
            str(os.getpid())
            + "."
            + socket.gethostname()
            + "."
            + "".join([random.choice(string.ascii_letters + string.digits) for a in range(0, 10)])
            + "."
            + datetime.datetime.now().strftime("%s")
        )
        fn = os.path.join(maildir, "tmp", fname)
        fh = open(fn, "w")
        fh.write(msg.as_string())
        fh.close()
        # now move it in to the new directory
        newfn = os.path.join(maildir, "new", fname)
        os.link(fn, newfn)
        os.unlink(fn)

        # now add to the database about the item
        if prevmessageid:
            messageid = prevmessageid + " " + messageid
        if item.has_key("guid") and item["guid"] != item["link"]:
            data = urllib.urlencode((("message-id", messageid), ("created", createddate), ("contentmd5", md5sum)))
            db[db_guid_key] = data
            try:
                data = db[db_link_key]
                data = cgi.parse_qs(data)
                newdata = urllib.urlencode(
                    (("message-id", messageid), ("created", data["created"][0]), ("contentmd5", data["contentmd5"][0]))
                )
                db[db_link_key] = newdata
            except:
                db[db_link_key] = data
        else:
            data = urllib.urlencode((("message-id", messageid), ("created", createddate), ("contentmd5", md5sum)))
            db[db_link_key] = data

    if headers:
        data = []
        for header in headers:
            if header[0] in ["content-md5", "etag", "last-modified", "content-length"]:
                data.append((header[0], header[1]))
        if len(data) > 0:
            data = urllib.urlencode(data)
            feeddb[url] = data

    db.close()
    feeddb.close()