code: def getLogicalLines(fp, allowQP=True, findBegin=False):
      if not allowQP:
          val = fp.read(-1)
          lineNumber = 1
          for match in logical_lines_re.finditer(val):
              line, n = wrap_re.subn('', match.group())
              if line != '':
                  yield line, lineNumber
              lineNumber += n
      else:
          quotedPrintable = False
          newbuffer = six.StringIO
          logicalLine = newbuffer()
          lineNumber = 0
          lineStartNumber = 0
          while True:
              line = fp.readline()
              if line == '':
                  break
              else:
                  line = line.rstrip(CRLF)
                  lineNumber += 1
              if line.rstrip() == '':
                  if logicalLine.tell() > 0:
                      yield logicalLine.getvalue(), lineStartNumber
                  lineStartNumber = lineNumber
                  logicalLine = newbuffer()
                  quotedPrintable = False
                  continue
              if quotedPrintable and allowQP:
                  logicalLine.write('\n')
                  logicalLine.write(line)
                  quotedPrintable = False
              elif line[0] in SPACEORTAB:
                  logicalLine.write(line[1:])
              elif logicalLine.tell() > 0:
                  yield logicalLine.getvalue(), lineStartNumber
                  lineStartNumber = lineNumber
                  logicalLine = newbuffer()
                  logicalLine.write(line)
              else:
                  logicalLine = newbuffer()
                  logicalLine.write(line)
              val = logicalLine.getvalue()
              if val[-1]=='=' and val.lower().find('quoted-printable') >= 0:
                  quotedPrintable=True
          if logicalLine.tell() > 0:
              yield logicalLine.getvalue(), lineStartNumber