Fixes broken send-to-kindle

This commit is contained in:
Jan Broer
2016-03-27 23:41:55 +02:00
parent 6bfaeb4b2b
commit 34cd613e29
9 changed files with 96 additions and 37 deletions
+66 -27
View File
@@ -29,12 +29,18 @@ def update_download(book_id, user_id):
def make_mobi(book_id):
kindlegen = os.path.join(config.MAIN_DIR, "vendor", "kindlegen")
if not os.path.exists(kindlegen):
return False
print "make_mobie: kindlegen binary not found in: %s" % kindlegen
return None
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
data = db.session.query(db.Data).filter(db.Data.book == book.id).filter(db.Data.format == 'EPUB').first()
if not data:
print "make_mobie: epub format not found for book id: %d" % book_id
return None
file_path = os.path.join(config.DB_ROOT, book.path, data.name)
file_path = os.path.join(config.DB_ROOT, book.path, book.data[0].name)
# print os.path.getsize(file_path + ".epub")
if os.path.exists(file_path + ".epub") and not os.path.exists(file_path + ".mobi"):
if os.path.exists(file_path + ".epub"):
# print u"conversion started for %s" % book.title
check = subprocess.call([kindlegen, file_path + ".epub"], stdout=subprocess.PIPE)
if not check or check < 2:
@@ -47,47 +53,75 @@ def make_mobi(book_id):
db.session.commit()
return file_path + ".mobi"
else:
return False
print "make_mobie: kindlegen failed to convert book"
return None
else:
return file_path + ".mobi"
print "make_mobie: epub not found: " + file_path + ".epub"
return None
def send_mail(book_id, kindle_mail):
'''Send email with attachments'''
is_mobi = False
is_azw = False
is_azw3 = False
is_epub = False
is_pdf = False
file_path = None
settings = ub.get_mail_settings()
# create MIME message
msg = MIMEMultipart()
msg['From'] = settings["mail_from"]
msg['To'] = kindle_mail
msg['Subject'] = 'Sent to Kindle'
text = 'This email has been automatically sent by library.'
text = 'This email has been sent via calibre web.'
msg.attach(MIMEText(text))
use_ssl = settings.get('mail_use_ssl', 0)
print "use ssl: %d" % use_ssl
# attach files
#msg.attach(self.get_attachment(file_path))
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
for format in book.data:
if format.format == "MOBI":
is_mobi == True
if format.format == "EPUB":
is_epub = True
data = db.session.query(db.Data).filter(db.Data.book == book.id)
formats = {}
if is_mobi:
file_path = os.path.join(config.DB_ROOT, book.path, format.name + ".mobi")
for entry in data:
if entry.format == "MOBI":
formats["mobi"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".mobi")
if entry.format == "AZW":
formats["azw"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".azw")
if entry.format == "AZW3":
formats["azw3"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".azw3")
if entry.format == "EPUB":
formats["epub"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".epub")
if entry.format == "PDF":
formats["pdf"] = os.path.join(config.DB_ROOT, book.path, entry.name + ".pdf")
if is_epub and not is_mobi:
file_path = make_mobi(book.id)
if len(formats) == 0:
print "no formats found"
return "Could not find any formats that can be send by email"
if file_path:
msg.attach(get_attachment(file_path))
if 'azw3' in formats:
msg.attach(get_attachment(formats['azw3']))
elif 'azw' in formats:
msg.attach(get_attachment(formats['azw']))
elif 'mobi' in formats:
msg.attach(get_attachment(formats['mobi']))
elif 'epub' in formats:
filepath = make_mobi(book.id)
if filepath is not None:
msg.attach(get_attachment(filepath))
elif 'pdf' in formats:
msg.attach(get_attachment(formats['pdf']))
elif 'pdf' in formats:
msg.attach(get_attachment(formats['pdf']))
else:
return False
return "Could not find any formats that can be send by email"
#sys.exit()
# convert MIME message to string
fp = StringIO()
gen = Generator(fp, mangle_from_=False)
@@ -96,17 +130,22 @@ def send_mail(book_id, kindle_mail):
# send email
try:
mail_server = smtplib.SMTP(host=settings["mail_server"],
port=settings["mail_port"])
mail_server.login(settings["mail_login"], settings["mail_password"])
mail_server.sendmail(settings["mail_login"], kindle_mail, msg)
mail_server.close()
mailserver = smtplib.SMTP(settings["mail_server"],settings["mail_port"])
mailserver.set_debuglevel(0)
if int(use_ssl) == 1:
mailserver.ehlo()
mailserver.starttls()
mailserver.ehlo()
mailserver.login(settings["mail_login"], settings["mail_password"])
mailserver.sendmail(settings["mail_login"], kindle_mail, msg)
mailserver.quit()
except smtplib.SMTPException:
traceback.print_exc()
return False
#sys.exit(7)
return "Error communicating with the mail server, please check the logs for details."
return True
return None
def get_attachment(file_path):