From 34cd613e29bcc65e961cc9f7205198a13bb5f730 Mon Sep 17 00:00:00 2001 From: Jan Broer Date: Sun, 27 Mar 2016 23:36:51 +0200 Subject: [PATCH] Fixes broken send-to-kindle --- cps/helper.py | 101 +++++++++++++++++++++++----------- cps/static/favicon.ico | Bin 0 -> 519 bytes cps/static/js/main.js | 8 ++- cps/templates/detail.html | 2 +- cps/templates/email_edit.html | 6 +- cps/templates/layout.html | 3 +- cps/templates/user_list.html | 2 + cps/ub.py | 3 + cps/web.py | 16 ++++-- 9 files changed, 100 insertions(+), 41 deletions(-) create mode 100644 cps/static/favicon.ico diff --git a/cps/helper.py b/cps/helper.py index caff999a..db9526b3 100755 --- a/cps/helper.py +++ b/cps/helper.py @@ -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 - - - if is_mobi: - file_path = os.path.join(config.DB_ROOT, book.path, format.name + ".mobi") - - if is_epub and not is_mobi: - file_path = make_mobi(book.id) - - if file_path: - msg.attach(get_attachment(file_path)) + data = db.session.query(db.Data).filter(db.Data.book == book.id) + + formats = {} + + 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 len(formats) == 0: + print "no formats found" + return "Could not find any formats that can be send by email" + + 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): diff --git a/cps/static/favicon.ico b/cps/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..75e6ecc39b4fda06ffe4e24ad60378142a72c005 GIT binary patch literal 519 zcmV+i0{H!jP)zCQs>F*mKC%briLr&&TuvS@Rtyny01I?!6 z(5{qGf1EQX3^afchet@_kT8z8^Y#VpdW$d)=}&FKG@`Xs=lV*MG>r+AP%7r`{L919I(VDSTgo)x(&a6)6V3OKF;A zBqOR;fv!Ddy>e0zZ6-o5TzPhudeb zaO>Pf_WT()mYY2M_L=r_10ki {% if g.user.kindle_mail %} - Send to Kindle + Send to Kindle {% endif %} Read in browser diff --git a/cps/templates/email_edit.html b/cps/templates/email_edit.html index 31bd286d..0787107d 100644 --- a/cps/templates/email_edit.html +++ b/cps/templates/email_edit.html @@ -8,9 +8,13 @@
- +
+
+ + +
diff --git a/cps/templates/layout.html b/cps/templates/layout.html index 01fc062f..ffcea76c 100644 --- a/cps/templates/layout.html +++ b/cps/templates/layout.html @@ -1,13 +1,14 @@ - library | {{title}} + calibre web | {{title}} + diff --git a/cps/templates/user_list.html b/cps/templates/user_list.html index acf64261..14f241d9 100644 --- a/cps/templates/user_list.html +++ b/cps/templates/user_list.html @@ -25,6 +25,7 @@ SMTP hostname SMTP port + Server requires SSL SMTP login SMTP password From mail @@ -32,6 +33,7 @@ {{email.mail_server}} {{email.mail_port}} + {% if email.mail_use_ssl %}{% else %}{% endif %} {{email.mail_login}} ******** {{email.mail_from}} diff --git a/cps/ub.py b/cps/ub.py index c5e490ec..b9bd76df 100644 --- a/cps/ub.py +++ b/cps/ub.py @@ -109,6 +109,7 @@ class Settings(Base): id = Column(Integer, primary_key=True) mail_server = Column(String) mail_port = Column(Integer, default = 25) + mail_use_ssl = Column(SmallInteger, default = 0) mail_login = Column(String) mail_password = Column(String) mail_from = Column(String) @@ -121,6 +122,7 @@ def create_default_config(): settings = Settings() settings.mail_server = "mail.example.com" settings.mail_port = 25 + settings.mail_use_ssl = 0 settings.mail_login = "mail@example.com" settings.mail_password = "mypassword" settings.mail_from = "automailer " @@ -137,6 +139,7 @@ def get_mail_settings(): data = { 'mail_server': settings.mail_server, 'mail_port': settings.mail_port, + 'mail_use_ssl': settings.mail_use_ssl, 'mail_login': settings.mail_login, 'mail_password': settings.mail_password, 'mail_from': settings.mail_from diff --git a/cps/web.py b/cps/web.py index c057eb3d..8a45db4d 100755 --- a/cps/web.py +++ b/cps/web.py @@ -450,16 +450,16 @@ def logout(): def send_to_kindle(book_id): settings = ub.get_mail_settings() if settings.get("mail_server", "mail.example.com") == "mail.example.com": - flash("Please configure the SMTP email account first...", category="error") + flash("Please configure the SMTP mail settings first...", category="error") elif current_user.kindle_mail: - x = helper.send_mail(book_id, current_user.kindle_mail) - if x: - flash("Mail successfully send to %s" % current_user.kindle_mail, category="success") + result = helper.send_mail(book_id, current_user.kindle_mail) + if result is None: + flash("Book successfully send to %s" % current_user.kindle_mail, category="success") helper.update_download(book_id, int(current_user.id)) else: - flash("There was an error sending this book", category="error") + flash("There was an error sending this book: %s" % result, category="error") else: - flash("Please set a kindle mail first...", category="error") + flash("Please configure your kindle email address first...", category="error") return redirect(request.environ["HTTP_REFERER"]) @app.route("/shelf/add//") @@ -607,6 +607,10 @@ def edit_mailsettings(): content.mail_login = to_save["mail_login"] content.mail_password = to_save["mail_password"] content.mail_from = to_save["mail_from"] + if "mail_use_ssl" in to_save: + content.mail_use_ssl = 1 + else: + content.mail_use_ssl = 0 try: ub.session.commit() flash("Mail settings updated", category="success")