zoukankan      html  css  js  c++  java
  • 登录公司网易邮箱,发邮件

    一、发送文本类型的邮件

          踩坑:   

    1、使用selenium定位时,使用某一种方法无法定位到,所以多种定位交叉使用

      先从最近的一层开始找,逐渐向外层查,从可以定位的那一层开始,一层一层缩小范围查找,可使用class/id+xpath的方法

     2、输入框下拉列表遮挡下一个输入框,如下图效果

      在【收件人】输入框输入内容,会有下拉框展示相关的搜索结果,输入完毕,往【主题】输入框输入内容时,因为被这个下拉框遮挡,无法定位到【主题】的输入框

      实际操作发现,只要再点击一下【收件人】输入框,这个下拉框就会收起

      所以直接再去click一下【收件人】输入框就行:如下、

    3、邮件内容的输入框是在一个ifrme内,无法直接定位到

      参考文档:selenium之如何定位iframe中的元素 

      ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作,此处用到了新的知识点:

      switch_to.frame() # 切换到iframe中
      # 中间操作iframe中的元素,操作完成还要退出
      switch_to.default_content() # 退出iframe

    看下网页的源代码:

    按照上述思路写代码:

     4、发送的邮件收不到

    在pycharm中执行代码后可以收到邮件,但是在本地的终端执行代码后,无法收到邮件

    首先,去发件人的邮箱【已发送】查看,发现收件人的名字缺失不完整

    解决方法:把代码中的  .strip()   去掉了之后就可以了,具体为什么,到现在还没有找到原因,欢迎留言指正

    收件人名字完整之后,还是收不到部分邮件,在【已发送】列表显示该邮件是正在发送状态,查阅资料后发现,这种情况可能是收件人的邮箱设置了黑名单,或者邮箱自动过滤了垃圾邮件

    解决方法:打开收件人的邮箱,设置中找到收信白名单,将发件人的邮箱加入到白名单中

     踩坑结束,终于发出了第一封正儿八经的邮件

    '''
    
    初级版本:
        登录公司网易邮箱,向指定对象发送文本类型的邮件
    思路:
        1、登录邮箱
        2、点击【写信】
        3、输入收件人、标题、内容
        4、点击【发送】
    
    '''
    
    import time
    import datetime
    from selenium import webdriver
    
    
    
    # 登录网易邮箱
    def longin(url, username, password):
        
        # 进入登录页面
        driver.get(url=url)
        
        # 登录
        driver.find_element_by_id('accname').send_keys(username)  # 输入用户名
        driver.find_element_by_id('accpwd').send_keys(password)  # 输入用户名
        driver.find_element_by_class_name('loginbtn').submit()  # 点击登录BTN
        
        
    # 写邮件并发送
    def send_email(title, addressee, msg):
        
        try:
            # 先登录
            longin(url, username, password)
            
            # 1、点击【写信】
            driver.find_element_by_class_name('p-edit').click()
            
            '''
            2、输入收件人和标题
               定位时使用某一种方法无法定位到,所以多种定位交叉使用
            '''
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').send_keys(addressee)  # 输入收件人
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').click()  # 点击一下收件人输入框,避免下拉框遮挡主题输入框
            driver.find_element_by_class_name('subject').find_element_by_tag_name('input').send_keys(title)  # 输入主题
            
            '''
            3、输入邮件内容(只有文本)
               因为文本框是在ifrme内的,ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作
            '''
            iframe = driver.find_element_by_id('ueditor_0')  # 先获取iframe
            driver.switch_to.frame(iframe)  # 切换到iframe中
            driver.find_element_by_xpath('/html/body').send_keys(msg)  # 在ifrme中操作元素,因为没有id也没有class,所以使用xpath
            driver.switch_to.default_content()  # 切换到iframe上之后,就无法对iframe以外的元素进行操作了,我们需要退出iframe再继续
            
            # 点击【发送】
            driver.find_element_by_id('main').find_element_by_class_name('g-mnc').find_element_by_xpath(
                '//*[@class="g-mnc"]/div[1]/div[1]/div[1]/div[1]').click()
            
        finally:
            time.sleep(3)
            driver.close()  # 不管之前能否成功发送邮件,最后都关闭浏览器
    
    
    if __name__ == '__main__':
        
        chrome = r'XXX/chromedriver'  # chrome驱动文件的路径
        
        url = 'https://qiye.163.com/login/?from=ym'                         # 邮箱地址
        username = 'XXXXXXXXXXXXXXXXXXXX'                                   # 邮箱账号
        password = 'XXXXXXXXX'                                              # 邮箱密码
        title = '测试邮件,收到请忽略'                                         # 邮件标题
        addressee = 'XXXXXXXXXXXXXXXX'                                      # 收件人邮箱
        '''
        邮件内容
            datetime.datetime.now() 当前时间小数点后还有6位
            datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 当前时间,只精确到秒
        '''
        msg = '最好等待5s再点击【发送】,否则可能会被定为垃圾邮件
    {}'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        
        driver = webdriver.Chrome(executable_path=chrome)  # 获取到driver
        driver.implicitly_wait(3)   # 设置全局的隐式等待,超出3s未找到元素,则报异常
        send_email(title, addressee, msg)
    单个收件人,纯文本内容

    注意:      快速且频繁的发送,可能会被认定为垃圾邮件,如果不被认定为垃圾邮件,收件时间会延迟几分钟甚至几小时

    解决方法:1、可以在点击【发送】按钮之前等待6s,但是会影响用例执行的速度,多个邮件发送可能会报错

           2、 建议邮件标题不要相同或者收件人在【垃圾邮件】中查找

    二、进化版:用户名、密码、收件人无需写在代码里,执行文件的时候可输入

    先上代码

    '''
    
    初级版本:
        登录公司网易邮箱,向指定对象发送文本类型的邮件
    思路:
        1、登录邮箱
        2、点击【写信】
        3、输入收件人、标题、内容
        4、点击【发送】
    
    '''
    
    import time
    import datetime  # 获取当前时间
    from getpass import getpass  # 密文显示输入的密码
    from selenium import webdriver
    
    
    # 登录网易邮箱
    def longin(url, username, password):
        # 进入登录页面
        driver.get(url=url)
        
        # 登录
        driver.find_element_by_id('accname').send_keys(username)  # 输入用户名
        driver.find_element_by_id('accpwd').send_keys(password)  # 输入用户名
        driver.find_element_by_class_name('loginbtn').submit()  # 点击登录BTN
    
    
    # 写邮件并发送
    def send_email(title, addressee, msg):
        try:
            # 先登录
            longin(url, username, password)
            
            # 1、点击【写信】
            driver.find_element_by_class_name('p-edit').click()
            
            '''
            2、输入收件人和标题
               定位时使用某一种方法无法定位到,所以多种定位交叉使用
            '''
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').send_keys(addressee)  # 输入收件人
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').click()  # 点击一下收件人输入框,避免下拉框遮挡主题输入框
            driver.find_element_by_class_name('subject').find_element_by_tag_name('input').send_keys(title)  # 输入主题
            
            '''
            3、输入邮件内容(只有文本)
               因为文本框是在ifrme内的,ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作
            '''
            iframe = driver.find_element_by_id('ueditor_0')  # 先获取iframe,定位到它所在的位置
            driver.switch_to.frame(iframe)  # 切换到iframe中
            driver.find_element_by_xpath('/html/body').send_keys(msg)  # 在ifrme中操作元素,因为没有id也没有class,所以使用xpath
            driver.switch_to.default_content()  # 切换到iframe上之后,就无法对iframe以外的元素进行操作了,我们需要退出iframe再继续
            
            # 点击【发送】
            driver.find_element_by_id('main').find_element_by_class_name('g-mnc').find_element_by_xpath(
                '//*[@class="g-mnc"]/div[1]/div[1]/div[1]/div[1]').click()
        
        finally:
            time.sleep(3)
            driver.close()  # 不管之前能否成功发送邮件,最后都关闭浏览器
    
    
    if __name__ == '__main__':
        chrome = r'/Users/chensihan/Downloads/chromedriver'  # chrome驱动文件的路径
        
        url = 'https://qiye.163.com/login/?from=ym'  # 邮箱地址
        username = input('用户名:').strip()  # 邮箱账号
        password = getpass('密码:').strip()   # 邮箱密码
        
        title = '测试邮件,收到请忽略'  # 邮件标题
        addressee = input('收件人邮箱:').strip()  # 收件人邮箱
        '''
        邮件内容
            datetime.datetime.now() 当前时间小数点后还有6位
            datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 当前时间,只精确到秒
        '''
        msg = '最好等待5s再点击【发送】,否则可能会被定为垃圾邮件
    {}'.format(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        
        driver = webdriver.Chrome(executable_path=chrome)  # 获取到driver
        driver.implicitly_wait(3)  # 设置全局的隐式等待,超出3s未找到元素,则报异常
        send_email(title, addressee, msg)
    用户名、密码、收件人执行代码时输入

    三、使用无头浏览器,并且可以再服务器上执行代码

    参考文档: https://www.cnblogs.com/caoyinshan/protected/p/12144316.html

    四、收件人可以输入多个用户

    # 防止操作系统用户没有将python装在默认的/usr/bin路径里。
    # 当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
    # ! /usr/bin/env python3
    
    # 定义全局编码方式,防止编码方式报错
    # -*-coding:utf-8 -*-
    '''
    第二版本:收件人支持多个,输入时多个收件人中间用中文逗号隔开
    
    使用无头浏览器发送邮件
    账户、密码、收件人、标题、内容需要手动输入
    邮件内容只支持文本类型
    代码中的chrome参数需要下载对应版本的chromedriver,并且将路径填入此参数中
    收件人将发件人加入白名单中,否则可能会收不到邮件
    '''
    
    
    import time
    import datetime  # 获取当前时间
    from getpass import getpass  # 输入的密码时不显示
    from selenium import webdriver
    
    
    # 登录网易邮箱
    def longin(url, username, password):
        driver.get(url=url)
        driver.find_element_by_id('accname').send_keys(username)  # 输入用户名
        driver.find_element_by_id('accpwd').send_keys(password)  # 输入用户名
        driver.find_element_by_class_name('loginbtn').submit()  # 点击登录BTN
    
    
    # 写邮件并发送
    def send_email(title, addressee, msg):
        try:
            # 先登录
            longin(url, username, password)
            
            # 1、点击【写信】
            driver.find_element_by_class_name('p-edit').click()
            time.sleep(3)
            '''
            2、输入收件人和标题
               定位时使用某一种方法无法定位到,所以多种定位交叉使用
            '''
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').send_keys(addressee)  # 输入收件人
            driver.find_elements_by_class_name('right-inner')[0].find_element_by_name('to').find_element_by_tag_name(
                'input').click()  # 点击一下收件人输入框,避免下拉框遮挡主题输入框
            driver.find_element_by_class_name('subject').find_element_by_tag_name('input').send_keys(title)  # 输入主题
            
            '''
            3、输入邮件内容(只有文本)
               因为文本框是在ifrme内的,ifrme是内嵌的网页元素,所以要先进入到ifrme内,再操作
            '''
            iframe = driver.find_element_by_id('ueditor_0')  # 先获取iframe,定位到它所在的位置
            driver.switch_to.frame(iframe)  # 切换到iframe中
            driver.find_element_by_xpath('/html/body').send_keys(msg)  # 在ifrme中操作元素,因为没有id也没有class,所以使用xpath
            driver.switch_to.default_content()  # 切换到iframe上之后,就无法对iframe以外的元素进行操作了,我们需要退出iframe再继续
            
            # 点击【发送】
            time.sleep(5)
            driver.find_element_by_id('main').find_element_by_class_name('g-mnc').find_element_by_xpath(
                '//*[@class="g-mnc"]/div[1]/div[1]/div[1]/div[1]').click()
            print('已发送完成!!!')
            
        finally:
            time.sleep(3)
            driver.close()  # 不管之前能否成功发送邮件,最后都关闭浏览器
    
    
    if __name__ == '__main__':
        chrome = r'/Users/Downloads/chromedriver'  # chrome驱动文件的路径
        
        url = 'https://qiye.163.com/login/?from=ym'  # 邮箱地址
        username = input('用户名:').strip()  # 邮箱账号
        password = getpass('密码:').strip()  # 邮箱密码
        
        addressee = input('收件人邮箱(多个收件人中间用中文逗号隔开):')  # 收件人邮箱
        title = input('邮件标题:')  # 邮件标题
        text_msg = input('请输入邮件内容(只支持文本类型):')  # 邮件内容
        
        '''
        邮件内容
            datetime.datetime.now() 当前时间小数点后还有6位
            datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S') 当前时间,只精确到秒
        '''
        msg = '{}
    {}'.format(text_msg, datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
        
        '''
        无头浏览器配置
        '''
        chrome_options = webdriver.ChromeOptions()  # 建一个参数对象,用来控制chrome以无界面模式打开
        chrome_options.add_argument('--no-sandbox')  # 取消沙盒模式,浏览器的安全性会降低,如果不取消,linux下运行会报错
        chrome_options.add_argument('--disable-dev-shm-usage')  # 解决资源有限的问题
        chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面
        chrome_options.add_argument('--disable-gpu')  # 禁用GPU加速
        
        driver = webdriver.Chrome(options=chrome_options, executable_path=chrome)  # 创建浏览器对象
        driver.implicitly_wait(10)  # 隐式等待10s
        
        send_email(title, addressee, msg)
    支持多用户

    多用户的没有更改代码,只是在输入收件人时,多个收件人之间用中文逗号隔开

    五、 邮件中添加图片

    代码需要重写,使用MIMEText模块来实现,

    未完待续......

          知识点:   

    1、密文输入密码

    注意: 使用getpass时不可以在pycharm中运行代码,会报错,必须在终端执行这个py文件

    from getpass import getpass
    
    username = input('用户名:').strip()  # 明文显示
    
    # 使用getpass时不可以在pycharm中执行,必须在终端执行这个py文件
    password = getpass('密码:').strip()  # 输入时不会显示,输入完成直接敲回车

    在代码中的应用:

    2、获取当前时间

    import datetime
    
    # 获取当前时间,精确到秒后6位
    print(datetime.datetime.now())  # 2019-12-31 17:08:33.877103
    
    # 获取当前时间,精确到秒
    print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))  # 2019-12-31 17:08:33

    在代码中的应用:

     执行结果:在邮件最后添加了发送邮件的时间

    怎么在终端执行?

    1、打开终端

    2、切换到这个py 文件的路径

    3、执行python3 XX.py

     4、按提示输入需要的正确数据(暂时没做容错处理),回车,代码就会执行

     打算再加上几种情况:

    2、邮件中添加图片

    3、邮件中添加文件

     未完待续。。。

  • 相关阅读:
    关于c#的知识博客
    sql server 查看列备注、类型、字段大小
    oracle 字符串分割函数
    sql server 字符串分割函数
    Microsoft.Office.Interop.Excel.ApplicationClass can not embedded 的问题
    web.xml文件配置
    解决FusionCharts报表中文乱码问题
    oracle树结构查询
    Myeclipse复制项目后部署出错解决方案
    jquery autocomplete参数说明
  • 原文地址:https://www.cnblogs.com/caoyinshan/p/12125045.html
Copyright © 2011-2022 走看看