学习-email实现 by Python3

本文介绍如何使用Python的smtplib库发送带有HTML格式的电子邮件,包括设置发件人、收件人、邮件主题及正文,并通过126邮箱的SMTP服务器实现邮件的发送。

学习资料:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432005226355aadb8d4b2f3f42f6b1d6f2c5bd8d5263000

    #coding:utf-8
    #!/usr/bin/env python3
    import smtplib
    from email import encoders
    from email.mime.text import MIMEText
    from email.header import Header
    from email.utils import parseaddr, formataddr
    
    def _format_addr(s):
        """编写了一个函数来格式化一个邮件地址。
        不能简单地传入name <addr@example.com>,
        因为如果包含中文,需要通过Header对象进行编码。
        """
        name, addr = parseaddr(s)
        return formataddr((Header(name, 'utf-8').encode(), addr))
    
    from_addr = input('from:')
    password = input('password:') #这里的密钥不是邮箱密码
    smtp_server = 'smtp.126.com'
    to_addr = input('to:')
    
    #不同的信息类型对应不同的格式,plain或html
    # msg = MIMEText('hello你好, send by python3... ', 'plain', 'utf-8')
    msg = MIMEText('<html><body><h3>Hello</h3>' +
        '<p>send by <a href="http://www.python.org">Python</a>...</p>' +
        '</body></html>', 'html', 'utf-8')
    
    msg['From'] = _format_addr('Python lover <%s>' % from_addr)
    msg['To'] = _format_addr('管理员 <%s>' % to_addr)
    msg['Subject'] = Header('来自SMTP的问候……', 'utf-8').encode()
    
    server = smtplib.SMTP(smtp_server, 25) #SMTP端口是25
    server.set_debuglevel(1)
    server.login(from_addr, password)
    server.sendmail(from_addr, [to_addr], msg.as_string())
    server.quit()

注意事项:
1,邮箱必须手动开通POP或SMTP功能,即通过第三方软件登陆访问SMTP服务器
2,发送信息需要补充From,To,Subject,不然会被拒绝。
3,

 

