用python 实现自动登录带验证码的163邮箱,并发送一封邮件给a.163.com
时间: 2023-06-27 18:08:07 浏览: 65
这个任务需要用到 Python 的 requests、selenium 和 smtplib 库。下面给出一个简单的实现步骤:
1. 安装相应的库。可以通过 pip install requests、pip install selenium 和 pip install smtplib 命令进行安装。
2. 使用 requests 库模拟登录 163 邮箱。首先需要获取登录页面的 URL,并发送 GET 请求获取页面的 HTML 代码。然后从 HTML 代码中解析出登录所需的参数,如用户名和密码等。接下来,使用 POST 请求模拟登录即可。
3. 对于带验证码的登录,可以使用 selenium 库模拟浏览器操作。首先需要下载对应浏览器的驱动程序,如 Chrome 的驱动程序 chromedriver。然后启动浏览器并访问登录页面,手动填写用户名和密码,并等待验证码出现。此时可以通过代码截取验证码图片,并使用第三方库如 pytesseract 进行识别,从而自动填写验证码。
4. 登录成功后,可以使用 requests 库发送一封邮件。首先需要获取发件人的邮箱地址和 SMTP 服务器地址,然后登录邮箱并发送邮件。
下面是一个示例代码,仅供参考:
```python
import requests
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 登录 163 邮箱
def login_163(username, password):
# 获取登录页面的 URL
url = 'https://mail.163.com/'
r = requests.get(url)
# 从 HTML 代码中解析出登录所需的参数
lt_pos = r.text.find('lt=') + 3
lt = r.text[lt_pos:lt_pos+56]
dllt = r.text[r.text.find('dllt=') + 5:r.text.find('lt=') - 1]
execution_pos = r.text.find('execution=') + 10
execution = r.text[execution_pos:execution_pos+4]
_eventId = 'submit'
rmShown = 1
# 构造登录请求的参数
data = {
'username': username,
'password': password,
'lt': lt,
'dllt': dllt,
'execution': execution,
'_eventId': _eventId,
'rmShown': rmShown
}
# 发送登录请求
session = requests.session()
session.post(url, data=data)
return session
# 使用 selenium 登录 163 邮箱(带验证码)
def login_163_with_captcha(username, password):
# 启动 Chrome 浏览器并访问登录页面
driver = webdriver.Chrome()
driver.get('https://mail.163.com/')
# 填写用户名和密码,并等待验证码出现
driver.find_element_by_name('email').send_keys(username)
driver.find_element_by_name('password').send_keys(password)
ActionChains(driver).move_to_element(driver.find_element_by_id('dom_id1')).click().perform()
driver.switch_to.frame(driver.find_element_by_xpath('//iframe[@id="loginIframe"]'))
driver.find_element_by_name('verifyCode').click()
# 截取验证码图片并使用 pytesseract 进行识别
captcha = driver.find_element_by_xpath('//img[@class="jigsaw"]')
captcha.screenshot('captcha.png')
# TODO: 使用 pytesseract 进行验证码识别并自动填写
# 点击登录按钮
driver.find_element_by_id('dologin').click()
# 等待登录完成
driver.implicitly_wait(3)
return driver
# 发送邮件
def send_email(session, from_addr, to_addr, subject, content):
# 获取发件人的邮箱地址和 SMTP 服务器地址
from_addr = from_addr
smtp_server = 'smtp.163.com'
# 登录邮箱
session.get('https://mail.163.com/')
session.get('https://mail.163.com/js6/main.jsp?sid=' + session.cookies['Coremail.sid'])
session.get('https://mail.163.com/js6/s?sid=' + session.cookies['Coremail.sid'] + '&func=mbox:compose')
# 构造邮件内容
message = MIMEText(content, 'plain', 'utf-8')
message['From'] = Header(from_addr, 'utf-8')
message['To'] = Header(to_addr, 'utf-8')
message['Subject'] = Header(subject, 'utf-8')
# 发送邮件
smtp = smtplib.SMTP(smtp_server, 25)
smtp.login(from_addr, password)
smtp.sendmail(from_addr, [to_addr], message.as_string())
smtp.quit()
if __name__ == '__main__':
# 使用 requests 模拟登录
session = login_163('your_username', 'your_password')
# 使用 selenium 模拟登录(带验证码)
# driver = login_163_with_captcha('your_username', 'your_password')
# 发送邮件
from_addr = 'your_email@163.com'
to_addr = 'a.163.com'
subject = 'Test Email'
content = 'This is a test email.'
send_email(session, from_addr, to_addr, subject, content)
```