Python实时获取贴吧邮箱名单并向其发送邮件
本人Python大菜鸟,今天用python写了一个脚本。主要功能是获取贴吧指定贴子评论中留下的邮箱,通过系统的crontab每一分钟自动检测新邮箱并向其发送邮件,检测机制是去查询数据库的记录,也就是不会向已经发送过的邮箱再次发送邮件(当然如果有人连续留下两次邮箱,脚本会不断给他发送邮件,直到有人留下了新邮箱地址,这个也算是脚本的bug吧,不过谁让你连续留两次呢)。
运行环境是python2.6,centos6.3 64位
主文件main.py脚本内容如下:
import mysql_class
import cookielib
from email.mime.text import MIMEText
from email.MIMEMultipart import MIMEMultipart
import sys,urllib2,string,re,time,smtplib,json
def sendsimplemail(content,List,subject):
today = time.strftime('%m-%d')
msg = MIMEText(content)
msg['Subject'] = today + "\t" + subject
msg['From'] = 'xxx@xxx.com'
try:
smtp = smtplib.SMTP()
smtp.connect(r'127.0.0.1')
smtp.login('tank', 'tank')
smtp.sendmail('xxx@xxx.com', List, msg.as_string())
smtp.close()
except Exception, e:
print e
db=mysql_class.mySqlConn()
resall=db.GetFetch("select * from config")
for res in resall:
tieba_id=str(res[0])
myUrl="http://tieba.baidu.com/p/"+tieba_id
minIndex=int(res[1])
lastmail=res[2]
firstPattern=re.compile(r'(\?pn=\d+)$')
myUrl=re.sub(firstPattern,'',myUrl)
try:
print(time.strftime('%Y-%m-%d-%H-%M-%S:',time.localtime(time.time())))
'''count the totalpage'''
cj = cookielib.CookieJar()
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
response=opener.open(myUrl)
myPage=response.read()
pagecount=re.compile(r'span class="red">(\d+)</span>')
match = pagecount.search(myPage)
if match:
totalpage=match.group(1)
maxIndex=int(totalpage)
'''count the mail addr'''
for i in range(minIndex,maxIndex+1):
index=myUrl.rfind(r'?pn=')
if index==-1:
myUrl=myUrl+r'?pn='+str(i)
else:
myUrl=re.sub(firstPattern,r'?pn='+str(i),myUrl)
print(myUrl)
response=opener.open(myUrl)
myPage=response.read()
myPage=myPage.decode('GBK')
myPage=myPage.replace(r'\r\n','')
if i == minIndex:
print 'go....'
lastmail_content=re.compile(lastmail+r'(.*)')
match = lastmail_content.search(myPage)
if match:
myPage=match.group(1)
else:
print 'not match'
pattern=re.compile(r'([a-zA-Z0-9]+@[a-zA-Z0-9]+\.?[a-zA-Z0-9]+\.+[a-zA-Z0-9]+)')
result=pattern.findall(myPage)
if result is not None:
#for email in result:
#print email
List = [email for email in result]
print List
file_object = open('/root/bin/tieba/mail_content.txt')
content=file_object.read()
file_object2 = open('/root/bin/tieba/mail_subject.txt')
subject=file_object2.read()
sendsimplemail(content,List,subject)
else:
print("not found")
if i == maxIndex:
lastmail=result[len(result)-1]
sql="UPDATE config SET pn_begin="+str(maxIndex)+",last_mail='"+str(lastmail)+"' WHERE tieba_id="+str(tieba_id)
db.Query(sql)
db.Close()
print('Suceed!!!')
except Exception as e:
print("something wrong or not new mailer")
其中用到了mysql_class,将python操作mysql写成一个类,放在同级目录下的mysql_class.py里(有一些方法没有用到),内容如下:
import MySQLdb
class mySqlConn:
"""This class is connect to mysql"""
def __init__(self, host="xxxxx", user="mail", password="mail123", db="mail"):
"""Construct function,
connect to mysql,
and set names utf8"""
self.__mqUser__ = user
self.__mqPass__ = password
self.__mqHost__ = host
self.__mqDb__ = db
try:
self.__conn__ = MySQLdb.Connect(user=self.__mqUser__, passwd=self.__mqPass__, host=self.__mqHost__, db=self.__mqDb__)
except:
print("Count not connect to MySQL server.")
exit(0)
self.__cursor__ = self.__conn__.cursor()
try:
self.__cursor__.execute("set names utf8")
except:
print("Excute `set names utf8` faild.")
exit(0)
def Query(self, sql):
""" Execute a sql """
try:
self.__cursor__.execute(sql)
except:
print(sql)
print("Sql excute faild!")
def GetMqCursor(self):
"""Get Mysql Cursor"""
return self.__cursor__
def GetFetchOne(self,sql):
"""Get fetch row"""
self.__cursor__.execute(sql)
return self.__cursor__.fetchone()
def GetFetch(self,sql):
"""Get fetch row"""
self.__cursor__.execute(sql)
return self.__cursor__.fetchall()
def Close(self):
"""Close the mysql connect"""
self.__conn__.commit()
self.__cursor__.close()
self.__conn__.close()
main.py还用到了发送邮件功能,邮件服务器是我自己搭建的postfix+saslauthed+cyrsu-imap,没时间自己弄邮件服务器的可以用第三方的发信功能(个人认为,没用Python测试过)。
数据库名mail,表名:config,表结构如下(主要是用来存放贴吧id,上次记录的帖子的最大页数,还有上次记录的最后一个邮箱):
| Field | Type | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| tieba_id | varchar(100) | NO | PRI | 1 | |
| pn_begin | int(11) | NO | | 1 | |
| last_mail | varchar(100) | NO | | | |
+-----------+--------------+------+-----+---------+-------+
另外发信的标题和内容我是放在文本里的,这样方便更新(也是因为我发现直接写在程序里会乱码,知道怎么解决的请留言告诉我哦,感激不尽)。
发信标题文本:mail_subject.txt,内容省略啦。
发信内容文本:mail_content.txt,内容省略啦。
脚本经过本人测试可行,qq邮箱可以发送,编码也没有问题,但是163邮箱貌似会乱码,有知道的朋友请指教。
-------------------------------------------------------黄金分割线-------------------------------------------------------------------
嘿嘿,其实我是向贴吧里的人推荐给力的VPN的,借此机会也向你们推荐一下哈,NydusVPN,目前俺用过的最给力的,有需要的朋友试试看:官网地址
Python实时获取贴吧邮箱名单并向其发送邮件的更多相关文章
- 使用Python实时获取cmd的输出
最近发现一个问题,一个小伙儿写的console程序不够健壮,监听SOCKET的时候容易崩,造成程序的整体奔溃,无奈他没有找到问题的解决办法,一直解决不了,可是这又是一个监控程序,还是比较要紧的,又必须 ...
- 用Python实时获取Steam特惠游戏数据,我看看谁的钱包还有钱
前言 大家好鸭, 我是小熊猫 Steam大家应该不陌生吧?不知道的话就让我们来了解一下吧~(一下简称"S") S是由美国电子游戏商Valve于2003年9月12日推出的数字发行平台 ...
- 这个帖子要收藏,以后用得着--python 实时获取子进程输出
在论坛上找到方法了,http://bbs.csdn.net/topics/340234292 http://blog.csdn.net/junshao90/article/details/821575 ...
- Python实时语音识别控制
代码地址如下:http://www.demodashi.com/demo/12946.html Python实时语音识别控制 概述 本文中的语音识别功能采用 百度语音识别库 ,首先利用 PyAudio ...
- 使用python发邮件(qq邮箱)
今天打算用QQ邮箱作为示例使用的邮箱,其他邮箱基本操作一样. 第一步:首先获取QQ邮箱授权码 1.进入QQ邮箱首页,点击设置,如图, 2.然后点击账户 3.拉到这个地方,开启POP3/SMTP服务服务 ...
- subprocess.Popen stdout重定向内容实时获取
python 打开一个新进程执行系统命令, test 执行完才能获取返回, test1 实时获取返回结果 import subprocess def test(cmd): p = subprocess ...
- PyQt学习随笔:Model/View中视图数据项编辑变动实时获取变动数据的方法
对于Model/View中视图的数据编辑后怎么能实时获取编辑的数据变动位置和变动情况查阅了一些资料,终于基本弄明白必须重写Model的setData方法才能截获.setData方法是视图中各种角色数据 ...
- 【NLP】Python NLTK获取文本语料和词汇资源
Python NLTK 获取文本语料和词汇资源 作者:白宁超 2016年11月7日13:15:24 摘要:NLTK是由宾夕法尼亚大学计算机和信息科学使用python语言实现的一种自然语言工具包,其收集 ...
- 使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接
使用python+xpath 获取https://pypi.python.org/pypi/lxml/2.3/的下载链接: 使用requests获取html后,分析html中的标签发现所需要的链接在& ...
随机推荐
- 问题解决_WCF_WCF 接收我服务的 HTTP 响应时发生错误
原文地址:http://www.cnblogs.com/tianma3798/p/5470974.html 错误内容: System.ServiceModel.CommunicationExcepti ...
- PL/SQL如何导入dmp文件
-------------创建表空间 create tablespace portal_data datafile'E:\OracleDB\System_TableSpace\portal_data0 ...
- C# 多线程线程池( 一 )
我们将在这里进一步讨论一些.NET类,以及他们在多线程编程中扮演的角色和怎么编程.它们是: System.Threading.ThreadPool 类 System.Threading.Timer 类 ...
- 思考力——提升企业竞争力的核心因素
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 · 思考力就是竞争力:在这个科技飞跃进步的时代,很多事物是我们未曾经历也难以预料的. ...
- Xcode7打包,iOS9真机闪退,如何解决?
问:有些项目用xcode7打开运行,打包安装到iOS9设备上程序会闪退. 如果用xcode7以下编译,然后打包到iOS9的设备上就是正常的.这是为什么,关键是,怎么解决? 答:iOS9发布之后,有些a ...
- 利用JAVA生成二维码
本文章整理于慕课网的学习视频<JAVA生成二维码>,如果想看视频内容请移步慕课网. 维基百科上对于二维码的解释. 二维条码是指在一维条码的基础上扩展出另一维具有可读性的条码,使用黑白矩形图 ...
- MacBook Pro/Air 下使用 linux ubuntu 系统 波浪号“~”变成其他 符号 的完美解决办法
打开终端,输入: sudo su - > /sys/module/hid_apple/parameters/iso_layout sudo su -需要root权限,所以使用前请注意已下载roo ...
- 用CMake屏蔽Release运行时的控制台窗口
在默认情况下,CMake构建的VS工程运行时会弹出控制台窗口,可以通过手动方式进行屏蔽,也可以通过CMake命令进行屏蔽. 手动方式:分为两步 第一步:右击VS项目,选择"属性"- ...
- DUBBO参数验证
public class ValidationParameter implements Serializable { private static final long seria ...
- git命令解析
一 常用命令 1..gitignore 文件为git忽略文件,例*.[oa] *.~ 为忽略.a或.o或.~结尾的文件./表示忽略目录,!表示反取, *表示匹配零个或者多个字符.?表示匹配一个字符. ...