<think>好的,我现在需要解决用户的问题:用户已经安装了cryptography包,但在使用python-oracledb的瘦模式时仍然收到错误提示,说cryptography未安装。用户提供的环境信息显示cryptography版本是44.0.2,oracledb版本是3.0.0,Python版本是3.10.16。 首先,我应该回忆一下python-oracledb的相关知识。python-oracledb有两种模式:瘦模式和厚模式。瘦模式是纯Python实现的,而厚模式则依赖Oracle客户端库。根据错误信息DPY-3016,问题出在瘦模式需要cryptography包,但系统认为它没有安装。 用户已经确认安装了cryptography,但依然报错。可能的几个原因: 1. **版本不兼容**:可能cryptography的版本过旧或过新,与当前oracledb版本不兼容。需要检查oracledb的文档,看支持的cryptography版本范围。 2. **安装问题**:可能cryptography虽然安装,但安装不完整或有损坏。比如某些依赖项未正确安装,或者编译时出现问题,尤其是在Windows上可能需要C编译器的支持,或者cffi的问题。 3. **环境问题**:用户可能在使用虚拟环境,但实际运行的环境和安装的环境不一致。比如,检查是否在正确的conda环境中激活,或者是否在安装时使用了错误的pip路径。 4. **依赖冲突**:可能存在其他包依赖不同版本的cryptography,导致实际加载的版本不符合要求。 5. **路径问题**:安装路径可能不在Python的模块搜索路径中,导致无法正确导入。 接下来,我应该逐步引导用户排查这些问题。首先,确认cryptography是否正确安装且可导入。用户可以通过在Python中尝试导入来验证。如果导入失败,可能需要重新安装或检查安装日志。 然后,检查版本兼容性。查看oracledb 3.0.0的文档,看支持的cryptography版本。例如,可能要求cryptography>=某个版本。用户当前是44.0.2,假设oracledb需要更高版本,或者可能存在已知的不兼容问题。 另外,cryptography包依赖于cffi,用户的信息中显示已安装cffi,但需要确认cffi的版本是否合适。 还有可能,在Windows环境下,cryptography需要某些系统库,比如OpenSSL的动态链接库,或者需要Visual C++ Redistributable。如果这些依赖缺失,可能导致cryptography虽然安装但无法正常加载。 此外,用户使用conda环境,可能存在环境配置问题。比如,是否激活了正确的环境,或者在安装时是否在正确的环境中执行了pip install。 可能的解决步骤包括: 1. 确认当前环境是否正确,使用conda activate drbautoreport,然后检查pip list中的包是否存在。 2. 尝试升级cryptography到最新版本,或者降级到已知兼容的版本。 3. 重新安装cryptography和cffi,确保编译正确。 4. 检查Python环境中是否能成功导入cryptography,并查看是否有导入错误信息。 5. 如果问题依旧,考虑使用oracledb的厚模式,通过安装Oracle客户端库来绕过瘦模式的依赖问题。 需要一步步引导用户进行排查,确保每个环节都检查到位。</think>根据您提供的环境信息和错误提示,以下是分步排查和解决方案: --- ### **1. 验证环境激活状态** - **现象**:虽然已安装包,但可能未在正确环境中运行 - **操作**: ```bash # 确认当前处于drbautoreport环境 conda activate drbautoreport # 再次检查包是否存在 pip list | findstr "cryptography oracledb" ``` --- ### **2. 检查cryptography是否可正常导入** - **现象**:包已安装但存在损坏或依赖缺失 - **操作**: ```bash python -c "import cryptography; print(cryptography.__version__)" ``` - 如果报错(如缺少DLL或C扩展),需重新安装: ```bash pip uninstall cryptography -y pip install cryptography --no-cache-dir --force-reinstall ``` --- ### **3. 版本兼容性排查** - **现象**:oracledb 3.0.0 可能需要特定版本的cryptography - **操作**: - 查阅[oracledb官方文档](https://python-oracledb.readthedocs.io/en/latest/user_guide/appendix.html#dependency-requirements),确认兼容版本范围 - 尝试升级cryptography到最新版: ```bash pip install cryptography --upgrade ``` - 或降级到已知兼容版本(例如38.0.x): ```bash pip install cryptography==38.0.4 ``` --- ### **4. 检查cffi依赖** - **现象**:cryptography依赖cffi,若cffi异常会导致加载失败 - **操作**: ```bash pip show cffi # 确认cffi已安装 python -c "import cffi" # 测试导入 ``` - 如果报错,重新安装cffi: ```bash pip install cffi --upgrade --force-reinstall ``` --- ### **5. 系统库依赖(Windows特定)** - **现象**:cryptography需要OpenSSL的DLL文件 - **解决方案**: - 安装 [Microsoft Visual C++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe) - 确保系统PATH包含OpenSSL路径(如果使用自定义安装) --- ### **6. 尝试厚模式(Fallback方案)** - **现象**:瘦模式依赖始终无法满足 - **操作**: - 下载[Oracle Instant Client](https://www.oracle.com/database/technologies/instant-client/downloads.html) - 配置环境变量: ```bash set ORACLE_HOME=C:\path\to\instantclient set PATH=%ORACLE_HOME%;%PATH% ``` - 代码中强制使用厚模式: ```python import oracledb oracledb.init_oracle_client() # 指定lib_dir参数如果自动检测失败 ``` --- ### **总结建议步骤** 1. 确认环境激活 ✅ 2. 重新安装cryptography + cffi 🔄 3. 测试导入cryptography 🧪 4. 降级到cryptography 38.x ⬇️ 5. 仍失败则切换厚模式 🛠️ 如果问题仍未解决,请提供以下信息: - `python -c "import cryptography; print(cryptography.__file__)"` 的输出 - 重新安装cryptography时的完整日志(使用 `--verbose` 参数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值