# Buggy code
def _send_raw_email(self):
    self.queue[self.current]["starttime"] = datetime.now()
    self.UIqueue[self.current]["formStarttime"] = self.queue[self.current]["starttime"]
    # self.queue[self.current]['status'] = STAT_STARTED
    self.UIqueue[self.current]["stat"] = STAT_STARTED
    obj = self.queue[self.current]
    # create MIME message
    msg = MIMEMultipart()
    msg["Subject"] = self.queue[self.current]["subject"]
    msg["Message-Id"] = make_msgid("calibre-web")
    msg["Date"] = formatdate(localtime=True)
    text = self.queue[self.current]["text"]
    msg.attach(MIMEText(text.encode("UTF-8"), "plain", "UTF-8"))
    if obj["attachment"]:
        result = get_attachment(obj["filepath"], obj["attachment"])
        if result:
            msg.attach(result)
        else:
            self._handleError("Attachment not found")
            return

    msg["From"] = obj["settings"]["mail_from"]
    msg["To"] = obj["recipent"]

    use_ssl = int(obj["settings"].get("mail_use_ssl", 0))
    try:
        # convert MIME message to string
        fp = StringIO()
        gen = Generator(fp, mangle_from_=False)
        gen.flatten(msg)
        msg = fp.getvalue()

        # send email
        timeout = 600  # set timeout to 5mins

        org_stderr = sys.stderr
        sys.stderr = StderrLogger()

        if use_ssl == 2:
            self.asyncSMTP = email_SSL(
                obj["settings"]["mail_server"], obj["settings"]["mail_port"], timeout
            )
        else:
            self.asyncSMTP = email(
                obj["settings"]["mail_server"], obj["settings"]["mail_port"], timeout
            )

        # link to logginglevel
        if web.ub.config.config_log_level != logging.DEBUG:
            self.asyncSMTP.set_debuglevel(0)
        else:
            self.asyncSMTP.set_debuglevel(1)
        if use_ssl == 1:
            self.asyncSMTP.starttls()
        if obj["settings"]["mail_password"]:
            self.asyncSMTP.login(
                str(obj["settings"]["mail_login"]),
                str(obj["settings"]["mail_password"]),
            )
        self.asyncSMTP.sendmail(obj["settings"]["mail_from"], obj["recipent"], msg)
        self.asyncSMTP.quit()
        self._handleSuccess()
        sys.stderr = org_stderr

    except MemoryError as e:
        self._handleError("Error sending email: " + e.message)
        return None
    except smtplib.SMTPException as e:
        if hasattr(e, "smtp_error"):
            text = e.smtp_error.replace("\n", ". ")
        else:
            text = ""
        self._handleError("Error sending email: " + text)
        return None
    except socket.error as e:
        self._handleError("Error sending email: " + e.strerror)
        return None


# Traceback (OperationalError)
ERROR:cps.web:Exception on /book/125 [GET]
Traceback (most recent call last):
File "/Users/jgillman/Code/calibre-web/vendor/flask/app.py", line 1817, in wsgi_app
response = self.full_dispatch_request()
File "/Users/jgillman/Code/calibre-web/vendor/flask/app.py", line 1477, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/Users/jgillman/Code/calibre-web/vendor/flask/app.py", line 1381, in handle_user_exception
reraise(exc_type, exc_value, tb)
File "/Users/jgillman/Code/calibre-web/vendor/flask/app.py", line 1475, in full_dispatch_request
rv = self.dispatch_request()
File "/Users/jgillman/Code/calibre-web/vendor/flask/app.py", line 1461, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/Users/jgillman/Code/calibre-web/vendor/flask_login.py", line 717, in decorated_view
return func(*args, **kwargs)
File "/Users/jgillman/Code/calibre-web/cps/web.py", line 381, in show_book
return render_template('detail.html', entry=entries,  cc=cc, title=entries.title, books_shelfs=book_in_shelfs)
File "/Users/jgillman/Code/calibre-web/vendor/flask/templating.py", line 128, in render_template
context, ctx.app)
File "/Users/jgillman/Code/calibre-web/vendor/flask/templating.py", line 110, in _render
rv = template.render(context)
File "/Users/jgillman/Code/calibre-web/vendor/jinja2/environment.py", line 969, in render
return self.environment.handle_exception(exc_info, True)
File "/Users/jgillman/Code/calibre-web/vendor/jinja2/environment.py", line 742, in handle_exception
reraise(exc_type, exc_value, tb)
File "/Users/jgillman/Code/calibre-web/cps/templates/detail.html", line 1, in top-level template code
{% extends "layout.html" %}
File "/Users/jgillman/Code/calibre-web/cps/templates/layout.html", line 136, in top-level template code
{% block body %}{% endblock %}
File "/Users/jgillman/Code/calibre-web/cps/templates/detail.html", line 66, in block "body"
{% if entry['custom_column_' ~ c.id]|length > 0 %}
File "/Users/jgillman/Code/calibre-web/vendor/jinja2/environment.py", line 387, in getitem
return getattr(obj, attr)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/attributes.py", line 316, in __get__
return self.impl.get(instance_state(instance), dict_)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/attributes.py", line 613, in get
value = self.callable_(state, passive)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/strategies.py", line 524, in _load_for_state
return self._emit_lazyload(session, state, ident_key, passive)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/strategies.py", line 585, in _emit_lazyload
result = q.all()
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/query.py", line 2241, in all
return list(self)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/query.py", line 2353, in __iter__
return self._execute_and_instances(context)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/orm/query.py", line 2368, in _execute_and_instances
result = conn.execute(querycontext.statement, self._params)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/base.py", line 662, in execute
params)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/base.py", line 761, in _execute_clauseelement
compiled_sql, distilled_params
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/base.py", line 874, in _execute_context
context)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/base.py", line 1024, in _handle_dbapi_exception
exc_info
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/util/compat.py", line 196, in raise_from_cause
reraise(type(exception), exception, tb=exc_tb)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/base.py", line 867, in _execute_context
context)
File "/Users/jgillman/Code/calibre-web/vendor/sqlalchemy/engine/default.py", line 324, in do_execute
cursor.execute(statement, parameters)
OperationalError: (OperationalError) no such table: books_custom_column_1_link u'SELECT custom_column_1.id AS custom_column_1_id, custom_column_1.value AS custom_column_1_value \
nFROM custom_column_1, books_custom_column_1_link \nWHERE ? = books_custom_column_1_link.book AND custom_column_1.id = books_custom_column_1_link.value' (125,)
ERROR:tornado.access:500 GET /book/125 (::1) 89.60ms

