鱼C论坛

 找回密码
 立即注册
查看: 160|回复: 8

Pyton_flask练习写一个BBS中遇到问题求帮助-邮件发送功能实现

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在本地网页中报错如下所示:
SMTPServerDisconnected
smtplib 的SMTPServerDisconnected:连接意外关闭
——————————————————————————————————————————
1.配置在config.py里面;
2.mail=Mail()写在exts.py里面;
3.app.py里导入二个模块from exts import db,mail,import config并且在app.py文件里写了mail.init_app(app);
4.在auth.py文件里也导入了from flask_mail import Message,from exts import mail二个模块


app.py文件代码如下:
from flask import Flask,request
import config
from exts import db,mail
from blueprints.qa import bp as qa_bp
from blueprints.auth import bp as auth_bp
from  flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy
from models import UserModel
app = Flask(__name__)

app.config.from_object(config)#绑定配置文件
db.init_app(app)

mail.init_app(app)
migrate=Migrate(app,db)
app.register_blueprint(qa_bp)
app.register_blueprint(auth_bp)


if __name__ == '__main__':
    app.run(debug=True)

config.py文件代码如下:

#数据库的配置信息
HOSTNAME='127.0.0.1'
PORT='3306'
DATABASE='zhiliaooa'
USERNAME='root'
PASSWORD='root'
DB_URI='mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME,PASSWORD,HOSTNAME,PORT,DATABASE)
SQLALCHEMY_DATABASE_URI=DB_URI



#邮箱配置

MAIL_SERVER='smtp.qq.com'
MAIL_USE_SSL='True'
MAIL_PORT='465'#端口号
MAIL_USERNAME='739943375@qq.com '#邮箱账号
MAIL_PASSWORD='abcbkgmdcyxzbdej'#开启SMTP服务时生成的授权码
NAIL_DEFAULT_SENDER='739943375@qq.com '#邮箱账号

exts.py文件代码如下:
#这个文件存在的意义就是为了解决循环引用的问题
from flask_sqlalchemy import SQLAlchemy
from flask_mail import Mail

db=SQLAlchemy()
mail=Mail()

blueprints下auth.py文件代码如下:
from  flask import Blueprint,render_template
from flask_mail import Message
from exts import mail
bp=Blueprint('auth',__name__,url_prefix='/auth')

@bp.route('/login')
def login():
    return  render_template('login.html')

@bp.route('/register')
def register():
    return  render_template('register.html')

@bp.route('/mail/test')
def mail_test():

    message=Message(subject='邮箱测试',recipients='dunmutangxqt@sohu.com',body='这是一条测试邮件')
    mail.send(message)

    return '邮件发送成功!'
有知道解决办法的大佬帮助小白一下,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
根据你的代码和报错信息,问题主要出在配置文件和邮件发送格式上。以下是修改建议:

1. 修复配置文件(config.py)问题:

  1. # 邮箱配置
  2. MAIL_SERVER = 'smtp.qq.com'
  3. MAIL_USE_SSL = True  # 布尔值去掉引号
  4. MAIL_PORT = 465      # 端口号改为整数类型
  5. MAIL_USERNAME = '739943375@qq.com'  # 去掉尾部空格
  6. MAIL_PASSWORD = 'abcbkgmdcyxzbdej'
  7. MAIL_DEFAULT_SENDER = '739943375@qq.com'  # 修正变量名拼写
复制代码


2. 修改邮件发送格式(auth.py):

  1. @bp.route('/mail/test')
  2. def mail_test():
  3.     # recipients必须使用列表格式
  4.     message = Message(
  5.         subject='邮箱测试',
  6.         recipients=['dunmutangxqt@sohu.com'],  # 关键修改:用方括号包裹
  7.         body='这是一条测试邮件'
  8.     )
  9.     mail.send(message)
  10.     return '邮件发送成功!'
复制代码


3. 其他注意事项:
o 确保已开启QQ邮箱SMTP服务(登录QQ邮箱→设置→账户→开启POP3/SMTP)
o 检查防火墙是否阻止了465端口
o 尝试在终端直接测试SMTP连接:

  1. import smtplib
  2. server = smtplib.SMTP_SSL('smtp.qq.com', 465)
  3. server.login('739943375@qq.com', 'abcbkgmdcyxzbdej')
  4. server.quit()
复制代码


修改后如仍有问题,建议在发送邮件时添加超时设置:

  1. mail = Mail()
  2. mail.suppress = True  # 在exts.py中添加此配置
复制代码


重要提示:请立即修改邮箱授权码,你当前粘贴的MAIL_PASSWORD已暴露在公开代码中!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
遇到的 SMTPServerDisconnected: 连接意外关闭 错误,通常和 邮箱配置错误、服务器连接问题 或 使用方式问题 有关。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 5 天前 | 显示全部楼层
FishC 发表于 2025-6-13 23:12
根据你的代码和报错信息,问题主要出在配置文件和邮件发送格式上。以下是修改建议:

