def __init__(self, conf): qrcodeId = uuid.uuid4().hex self.qrcodePath = conf.QrcodePath(qrcodeId) if conf.httpServerIP: self.qrcodeServer = QrcodeServer(conf.httpServerIP, conf.httpServerPort, os.path.dirname(self.qrcodePath)) self.qrcodeURL = self.qrcodeServer.qrcodeURL else: self.qrcodeServer = None if conf.mailAccount: self.mailAgent = MailAgent(conf.mailAccount, conf.mailAuthCode, name='QQBot管理员') if self.qrcodeServer: html = ('<p>您的 QQBot 正在登录,请尽快用手机 QQ 扫描下面的二维码。' '若二维码已过期,请重新打开本邮件。若您看不到二维码图片,请确保' '图片地址 <a href="{0}">{0}</a> 可以通过公网访问。</p>' '<p><img src="{0}"></p>').format(self.qrcodeURL) else: html = ('<p>您的 QQBot 正在登录,请尽快用手机 QQ 扫描下面的二维码。' '若二维码已过期,请将本邮件删除,删除后 QQBot 会在1~3分钟内' '将最新的二维码发送到本邮箱。</p>' '<p>{{png}}</p>') self.qrcodeMail = { 'to_addr': conf.mailAccount, 'html': html, 'subject': ('%s[%s]' % ('QQBot二维码', qrcodeId)), 'to_name': '我' } self.qrcode = LockedValue(None) else: self.mailAgent = None
class QrcodeManager: def __init__(self, conf): qrcodeId = uuid.uuid4().hex self.qrcodePath = conf.QrcodePath(qrcodeId) if conf.httpServerIP: self.qrcodeServer = QrcodeServer(conf.httpServerIP, conf.httpServerPort, os.path.dirname(self.qrcodePath)) self.qrcodeURL = self.qrcodeServer.qrcodeURL else: self.qrcodeServer = None if conf.mailAccount: self.mailAgent = MailAgent(conf.mailAccount, conf.mailAuthCode, name='QQBot管理员') if self.qrcodeServer: html = ('<p>您的 QQBot 正在登录,请尽快用手机 QQ 扫描下面的二维码。' '若二维码已过期,请重新打开本邮件。若您看不到二维码图片,请确保' '图片地址 <a href="{0}">{0}</a> 可以通过公网访问。</p>' '<p><img src="{0}"></p>').format(self.qrcodeURL) else: html = ('<p>您的 QQBot 正在登录,请尽快用手机 QQ 扫描下面的二维码。' '若二维码已过期,请将本邮件删除,删除后 QQBot 会在1~3分钟内' '将最新的二维码发送到本邮箱。</p>' '<p>{{png}}</p>') self.qrcodeMail = { 'to_addr': conf.mailAccount, 'html': html, 'subject': ('%s[%s]' % ('QQBot二维码', qrcodeId)), 'to_name': '我' } self.qrcode = LockedValue(None) else: self.mailAgent = None def Show(self, qrcode): with open(self.qrcodePath, 'wb') as f: f.write(qrcode) try: showImage(self.qrcodePath) except Exception as e: WARN('无法弹出二维码图片 file://%s 。%s', self.qrcodePath, e) if self.qrcodeServer: INFO('请使用浏览器访问二维码,图片地址: %s', self.qrcodeURL) if self.mailAgent: if self.qrcode.getVal() is None: self.qrcode.setVal(qrcode) StartThread(self.sendEmail, daemon=True) else: self.qrcode.setVal(qrcode) def sendEmail(self): lastSubject = '' while True: qrcode = self.qrcode.getVal() if qrcode is None: break if lastSubject != self.qrcodeMail['subject']: qrcode = '' if self.qrcodeServer else qrcode try: with self.mailAgent.SMTP() as smtp: smtp.send(png_content=qrcode, **self.qrcodeMail) except Exception as e: WARN('无法将二维码发送至邮箱%s %s', self.mailAgent.account, e) time.sleep(10) else: INFO('已将二维码发送至邮箱%s', self.mailAgent.account) if self.qrcodeServer: break else: lastSubject = self.qrcodeMail['subject'] else: time.sleep(20) try: INFO('开始查询邮箱 %s 中的最近的邮件', self.mailAgent.account) with self.mailAgent.IMAP() as imap: lastSubject = imap.getSubject(-1) except Exception as e: WARN('查询邮箱 %s 中的邮件失败 %s', self.mailAgent.account, e) else: INFO('最近的邮件: %s', lastSubject) def Destroy(self): if self.mailAgent: self.qrcode.setVal(None) try: os.remove(self.qrcodePath) except OSError: pass