Python Botframework发送主动消息,然后字符串不为空

Python Botframework发送主动消息,然后字符串不为空,python,email,botframework,chatbot,microsoft-teams,Python,Email,Botframework,Chatbot,Microsoft Teams,我在使用带有Python的Bot框架发送主动消息时遇到问题。 首先,我需要的是从Outlook获取消息正文,然后机器人必须将其作为消息发送到添加该消息的所有聊天室 为此,首先我创建了一个新文件,并将其命名为Email.py 阅读每一条收到的信息,我只是简单地使用了whiletrue:and time.sleep 下面是我的代码示例: 导入imaplib、电子邮件、getpass 从电子邮件导入策略 导入json 导入时间 imap_主机='outlook.office365.com' imap_

我在使用带有Python的Bot框架发送主动消息时遇到问题。 首先,我需要的是从Outlook获取消息正文,然后机器人必须将其作为消息发送到添加该消息的所有聊天室

为此,首先我创建了一个新文件,并将其命名为Email.py

阅读每一条收到的信息,我只是简单地使用了whiletrue:and time.sleep

下面是我的代码示例:

导入imaplib、电子邮件、getpass 从电子邮件导入策略 导入json 导入时间 imap_主机='outlook.office365.com' imap_用户界面xx@xx.com' 初始化imap连接 mail=imaplib.IMAP4\u SSLimap\u主机,993 rc,resp=mail.loginimap\u用户'xxxxxx' 尽管如此: 仅从收件箱中选择未读邮件 邮件。选择“收件箱” 状态,data=mail.searchNone,“未查看” 如果不是数据[0]。拆分: 时间是120 Bot消息变量 用于\u bot的消息\u= 对于每封电子邮件 对于数据[0]中的num。拆分: 获取单个邮件并按策略解析。SMTP RFC兼容 状态,data=mail.fetchnum,'RFC822' email_msg=数据[0][1] email\u msg=email.message\u from\u bytesemail\u msg,policy=policy.SMTP 仅打印包含文本数据的邮件部分 对于电子邮件_msg.walk中的部分: 如果part.get_content_type==text/plain: 对于part.get_content.splitlines中的行: _bot+='\n'+行的消息 打印消息\u用于\u bot 在我成功创建了一个程序来读取和打印所有传入的消息之后,我尝试构建我的bot。我找到了一个例子,并以此为例

首先我想在后台用操作系统运行这个文件,但是我的机器人没有运行。然后我尝试在bot文件中添加一个异步函数,但没有成功。我的机器人只是忽略了这个功能。然后我在activity_handler.py中找到了异步函数,但没有找到任何可以帮助我的函数

然后我尝试添加一个on_message_activity函数,并认为如果我在团队中调用类似@bot hi的bot,它可能会开始工作。为了实现这个想法,我必须始终运行while循环,并且永远不要停止bot,但是我只会收到一条消息,如果有新的传入消息,那么bot就不会再编写它了,这不是一个解决方案,因为如果bot用于多个聊天,那么它根本就不会以这种方式工作

然后,我尝试将我的代码包含在\u成员\u添加的\u活动中,它似乎在网络聊天中的azure测试中工作得很好,但在团队中,在1-2条消息停止工作后。 我的代码

因此,也许可以将消息发送到添加bot的任何位置,它需要以某种方式获取此信息,也许只要bot的消息不为空,它就会保存在bot内存中


感谢您的帮助。

正如我们所讨论的,有些逻辑必须改变

将您的代码移出on_members_added_activity功能 使用主动概念发送消息
-维诺特

正常情况下,主动式信息起作用了?@Kalakutas-你有什么问题吗?由于此线程中有多个其他人,如果您想让我看到您的回复,您将需要“提及我”。@Vinoth Rajendran然后我在azure web chat上测试,首先需要编写,然后重新启动,然后处理主动消息。@KyleDelaney是的,我知道,如何使用bot发送消息,那么,我的消息\u for \u bot字符串不是空的。@Kalakutas-很抱歉,很难理解你在说什么。为了便于阅读,我编辑了你的问题,请你看一下我的编辑,看看这个问题是否仍然在表达你的意思?听起来你是说你的机器人基于电子邮件发送主动消息,但是你说你使用的是与主动消息无关的on_message_活动。您是否能够按照自述文件中的说明运行主动消息传递示例?
async def on_members_added_activity(
        self, members_added: [ChannelAccount], turn_context: TurnContext
    ):
    
        imap_host = 'outlook.office365.com'
        imap_user = 'xxxxxx@xxxxxx.com'

        # init imap connection
        mail = imaplib.IMAP4_SSL(imap_host, 993)
        rc, resp = mail.login(imap_user, 'xxxxxx')
        while True:
            # select only unread messages from inbox
            mail.select('Inbox')
            status, data = mail.search(None, '(UNSEEN)')

            if not data[0].split():
                time.sleep(5) 
            # Bot message variable
            Message_for_bot = ''
            # for each e-mail messages
            for num in data[0].split():
                # get a single message and parse it by policy.SMTP (RFC compliant)
                status, data = mail.fetch(num, '(RFC822)')
                email_msg = data[0][1]
                email_msg = email.message_from_bytes(email_msg, policy=policy.SMTP)

            # print only message parts that contain text data
                for part in email_msg.walk():
                 if part.get_content_type() == "text/plain":
                    for line in part.get_content().splitlines():
                        Message_for_bot += '\n' + line       
                                
                await turn_context.send_activity(f"{Message_for_bot}")
        for member in members_added:
            if member.id != turn_context.activity.recipient.id:
                await turn_context.send_activity(
                    "bot starting work..."
                )