1. 修复配置文件(c ...

你好,大神
1.按你要求修改了还是报错内容是:
AssertionError:消息未指定发件人,并且尚未配置默认发件人。

2.另外测试了SMTP连接在PyCharm 里也报错内容是:
raise SMTPServerDisconnected("Connection unexpectedly closed")
smtplib.SMTPServerDisconnected: Connection unexpectedly closed
是腾讯邮箱服务器禁止你访问吗?


        
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
unupos 发表于 2025-06-14 19:37
FishC 发表于 2025-6-13 23:12
根据你的代码和报错信 ...


根据你补充的报错信息,问题集中在发件人配置和SMTP连接上。以下是完整的解决方案:

1. 修复发件人配置错误(关键修正)
在config.py中修正拼写错误并移除空格:
  1. # 邮箱配置
  2. MAIL_SERVER = 'smtp.qq.com'
  3. MAIL_USE_SSL = True  # 注意:布尔值不要加引号
  4. MAIL_PORT = 465      # 整数类型
  5. MAIL_USERNAME = '739943375@qq.com'  # 移除尾部空格
  6. MAIL_PASSWORD = 'abcbkgmdcyxzbdej'
  7. MAIL_DEFAULT_SENDER = '739943375@qq.com'  # 修正变量名拼写
复制代码


2. 在auth.py中显式指定发件人(双重保险):
  1. @bp.route('/mail/test')
  2. def mail_test():
  3.     message = Message(
  4.         subject='邮箱测试',
  5.         sender='739943375@qq.com',  # 显式添加发件人
  6.         recipients=['dunmutangxqt@sohu.com'],  # 必须使用列表
  7.         body='这是一条测试邮件'
  8.     )
  9.     mail.send(message)
  10.     return '邮件发送成功!'
复制代码


3. 解决SMTP连接问题(关键步骤):
- 登录QQ邮箱网页版 → 设置 → 账户 → 开启POP3/SMTP服务(可能需要短信验证)
- 如果已开启,请重新生成授权码(之前的可能已失效)
- 在防火墙中放行465端口(或暂时禁用防火墙测试)

4. 添加超时设置(在exts.py中):
  1. mail = Mail()
  2. mail.suppress = True  # 抑制连接错误
复制代码


5. 终端SMTP连接测试(使用Python解释器直接测试):
  1. import smtplib
  2. try:
  3.     server = smtplib.SMTP_SSL('smtp.qq.com', 465, timeout=10)
  4.     server.login('739943375@qq.com', '你的新授权码')  # 用新授权码替换
  5.     print("连接成功!")
  6.     server.quit()
  7. except Exception as e:
  8.     print("失败原因:", str(e))
复制代码


常见失败原因排查:
√ 授权码失效(重新生成)
√ 邮箱未开启SMTP服务
√ 网络限制(尝试手机热点)
√ QQ邮箱服务器限制(新设备需短信验证)

最后重要提醒:请立即重置你的邮箱授权码!当前代码中暴露的MAIL_PASSWORD需要更新!

如果仍有问题,请提供终端测试命令的输出结果,我会进一步帮你分析。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 天前 | 显示全部楼层
你好FishC 这个 终端SMTP连接测试换了新的新授权码这个是连接成功的但是我的论坛项目邮箱还是发送不了?
还是老问题?
AssertionError:消息未指定发件人,并且尚未配置默认发件人;
回溯 :
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1478, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1458, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1455, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 869, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 867, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 852, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "D:\Python\Project Development\demo09\blueprints\auth.py", line 22, in mail_test
    mail.send(message)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask_mail\__init__.py", line 540, in send
    message.send(connection)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask_mail\__init__.py", line 482, in send
    connection.send(self)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python39\lib\site-packages\flask_mail\__init__.py", line 165, in send
    assert message.sender, (
AssertionError: The message does not specify a sender and a default sender has not been configured
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 天前 | 显示全部楼层
unupos 发表于 2025-06-16 19:39
你好FishC 这个 终端SMTP连接测试换了新的新授权码这 ...


从错误信息和你的描述来看,问题核心在于Flask-Mail未正确加载发件人配置。让我们进行深度排查:

### 关键问题定位:配置未正确加载
在`config.py`中你配置了`MAIL_DEFAULT_SENDER`,但Flask仍然提示未指定发件人,说明配置未生效。请按以下步骤检查:

#### 1. 验证配置加载(在app.py中添加):
  1. app.config.from_object(config)
  2. print("MAIL_DEFAULT_SENDER:", app.config.get('MAIL_DEFAULT_SENDER'))  # 添加这行
  3. db.init_app(app)
复制代码

运行后查看控制台输出,如果是`None`说明配置未正确加载

#### 2. 修复配置文件命名错误:
  1. # config.py 确保使用正确的变量名
  2. MAIL_DEFAULT_SENDER = '739943375@qq.com'  # 注意是MAIL不是NAIL
复制代码


#### 3. 双重验证配置(在auth.py中添加):
  1. @bp.route('/mail/test')
  2. def mail_test():
  3.     from flask import current_app
  4.     print("实际加载的配置:", current_app.config['MAIL_DEFAULT_SENDER'])  # 添加这行
  5.    
  6.     message = Message(
  7.         subject='邮箱测试',
  8.         recipients=['dunmutangxqt@sohu.com'],  # 确保是列表
  9.         body='测试邮件'
  10.     )
  11.     mail.send(message)
复制代码


#### 4. 强制指定发件人(临时解决方案):
  1. message = Message(
  2.     subject='邮箱测试',
  3.     sender=app.config.get('MAIL_USERNAME'),  # 显式指定
  4.     recipients=['dunmutangxqt@sohu.com'],
  5.     body='测试邮件'
  6. )
复制代码


### 配置检查清单:
  1. # 必须包含的配置项(config.py)
  2. MAIL_SERVER = 'smtp.qq.com'
  3. MAIL_PORT = 465
  4. MAIL_USE_SSL = True  # 注意:没有引号!
  5. MAIL_USERNAME = '739943375@qq.com'  # 无空格
  6. MAIL_PASSWORD = '你的授权码'  # 最新授权码
  7. MAIL_DEFAULT_SENDER = '739943375@qq.com'  # 与MAIL_USERNAME一致
复制代码


### 终极解决方案:
如果仍不生效,尝试显式初始化邮件配置:
  1. # 在app.py中替换mail.init_app(app)
  2. mail = Mail(app)  # 直接初始化

  3. # 并移除exts.py中的mail=Mail()
复制代码


### 测试建议:
1. 先确保终端测试成功
2. 在视图中打印所有邮件配置:
  
  1. @bp.route('/mail/config')
  2.    def show_config():
  3.        return {
  4.            'server': current_app.config['MAIL_SERVER'],
  5.            'sender': current_app.config['MAIL_DEFAULT_SENDER']
  6.        }
复制代码

3. 如果输出不正确,检查config.py的拼写和语法

请按以上步骤操作,特别注意:
- 所有配置项名称必须完全正确
- 布尔值`True`不能加引号
- 端口号必须是整数
- 邮箱地址前后不能有空格

如果问题依旧,请提供添加了print语句后的控制台输出。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 前天 19:04 | 显示全部楼层
你好FishC
弄了这么久是在config.py中,MAIL_DEFAULT_SENDER写成了NAIL_DEFAULT_SENDER。
我改成M运行一下在本地就输出了邮件发送成功!。谢谢你帮助。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 19:08 | 显示全部楼层
unupos 发表于 2025-06-17 19:04
你好FishC
弄了这么久是在config.py中,MAIL_DEFAUL ...


太棒了!很高兴你找到了问题所在,原来是`NAIL_DEFAULT_SENDER`这个拼写错误导致的。这个错误非常典型,我来总结一下关键点:

### 问题核心分析:
1. **拼写错误**:在`config.py`中,正确的配置项是`MAIL_DEFAULT_SENDER`,而`NAIL_DEFAULT_SENDER`不会被Flask-Mail识别
2. **错误表现**:当同时满足以下条件时报错:
   - 未在Message中显式指定`sender`
   - 配置中没有有效的`MAIL_DEFAULT_SENDER`

### 完整解决方案:
在你的`config.py`中确保使用**完全正确**的配置项名称:
  1. # 正确配置 (注意是MAIL开头!)
  2. MAIL_SERVER = 'smtp.qq.com'
  3. MAIL_USE_SSL = True
  4. MAIL_PORT = 465
  5. MAIL_USERNAME = '739943375@qq.com'
  6. MAIL_PASSWORD = '你的授权码'
  7. MAIL_DEFAULT_SENDER = '739943375@qq.com'  # 关键配置项
复制代码


### 最佳实践建议:
1. **配置检查技巧**:在app.py中添加验证代码
  1. app.config.from_object(config)
  2. print("有效邮件配置:")
  3. for key in app.config:
  4.     if key.startswith('MAIL_'):
  5.         print(f"{key}: {app.config[key]}")
复制代码


2. **双重保险写法**:在视图函数中显式指定发件人
  1. @bp.route('/mail/test')
  2. def mail_test():
  3.     message = Message(
  4.         subject='邮箱测试',
  5.         sender=current_app.config['MAIL_DEFAULT_SENDER'],  # 显式指定
  6.         recipients=,
  7.         body='测试内容'
  8.     )
  9.     mail.send(message)
复制代码


### 安全提醒:
请**立即**更新你的QQ邮箱授权码!因为:
1. 你已在公开代码中暴露了原始授权码
2. 泄露的授权码可能被他人利用发送垃圾邮件
3. 重置路径:QQ邮箱 → 设置 → 账户 → POP3/IMAP服务 → 生成新授权码

很高兴你解决了问题!这种拼写错误其实很常见,下次遇到类似问题时,可以先用`print(app.config)`快速检查所有加载的配置项。继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-19 19:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表