# Fixed code
def _send_raw_email(self):
    self.queue[self.current]["starttime"] = datetime.now()
    self.UIqueue[self.current]["formStarttime"] = self.queue[self.current]["starttime"]
    # self.queue[self.current]['status'] = STAT_STARTED
    self.UIqueue[self.current]["stat"] = STAT_STARTED
    obj = self.queue[self.current]
    # create MIME message
    msg = MIMEMultipart()
    msg["Subject"] = self.queue[self.current]["subject"]
    msg["Message-Id"] = make_msgid("calibre-web")
    msg["Date"] = formatdate(localtime=True)
    text = self.queue[self.current]["text"]
    msg.attach(MIMEText(text.encode("UTF-8"), "plain", "UTF-8"))
    if obj["attachment"]:
        result = get_attachment(obj["filepath"], obj["attachment"])
        if result:
            msg.attach(result)
        else:
            self._handleError("Attachment not found")
            return

    msg["From"] = obj["settings"]["mail_from"]
    msg["To"] = obj["recipent"]

    use_ssl = int(obj["settings"].get("mail_use_ssl", 0))
    try:
        # convert MIME message to string
        fp = StringIO()
        gen = Generator(fp, mangle_from_=False)
        gen.flatten(msg)
        msg = fp.getvalue()

        # send email
        timeout = 600  # set timeout to 5mins

        org_stderr = sys.stderr
        sys.stderr = StderrLogger()

        if use_ssl == 2:
            self.asyncSMTP = email_SSL(
                obj["settings"]["mail_server"], obj["settings"]["mail_port"], timeout
            )
        else:
            self.asyncSMTP = email(
                obj["settings"]["mail_server"], obj["settings"]["mail_port"], timeout
            )

        # link to logginglevel
        if web.ub.config.config_log_level != logging.DEBUG:
            self.asyncSMTP.set_debuglevel(0)
        else:
            self.asyncSMTP.set_debuglevel(1)
        if use_ssl == 1:
            self.asyncSMTP.starttls()
        if obj["settings"]["mail_password"]:
            self.asyncSMTP.login(
                str(obj["settings"]["mail_login"]),
                str(obj["settings"]["mail_password"]),
            )
        self.asyncSMTP.sendmail(obj["settings"]["mail_from"], obj["recipent"], msg)
        self.asyncSMTP.quit()
        self._handleSuccess()
        sys.stderr = org_stderr

    except MemoryError as e:
        self._handleError("Error sending email: " + e.message)
        return None
    except smtplib.SMTPException as e:
        if hasattr(e, "smtp_error"):
            text = e.smtp_error.replace("\n", ". ")
        elif hasattr(e, "message"):
            text = e.message
        else:
            text = ""
        self._handleError("Error sending email: " + text)
        return None
    except socket.error as e:
        self._handleError("Error sending email: " + e.strerror)
        return None