python导出邮箱里的联系人,支持Gmail等
2009-12-15 09:01
351 查看
Python语言
: 导出邮箱里的联系人:支持Gmail,126,网易,搜狐,Hotmail,新浪,雅虎,MSN
#!/usr/bin/env python
#coding=utf-8
from
BeautifulSoup
import
BeautifulSoup
import
os
,
urllib
,
urllib2
,
pdb
import
cookielib
import
httplib
import
csv
,
re
GDATA_URL
=
'/accounts/ClientLogin'
class
MailContactError
(Exception
):
pass
class
MailContact
:
def
__init__
(self
,
username
,
password
):
pass
def
login
(self
):
pass
def
get_contacts
(self
):
pass
def
get_contact_page
(self
):
pass
class
GMailContact
(MailContact
):
"""
A class to retrieve a users contacts from their Google Account.
Dependencies:
-------------
* BeautifulSoup.
* That's it. :-)
Usage:
------
>>> g = GMailContact('email@example.org', 'password')
>>> g.login()
(200, 'OK')
>>> g.get_contacts()
>>> g.contacts
[(u'Persons Name', 'name@person.com'), ...]
"""
def
__init__
(self
,
username
=
'test@gmail.com'
,
password
=
'test'
,
service
=
'cp'
):
self
.
mail_type
=
"@gmail.com"
self
.
username
=
username
+
self
.
mail_type
self
.
password
=
password
self
.
account_type
=
'HOSTED_OR_GOOGLE'
# Allow both Google Domain and Gmail accounts
self
.
service
=
service
# Defaults to cp (contacts)
self
.
source
=
'google-data-import'
# Our application name
self
.
code
=
''
# Empty by default, populated by self.login()
self
.
contacts
=
[]
# Empty list by default, populated by self.get_contacts()
def
login
(self
):
"""
Login to Google. No arguments.
"""
data
=
urllib
.
urlencode
({
'accountType'
:
self
.
account_type
,
'Email'
:
self
.
username
,
'Passwd'
:
self
.
password
,
'service'
:
self
.
service
,
'source'
:
self
.
source
})
headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/plain'
}
conn
=
httplib
.
HTTPSConnection
('google.com'
)
conn
.
request
('POST'
,
GDATA_URL
,
data
,
headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
GdataError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
d
=
response
.
read
()
self
.
code
=
d
.
split
("
/n
"
)[
2
]
.
replace
('Auth='
,
''
)
conn
.
close
()
return
response
.
status
,
response
.
reason
def
_request
(self
,
max_results
=
200
):
"""
Base function for requesting the contacts. We'll allow other methods eventually
"""
url
=
'/m8/feeds/contacts/
%s
/base/?max-results=
%d
'
%
(self
.
username
,
max_results
)
headers
=
{
'Authorization'
:
'GoogleLogin auth=
%s
'
%
self
.
code
}
conn
=
httplib
.
HTTPConnection
('www.google.com'
)
conn
.
request
('GET'
,
url
,
headers
=
headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
,
max_results
=
200
):
""" Parses the contacts (using BeautifulSoup) from self._request, and then populates self.contacts
"""
soup
=
BeautifulSoup
(self
.
_request
(max_results
))
self
.
contacts
=
[]
for
entry
in
soup
.
findAll
('title'
):
if
len
(entry
.
parent
.
findAll
([
'gd:email'
,
'title'
]))
==
2
:
s =
entry
.
parent
.
findAll
([
'gd:email'
,
'title'
])
self
.
contacts
.
append
((s[
0
]
.
string
,
s[
1
]
.
get
('address'
)))
return
class
M126Contact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@126.com"
self
.
username
=
username
self
.
password
=
password
self
.
login_host
=
'entry.mail.126.com'
self
.
login_url
=
'/cgi/login?redirTempName=https.htm&hid=10010102&lightweight=1&verifycookie=1&language=0&style=-1'
self
.
login_data
=
urllib
.
urlencode
({
'domain'
:
'126.com'
,
'language'
:
0
,
'bCookie'
:
''
,
'user'
:
self
.
username
,
'pass'
:
self
.
password
,
'style'
:
-
1
,
'remUser'
:
''
,
'secure'
:
''
,
'enter.x'
:
'%B5%C7+%C2%BC'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Refer'
:
'http://www.126.com/'
}
self
.
contact_host
=
'g2a10.mail.126.com'
self
.
contact_url
=
'/coremail/fcg/ldvcapp?funcid=prtsearchres&sid=
%(sid)s
&listnum=200&tempname=address
%%
2faddress.htm'
def
login
(self
):
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
#sc="Coremail=aaYgsaQsvSmKa%MBgzxnddkKzjPJUTbMddRUIgVwfeiBUd; path=/; domain=.126.com"
#sid="MBgzxnddkKzjPJUTbMddRUIgVwfeiBUd"
sc
=
response
.
getheader
('Set-Cookie'
)
if
not
sc
or
sc
.
find
("Coremail"
) ==
-
1
:
#用户密码不正确
raise
MailContactError
("Email user
%s%s
password
%s
not correct!"
%
(self
.
username
,
self
.
mail_type
,
self
.
password
))
cookie
=
sc
.
split
()[
0
]
coremail
=
cookie
[
cookie
.
find
('='
)+
1
:
cookie
.
find
(';'
)]
sid
=
coremail
[
coremail
.
find
('%'
)+
1
:]
self
.
contact_url
=
self
.
contact_url
%
{
'sid'
:
sid
}
self
.
contact_headers
=
{
'Cookie'
:
'MAIL126_SSN=
%(user)s
; NETEASE_SSN=
%(user)s
; nts_mail_user=
%(user)s
; logType=df; ntes_mail_firstpage=normal;
/
Coremail=
%(coremail)s
;mail_host=g2a14.mail.126.com; mail_sid=
%(sid)s
; mail_uid=
%(user)s
@126.com;
/
mail_style=dm3; oulink_h=520; ntes_mail_noremember=true'
%
{
'user'
:
self
.
username
,
'coremail'
:
coremail
,
'sid'
:
sid
}
}
conn
.
close
()
def
get_contact_page
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
,
headers
=
self
.
contact_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
):
page
=
self
.
get_contact_page
()
self
.
contacts
=
[]
soup
=
BeautifulSoup
(page
)
xmps
=
soup
.
findAll
('xmp'
)
for
x
in
xmps
:
if
x
[
'id'
]
.
startswith
('t'
):
self
.
contacts
.
append
((x
.
contents
[
0
],
x
.
space
.
string
))
class
M163Contact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@163.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'reg.163.com'
self
.
login_url
=
'/logins.jsp?type=1&url=http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1'
self
.
login_data
=
urllib
.
urlencode
({
'verifycookie'
:
1
,
'style'
:
-
1
,
'product'
:
'mail163'
,
'username'
:
self
.
username
,
'password'
:
self
.
password
,
'selType'
:
-
1
,
'remUser'
:
''
,
'secure'
:
'on'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Refer'
:
'http://mail.163.com/'
}
self
.
contact_host
=
'g2a10.mail.163.com'
def
login
(self
):
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
sc1
=
response
.
getheader
('Set-Cookie'
)
'''
Set-Cookie:
NTES_SESS=ohAWkiyj.OCjHdh1BK4ToxPcUvFX2fSLaN3FaU0cRInzLoieELdifjyqnBdk4C8qWIZkirZ7.JF.IPFDuR7BcAtKL;
domain=.163.com; path=/
Set-Cookie: NETEASE_SSN=weafriend; domain=.163.com; path=/; expires=Mon, 08-Jun-2009 10:42:26 GMT
Set-Cookie: NETEASE_ADV=11&24&1212921746999; domain=.163.com; path=/; expires=Mon, 08-Jun-2009 10:42:26 GMT
'''
ntes_sess
,
ntes_adv
=
None
,
None
for
s in
sc1
.
split
():
if
s.
startswith
('NTES_SESS'
):
ntes_sess
=
s[
s.
find
('='
)+
1
:
s.
find
(';'
)]
elif
s.
startswith
('NETEASE_ADV'
):
ntes_adv
=
s[
s.
find
('='
)+
1
:
s.
find
(';'
)]
if
not
ntes_sess
or
not
ntes_adv
:
#用户密码不正确
raise
MailContactError
("Email user
%s%s
password
%s
not correct!"
%
(self
.
username
,
self
.
mail_type
,
self
.
password
))
url
=
'/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=weafriend'
headers
=
{
'cookie'
:
sc1
}
conn
=
httplib
.
HTTPConnection
('fm163.163.com'
)
conn
.
request
('GET'
,
url
,{},
headers
)
response
=
conn
.
getresponse
()
sc2
=
response
.
getheader
('Set-Cookie'
)
coremail
=
sc2
[
sc2
.
find
('='
)+
1
:
sc2
.
find
(';'
)]
sid
=
coremail
[
coremail
.
find
('%'
)+
1
:]
self
.
contact_url
=
'/coremail/fcg/ldvcapp?funcid=prtsearchres&sid='
+
sid
+
'&listnum=200&tempname=address
%2f
address.htm'
self
.
contact_headers
=
{
'Cookie'
:
'MAIL163_SSN=
%(user)s
; vjlast=1212911118; vjuids=-99d7a91f6.1156a6ea3cd.0.9e6d0e6f029e78;
/
_ntes_nuid=7118c6a1c9d16ee59a045a2e66186af8; NTES_adMenuNum=3;
/
_ntes_nnid=7118c6a1c9d16ee59a045a2e66186af8,0|www|urs|163mail|news|ent|sports|digi|lady|tech|stock|travel|music|2008|;
/
NTES_UFC=9110001100010000000000000000000000100000000000000002331026300000; logType=-1; nts_mail_user=weafriend:-1:1;
/
Province=010; _ntes_nvst=1212911122953,|www|urs|; Coremail=
%(coremail)s
; /
wmsvr_domain=g1a109.mail.163.com; ntes_mail_truename=; ntes_mail_province=; ntes_mail_sex=; mail_style=js3;
/
mail_host=g1a109.mail.163.com; mail_sid=
%(sid)s
; USERTRACK=58.31.69.214.1212911333143304;
/
ntes_mail_firstpage=normal; NTES_SESS=%(ntes_sess)s;
/
NETEASE_SSN=
%(user)s
; NETEASE_ADV=%(ntes_adv)s'
%
{
'user'
:
self
.
username
,
'coremail'
:
coremail
,
'sid'
:
sid
,
'ntes_sess'
:
ntes_sess
,
'ntes_adv'
:
ntes_adv
}
}
return
True
def
get_contact_page
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
,
headers
=
self
.
contact_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
):
page
=
self
.
get_contact_page
()
soup
=
BeautifulSoup
(page
)
xmps
=
soup
.
findAll
('xmp'
)
for
x
in
xmps
:
if
x
[
'id'
]
.
startswith
('t'
):
self
.
contacts
.
append
((x
.
contents
[
0
],
x
.
space
.
string
))
class
SohuContact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@sohu.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'passport.sohu.com'
self
.
login_url
=
'http://passport.sohu.com/login.jsp'
self
.
login_data
=
urllib
.
urlencode
({
'loginid'
:
self
.
username
+
self
.
mail_type
,
'passwd'
:
self
.
password
,
'sg'
:
'5175b065623bb194e85903f5e8c43386'
,
'eru'
:
'http://login.mail.sohu.com/login.php'
,
'ru'
:
'http://login.mail.sohu.com/login_comm.php'
,
'appid'
:
1000
,
'fl'
:
'1'
,
'ct'
:
1126084880
,
'vr'
:
'1|1'
})
self
.
login_headers
=
{
'User-agent'
:
'Opera/9.23'
,
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
}
opener
=
urllib2
.
build_opener
(urllib2
.
HTTPCookieProcessor
(cookielib
.
CookieJar
()))
urllib2
.
install_opener
(opener
)
self
.
contact_host
=
'www50.mail.sohu.com'
self
.
contact_url
=
'/webapp/contact'
def
login
(self
):
req
=
urllib2
.
Request
(self
.
login_url
,
self
.
login_data
)
conn
=
urllib2
.
urlopen
(req
)
self
.
contact_url
=
os
.
path
.
dirname
(conn
.
geturl
())+
'/contact'
def
get_contacts
(self
):
req
=
urllib2
.
Request
(self
.
contact_url
)
conn
=
urllib2
.
urlopen
(req
)
buf
=
conn
.
readlines
()
import
simplejson
info
=
simplejson
.
loads
(buf
[
0
])
for
i
in
info
[
'listString'
]:
self
.
contacts
.
append
((i
[
'name'
],
i
[
'email'
]))
class
HotmailContact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@hotmail.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'login.live.com'
self
.
login_url
=
'/ppsecure/post.srf?id=2'
self
.
login_data
=
urllib
.
urlencode
({
'login'
:
self
.
username
+
self
.
mail_type
,
'passwd'
:
self
.
password
,
'PPSX'
:
'Pass'
,
'LoginOption'
:
2
,
'PwdPad'
:
'IfYouAreReadingThisYouHaveTooMuchFreeTime'
[
0
:
-
len
(self
.
password
)],
'PPFT'
:
'B1S2dWnsGTFLpX9h8fxfE*ym5OABStpt0fjo%21YICXQOy1b
%21x
P4dRx8F1h1w6tR8ZyLP4h3TYGS8gSZGku3j7CxQ4poqr'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Cookie'
:
'CkTst=G1213457870062;
MobileProf=2AV3mTOwJEE8smIfIyq69wbCn08y6UX7910BtLhqTto2MYrNSBW5hhlEuGlMJdMwwGq1WcxtENCAI1JSyTNfrS23ArFLxDjBNk!xtbIj0iglbu8DQVg9TnSTPtHj975deR;
MUID=C2DC0F9324AA47DCB05CE14B989D89C2;
ANON=A=E81AEA51F927860B07BBA712FFFFFFFF&E=69f&W=2;
s_lastvisit=1213455335875; MH=MSFT;
wlidperf=throughput=2087.201125175809&latency=1.422;
MSPRequ=lt=1213455763&co=1&id=2;
MSPOK=uuid-d75c4c53-1b6e-433c-af95-c3c0175a48cd; CkTst=G1213455761093;
MSPPre=fenyon@hotmail.com; MSPCID=0f45e10de2ad38c9;
NAP=V=1.7&E=6b4&C=bKkGf4IbC96JLFhsoKyccKm1Kf7jjhX5I3C1ofjvyMoY3iI9j0b6gg&W=2;
MSPSoftVis=@:@;
BrowserSense=Win=1&Downlevel=0&WinIEOnly=0&Firefox=1&FirefoxVersion=2.0;
mktstate=U=&E=en-us; mkt1=norm=en-us; s_cc=true;
s_sq=%5B%5BB%5D%5D; MSPP3RD=3688532421'
,
'Referer'
:
'https://login.live.com/ppsecure/post.srf?id=2&bk=1213455763'
}
self
.
contact_host
=
'by120w.bay120.mail.live.com'
self
.
contact_url
=
'/mail/GetContacts.aspx'
def
getInputValue
(self
,
name
,
content
):
pass
def
login
(self
):
#
登录过程见http://blog.jiexoo.com/2008/05/21/%e7%94%a8httpclient%e8%8e%b7%e5
%8f%96hotmail%e8%81%94%e7%b3%bb%e4%ba%ba%e5%88%97%e8%a1%a8/
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('GET'
,
'login.srf?id=2'
)
response
=
conn
.
getresponse
()
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
print
page
def
get_contacts
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
print
page
class
SinaContact
(MailContact
):
pass
class
YahooContact
(MailContact
):
pass
class
MsnContact
(MailContact
):
pass
def
get_mailcontact
(user
,
password
,
mailtype
):
if
mailtype
==
"126.com"
:
g
=
M126Contact
(user
,
password
)
elif
mailtype
==
"163.com"
:
g
=
M163Contact
(user
,
password
)
elif
mailtype
==
"sohu.com"
:
g
=
SohuContact
(user
,
password
)
elif
mailtype
==
"hotmail.com"
:
g
=
HotmailContact
(user
,
password
)
elif
mailtype
==
"sina.com"
:
g
=
SinaContact
(user
,
password
)
elif
mailtype
==
"gmail.com"
:
g
=
GMailContact
(user
,
password
)
try
:
g
.
login
()
g
.
get_contacts
()
return
g
.
contacts
except
:
return
[]
def
get_csvcontact
(iter
):
contact
,
name
=
[],
None
reader
=
csv
.
reader
(iter
)
for
r
in
reader
:
for
c
in
r
:
if
not
c
or
not
len
(c
.
strip
()):
continue
m
=
re
.
search
('/w+@/w+(?:/./w+)+'
,
c
)
if
m
:
print
name
,
m
.
group
(0
)
contact
.
append
((name
,
m
.
group
(0
)))
break
else
:
name
=
c
return
contact
def
get_imcontact
(iter
):
contact
=
[]
reader
=
csv
.
reader
(iter
)
for
r
in
reader
:
for
c
in
r
:
m
=
re
.
search
('/w+@/w+(?:/./w+)+'
,
c
)
if
m
:
print
m
contact
.
append
((m
))
return
contact
if
__name__
==
'__main__'
:
pdb
.
set_trace
()
httplib
.
HTTPSConnection
.
debuglevel
=
1
httplib
.
HTTPConnection
.
debuglevel
=
1
g
=
GMailContact
('***'
,
'***'
)
g
.
login
()
g
.
get_contacts
()
print
g
.
contacts
g
=
M163ContactContact
('***'
,
'***'
)
g
.
login
()
g
.
get_contacts
()
print
g
.
contacts
: 导出邮箱里的联系人:支持Gmail,126,网易,搜狐,Hotmail,新浪,雅虎,MSN
#!/usr/bin/env python
#coding=utf-8
from
BeautifulSoup
import
BeautifulSoup
import
os
,
urllib
,
urllib2
,
pdb
import
cookielib
import
httplib
import
csv
,
re
GDATA_URL
=
'/accounts/ClientLogin'
class
MailContactError
(Exception
):
pass
class
MailContact
:
def
__init__
(self
,
username
,
password
):
pass
def
login
(self
):
pass
def
get_contacts
(self
):
pass
def
get_contact_page
(self
):
pass
class
GMailContact
(MailContact
):
"""
A class to retrieve a users contacts from their Google Account.
Dependencies:
-------------
* BeautifulSoup.
* That's it. :-)
Usage:
------
>>> g = GMailContact('email@example.org', 'password')
>>> g.login()
(200, 'OK')
>>> g.get_contacts()
>>> g.contacts
[(u'Persons Name', 'name@person.com'), ...]
"""
def
__init__
(self
,
username
=
'test@gmail.com'
,
password
=
'test'
,
service
=
'cp'
):
self
.
mail_type
=
"@gmail.com"
self
.
username
=
username
+
self
.
mail_type
self
.
password
=
password
self
.
account_type
=
'HOSTED_OR_GOOGLE'
# Allow both Google Domain and Gmail accounts
self
.
service
=
service
# Defaults to cp (contacts)
self
.
source
=
'google-data-import'
# Our application name
self
.
code
=
''
# Empty by default, populated by self.login()
self
.
contacts
=
[]
# Empty list by default, populated by self.get_contacts()
def
login
(self
):
"""
Login to Google. No arguments.
"""
data
=
urllib
.
urlencode
({
'accountType'
:
self
.
account_type
,
'Email'
:
self
.
username
,
'Passwd'
:
self
.
password
,
'service'
:
self
.
service
,
'source'
:
self
.
source
})
headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/plain'
}
conn
=
httplib
.
HTTPSConnection
('google.com'
)
conn
.
request
('POST'
,
GDATA_URL
,
data
,
headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
GdataError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
d
=
response
.
read
()
self
.
code
=
d
.
split
("
/n
"
)[
2
]
.
replace
('Auth='
,
''
)
conn
.
close
()
return
response
.
status
,
response
.
reason
def
_request
(self
,
max_results
=
200
):
"""
Base function for requesting the contacts. We'll allow other methods eventually
"""
url
=
'/m8/feeds/contacts/
%s
/base/?max-results=
%d
'
%
(self
.
username
,
max_results
)
headers
=
{
'Authorization'
:
'GoogleLogin auth=
%s
'
%
self
.
code
}
conn
=
httplib
.
HTTPConnection
('www.google.com'
)
conn
.
request
('GET'
,
url
,
headers
=
headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
,
max_results
=
200
):
""" Parses the contacts (using BeautifulSoup) from self._request, and then populates self.contacts
"""
soup
=
BeautifulSoup
(self
.
_request
(max_results
))
self
.
contacts
=
[]
for
entry
in
soup
.
findAll
('title'
):
if
len
(entry
.
parent
.
findAll
([
'gd:email'
,
'title'
]))
==
2
:
s =
entry
.
parent
.
findAll
([
'gd:email'
,
'title'
])
self
.
contacts
.
append
((s[
0
]
.
string
,
s[
1
]
.
get
('address'
)))
return
class
M126Contact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@126.com"
self
.
username
=
username
self
.
password
=
password
self
.
login_host
=
'entry.mail.126.com'
self
.
login_url
=
'/cgi/login?redirTempName=https.htm&hid=10010102&lightweight=1&verifycookie=1&language=0&style=-1'
self
.
login_data
=
urllib
.
urlencode
({
'domain'
:
'126.com'
,
'language'
:
0
,
'bCookie'
:
''
,
'user'
:
self
.
username
,
'pass'
:
self
.
password
,
'style'
:
-
1
,
'remUser'
:
''
,
'secure'
:
''
,
'enter.x'
:
'%B5%C7+%C2%BC'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Refer'
:
'http://www.126.com/'
}
self
.
contact_host
=
'g2a10.mail.126.com'
self
.
contact_url
=
'/coremail/fcg/ldvcapp?funcid=prtsearchres&sid=
%(sid)s
&listnum=200&tempname=address
%%
2faddress.htm'
def
login
(self
):
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
#sc="Coremail=aaYgsaQsvSmKa%MBgzxnddkKzjPJUTbMddRUIgVwfeiBUd; path=/; domain=.126.com"
#sid="MBgzxnddkKzjPJUTbMddRUIgVwfeiBUd"
sc
=
response
.
getheader
('Set-Cookie'
)
if
not
sc
or
sc
.
find
("Coremail"
) ==
-
1
:
#用户密码不正确
raise
MailContactError
("Email user
%s%s
password
%s
not correct!"
%
(self
.
username
,
self
.
mail_type
,
self
.
password
))
cookie
=
sc
.
split
()[
0
]
coremail
=
cookie
[
cookie
.
find
('='
)+
1
:
cookie
.
find
(';'
)]
sid
=
coremail
[
coremail
.
find
('%'
)+
1
:]
self
.
contact_url
=
self
.
contact_url
%
{
'sid'
:
sid
}
self
.
contact_headers
=
{
'Cookie'
:
'MAIL126_SSN=
%(user)s
; NETEASE_SSN=
%(user)s
; nts_mail_user=
%(user)s
; logType=df; ntes_mail_firstpage=normal;
/
Coremail=
%(coremail)s
;mail_host=g2a14.mail.126.com; mail_sid=
%(sid)s
; mail_uid=
%(user)s
@126.com;
/
mail_style=dm3; oulink_h=520; ntes_mail_noremember=true'
%
{
'user'
:
self
.
username
,
'coremail'
:
coremail
,
'sid'
:
sid
}
}
conn
.
close
()
def
get_contact_page
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
,
headers
=
self
.
contact_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
):
page
=
self
.
get_contact_page
()
self
.
contacts
=
[]
soup
=
BeautifulSoup
(page
)
xmps
=
soup
.
findAll
('xmp'
)
for
x
in
xmps
:
if
x
[
'id'
]
.
startswith
('t'
):
self
.
contacts
.
append
((x
.
contents
[
0
],
x
.
space
.
string
))
class
M163Contact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@163.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'reg.163.com'
self
.
login_url
=
'/logins.jsp?type=1&url=http://fm163.163.com/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1'
self
.
login_data
=
urllib
.
urlencode
({
'verifycookie'
:
1
,
'style'
:
-
1
,
'product'
:
'mail163'
,
'username'
:
self
.
username
,
'password'
:
self
.
password
,
'selType'
:
-
1
,
'remUser'
:
''
,
'secure'
:
'on'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Refer'
:
'http://mail.163.com/'
}
self
.
contact_host
=
'g2a10.mail.163.com'
def
login
(self
):
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't log in. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
sc1
=
response
.
getheader
('Set-Cookie'
)
'''
Set-Cookie:
NTES_SESS=ohAWkiyj.OCjHdh1BK4ToxPcUvFX2fSLaN3FaU0cRInzLoieELdifjyqnBdk4C8qWIZkirZ7.JF.IPFDuR7BcAtKL;
domain=.163.com; path=/
Set-Cookie: NETEASE_SSN=weafriend; domain=.163.com; path=/; expires=Mon, 08-Jun-2009 10:42:26 GMT
Set-Cookie: NETEASE_ADV=11&24&1212921746999; domain=.163.com; path=/; expires=Mon, 08-Jun-2009 10:42:26 GMT
'''
ntes_sess
,
ntes_adv
=
None
,
None
for
s in
sc1
.
split
():
if
s.
startswith
('NTES_SESS'
):
ntes_sess
=
s[
s.
find
('='
)+
1
:
s.
find
(';'
)]
elif
s.
startswith
('NETEASE_ADV'
):
ntes_adv
=
s[
s.
find
('='
)+
1
:
s.
find
(';'
)]
if
not
ntes_sess
or
not
ntes_adv
:
#用户密码不正确
raise
MailContactError
("Email user
%s%s
password
%s
not correct!"
%
(self
.
username
,
self
.
mail_type
,
self
.
password
))
url
=
'/coremail/fcg/ntesdoor2?lightweight=1&verifycookie=1&language=-1&style=-1&username=weafriend'
headers
=
{
'cookie'
:
sc1
}
conn
=
httplib
.
HTTPConnection
('fm163.163.com'
)
conn
.
request
('GET'
,
url
,{},
headers
)
response
=
conn
.
getresponse
()
sc2
=
response
.
getheader
('Set-Cookie'
)
coremail
=
sc2
[
sc2
.
find
('='
)+
1
:
sc2
.
find
(';'
)]
sid
=
coremail
[
coremail
.
find
('%'
)+
1
:]
self
.
contact_url
=
'/coremail/fcg/ldvcapp?funcid=prtsearchres&sid='
+
sid
+
'&listnum=200&tempname=address
%2f
address.htm'
self
.
contact_headers
=
{
'Cookie'
:
'MAIL163_SSN=
%(user)s
; vjlast=1212911118; vjuids=-99d7a91f6.1156a6ea3cd.0.9e6d0e6f029e78;
/
_ntes_nuid=7118c6a1c9d16ee59a045a2e66186af8; NTES_adMenuNum=3;
/
_ntes_nnid=7118c6a1c9d16ee59a045a2e66186af8,0|www|urs|163mail|news|ent|sports|digi|lady|tech|stock|travel|music|2008|;
/
NTES_UFC=9110001100010000000000000000000000100000000000000002331026300000; logType=-1; nts_mail_user=weafriend:-1:1;
/
Province=010; _ntes_nvst=1212911122953,|www|urs|; Coremail=
%(coremail)s
; /
wmsvr_domain=g1a109.mail.163.com; ntes_mail_truename=; ntes_mail_province=; ntes_mail_sex=; mail_style=js3;
/
mail_host=g1a109.mail.163.com; mail_sid=
%(sid)s
; USERTRACK=58.31.69.214.1212911333143304;
/
ntes_mail_firstpage=normal; NTES_SESS=%(ntes_sess)s;
/
NETEASE_SSN=
%(user)s
; NETEASE_ADV=%(ntes_adv)s'
%
{
'user'
:
self
.
username
,
'coremail'
:
coremail
,
'sid'
:
sid
,
'ntes_sess'
:
ntes_sess
,
'ntes_adv'
:
ntes_adv
}
}
return
True
def
get_contact_page
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
,
headers
=
self
.
contact_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
return
page
def
get_contacts
(self
):
page
=
self
.
get_contact_page
()
soup
=
BeautifulSoup
(page
)
xmps
=
soup
.
findAll
('xmp'
)
for
x
in
xmps
:
if
x
[
'id'
]
.
startswith
('t'
):
self
.
contacts
.
append
((x
.
contents
[
0
],
x
.
space
.
string
))
class
SohuContact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@sohu.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'passport.sohu.com'
self
.
login_url
=
'http://passport.sohu.com/login.jsp'
self
.
login_data
=
urllib
.
urlencode
({
'loginid'
:
self
.
username
+
self
.
mail_type
,
'passwd'
:
self
.
password
,
'sg'
:
'5175b065623bb194e85903f5e8c43386'
,
'eru'
:
'http://login.mail.sohu.com/login.php'
,
'ru'
:
'http://login.mail.sohu.com/login_comm.php'
,
'appid'
:
1000
,
'fl'
:
'1'
,
'ct'
:
1126084880
,
'vr'
:
'1|1'
})
self
.
login_headers
=
{
'User-agent'
:
'Opera/9.23'
,
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
}
opener
=
urllib2
.
build_opener
(urllib2
.
HTTPCookieProcessor
(cookielib
.
CookieJar
()))
urllib2
.
install_opener
(opener
)
self
.
contact_host
=
'www50.mail.sohu.com'
self
.
contact_url
=
'/webapp/contact'
def
login
(self
):
req
=
urllib2
.
Request
(self
.
login_url
,
self
.
login_data
)
conn
=
urllib2
.
urlopen
(req
)
self
.
contact_url
=
os
.
path
.
dirname
(conn
.
geturl
())+
'/contact'
def
get_contacts
(self
):
req
=
urllib2
.
Request
(self
.
contact_url
)
conn
=
urllib2
.
urlopen
(req
)
buf
=
conn
.
readlines
()
import
simplejson
info
=
simplejson
.
loads
(buf
[
0
])
for
i
in
info
[
'listString'
]:
self
.
contacts
.
append
((i
[
'name'
],
i
[
'email'
]))
class
HotmailContact
(MailContact
):
def
__init__
(self
,
username
,
password
):
self
.
mail_type
=
"@hotmail.com"
self
.
username
=
username
self
.
password
=
password
self
.
contacts
=
[]
self
.
login_host
=
'login.live.com'
self
.
login_url
=
'/ppsecure/post.srf?id=2'
self
.
login_data
=
urllib
.
urlencode
({
'login'
:
self
.
username
+
self
.
mail_type
,
'passwd'
:
self
.
password
,
'PPSX'
:
'Pass'
,
'LoginOption'
:
2
,
'PwdPad'
:
'IfYouAreReadingThisYouHaveTooMuchFreeTime'
[
0
:
-
len
(self
.
password
)],
'PPFT'
:
'B1S2dWnsGTFLpX9h8fxfE*ym5OABStpt0fjo%21YICXQOy1b
%21x
P4dRx8F1h1w6tR8ZyLP4h3TYGS8gSZGku3j7CxQ4poqr'
})
self
.
login_headers
=
{
'Content-type'
:
'application/x-www-form-urlencoded'
,
'Accept'
:
'text/xml,text/plain'
,
'Cookie'
:
'CkTst=G1213457870062;
MobileProf=2AV3mTOwJEE8smIfIyq69wbCn08y6UX7910BtLhqTto2MYrNSBW5hhlEuGlMJdMwwGq1WcxtENCAI1JSyTNfrS23ArFLxDjBNk!xtbIj0iglbu8DQVg9TnSTPtHj975deR;
MUID=C2DC0F9324AA47DCB05CE14B989D89C2;
ANON=A=E81AEA51F927860B07BBA712FFFFFFFF&E=69f&W=2;
s_lastvisit=1213455335875; MH=MSFT;
wlidperf=throughput=2087.201125175809&latency=1.422;
MSPRequ=lt=1213455763&co=1&id=2;
MSPOK=uuid-d75c4c53-1b6e-433c-af95-c3c0175a48cd; CkTst=G1213455761093;
MSPPre=fenyon@hotmail.com; MSPCID=0f45e10de2ad38c9;
NAP=V=1.7&E=6b4&C=bKkGf4IbC96JLFhsoKyccKm1Kf7jjhX5I3C1ofjvyMoY3iI9j0b6gg&W=2;
MSPSoftVis=@:@;
BrowserSense=Win=1&Downlevel=0&WinIEOnly=0&Firefox=1&FirefoxVersion=2.0;
mktstate=U=&E=en-us; mkt1=norm=en-us; s_cc=true;
s_sq=%5B%5BB%5D%5D; MSPP3RD=3688532421'
,
'Referer'
:
'https://login.live.com/ppsecure/post.srf?id=2&bk=1213455763'
}
self
.
contact_host
=
'by120w.bay120.mail.live.com'
self
.
contact_url
=
'/mail/GetContacts.aspx'
def
getInputValue
(self
,
name
,
content
):
pass
def
login
(self
):
#
登录过程见http://blog.jiexoo.com/2008/05/21/%e7%94%a8httpclient%e8%8e%b7%e5
%8f%96hotmail%e8%81%94%e7%b3%bb%e4%ba%ba%e5%88%97%e8%a1%a8/
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('GET'
,
'login.srf?id=2'
)
response
=
conn
.
getresponse
()
conn
=
httplib
.
HTTPSConnection
(self
.
login_host
)
conn
.
request
('POST'
,
self
.
login_url
,
self
.
login_data
,
self
.
login_headers
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
page
def
get_contacts
(self
):
conn
=
httplib
.
HTTPConnection
(self
.
contact_host
)
conn
.
request
('GET'
,
self
.
contact_url
)
response
=
conn
.
getresponse
()
if
not
str
(response
.
status
) ==
'200'
:
raise
MailContactError
("Couldn't getc contact page. HTTP Code:
%s
,
%s
"
%
(response
.
status
,
response
.
reason
))
page
=
response
.
read
()
conn
.
close
()
page
class
SinaContact
(MailContact
):
pass
class
YahooContact
(MailContact
):
pass
class
MsnContact
(MailContact
):
pass
def
get_mailcontact
(user
,
password
,
mailtype
):
if
mailtype
==
"126.com"
:
g
=
M126Contact
(user
,
password
)
elif
mailtype
==
"163.com"
:
g
=
M163Contact
(user
,
password
)
elif
mailtype
==
"sohu.com"
:
g
=
SohuContact
(user
,
password
)
elif
mailtype
==
"hotmail.com"
:
g
=
HotmailContact
(user
,
password
)
elif
mailtype
==
"sina.com"
:
g
=
SinaContact
(user
,
password
)
elif
mailtype
==
"gmail.com"
:
g
=
GMailContact
(user
,
password
)
try
:
g
.
login
()
g
.
get_contacts
()
return
g
.
contacts
except
:
return
[]
def
get_csvcontact
(iter
):
contact
,
name
=
[],
None
reader
=
csv
.
reader
(iter
)
for
r
in
reader
:
for
c
in
r
:
if
not
c
or
not
len
(c
.
strip
()):
continue
m
=
re
.
search
('/w+@/w+(?:/./w+)+'
,
c
)
if
m
:
name
,
m
.
group
(0
)
contact
.
append
((name
,
m
.
group
(0
)))
break
else
:
name
=
c
return
contact
def
get_imcontact
(iter
):
contact
=
[]
reader
=
csv
.
reader
(iter
)
for
r
in
reader
:
for
c
in
r
:
m
=
re
.
search
('/w+@/w+(?:/./w+)+'
,
c
)
if
m
:
m
contact
.
append
((m
))
return
contact
if
__name__
==
'__main__'
:
pdb
.
set_trace
()
httplib
.
HTTPSConnection
.
debuglevel
=
1
httplib
.
HTTPConnection
.
debuglevel
=
1
g
=
GMailContact
('***'
,
'***'
)
g
.
login
()
g
.
get_contacts
()
g
.
contacts
g
=
M163ContactContact
('***'
,
'***'
)
g
.
login
()
g
.
get_contacts
()
g
.
contacts
相关文章推荐
- python导出邮箱里的联系人,支持Gmail等
- 导出邮箱里的联系人:支持Gmail,126,网易,搜狐,Hotmail,新浪,雅虎,MSN
- 【原创作品】爱博QQ邮件搜索机 增强补丁V2.1 (包括试用版邮箱导出补丁) 支持最新版本的 Ver 2.4.0 Build 029
- python 支持自动群发测试报告邮件到指定的邮箱
- 将Gmail的联系人名单导出到ThunderBird
- 利用asp.net自带邮件组件 发送邮件,支持126,163,gmail,qq等邮箱
- 【原创作品】爱博QQ邮件搜索机 注册机 增强补丁V2.2 (包括试用版邮箱导出补丁) 支持最新版本的 Ver 2.5.2 Build 036
- PHP获取163、gmail、126等邮箱联系人地址【已测试2009.10.10】
- python根据nagios配置文件将监控的服务联系人等信息导出到excel表格
- 利用asp.net自带邮件组件 发送邮件,支持126,163,gmail,qq等邮箱
- 利用asp.net自带邮件组件 发送邮件,支持126,163,gmail,qq等邮箱
- Python执行sql语句并将结果导出为Excel打包发送到指定邮箱
- php 获取gmail 联系人邮箱,应用oauth2.0验证
- python mail 关于 gmail 163 实例程序 支持正文汉字 和发送附件
- 利用asp.net自带邮件组件 发送邮件,支持126,163,gmail,qq等邮箱
- 偶有50封Gmail邀请信,要的人留下邮箱
- outlook的导入及导出和联系人不能用
- 在线表格编辑器发布V11版本,新增对图表和纯前端PDF导出支持