Fixes broken send-to-kindle

This commit is contained in:
Jan Broer 2016-03-27 23:36:51 +02:00
parent 6bfaeb4b2b
commit 34cd613e29
9 changed files with 96 additions and 37 deletions

View File

@ -29,12 +29,18 @@ def update_download(book_id, user_id):
def make_mobi(book_id): def make_mobi(book_id):
kindlegen = os.path.join(config.MAIN_DIR, "vendor", "kindlegen") kindlegen = os.path.join(config.MAIN_DIR, "vendor", "kindlegen")
if not os.path.exists(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() 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") # 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 # print u"conversion started for %s" % book.title
check = subprocess.call([kindlegen, file_path + ".epub"], stdout=subprocess.PIPE) check = subprocess.call([kindlegen, file_path + ".epub"], stdout=subprocess.PIPE)
if not check or check < 2: if not check or check < 2:
@ -47,47 +53,75 @@ def make_mobi(book_id):
db.session.commit() db.session.commit()
return file_path + ".mobi" return file_path + ".mobi"
else: else:
return False print "make_mobie: kindlegen failed to convert book"
return None
else: else:
return file_path + ".mobi" print "make_mobie: epub not found: " + file_path + ".epub"
return None
def send_mail(book_id, kindle_mail): def send_mail(book_id, kindle_mail):
'''Send email with attachments''' '''Send email with attachments'''
is_mobi = False is_mobi = False
is_azw = False
is_azw3 = False
is_epub = False is_epub = False
is_pdf = False
file_path = None
settings = ub.get_mail_settings() settings = ub.get_mail_settings()
# create MIME message # create MIME message
msg = MIMEMultipart() msg = MIMEMultipart()
msg['From'] = settings["mail_from"] msg['From'] = settings["mail_from"]
msg['To'] = kindle_mail msg['To'] = kindle_mail
msg['Subject'] = 'Sent to Kindle' 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)) msg.attach(MIMEText(text))
use_ssl = settings.get('mail_use_ssl', 0)
print "use ssl: %d" % use_ssl
# attach files # attach files
#msg.attach(self.get_attachment(file_path)) #msg.attach(self.get_attachment(file_path))
book = db.session.query(db.Books).filter(db.Books.id == book_id).first() book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
for format in book.data: data = db.session.query(db.Data).filter(db.Data.book == book.id)
if format.format == "MOBI":
is_mobi == True
if format.format == "EPUB":
is_epub = True
formats = {}
if is_mobi: for entry in data:
file_path = os.path.join(config.DB_ROOT, book.path, format.name + ".mobi") 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: if len(formats) == 0:
file_path = make_mobi(book.id) print "no formats found"
return "Could not find any formats that can be send by email"
if file_path: if 'azw3' in formats:
msg.attach(get_attachment(file_path)) 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: else:
return False return "Could not find any formats that can be send by email"
#sys.exit()
# convert MIME message to string # convert MIME message to string
fp = StringIO() fp = StringIO()
gen = Generator(fp, mangle_from_=False) gen = Generator(fp, mangle_from_=False)
@ -96,17 +130,22 @@ def send_mail(book_id, kindle_mail):
# send email # send email
try: try:
mail_server = smtplib.SMTP(host=settings["mail_server"], mailserver = smtplib.SMTP(settings["mail_server"],settings["mail_port"])
port=settings["mail_port"]) mailserver.set_debuglevel(0)
mail_server.login(settings["mail_login"], settings["mail_password"])
mail_server.sendmail(settings["mail_login"], kindle_mail, msg) if int(use_ssl) == 1:
mail_server.close() 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: except smtplib.SMTPException:
traceback.print_exc() traceback.print_exc()
return False return "Error communicating with the mail server, please check the logs for details."
#sys.exit(7)
return True return None
def get_attachment(file_path): def get_attachment(file_path):

BIN
cps/static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

View File

@ -1,5 +1,4 @@
$(function() { $(function() {
$('.discover .row').isotope({ $('.discover .row').isotope({
// options // options
@ -20,6 +19,13 @@ $(function() {
}, function(data){ }, function(data){
$('.load-more .row').isotope( 'appended', $(data), null ); $('.load-more .row').isotope( 'appended', $(data), null );
}); });
$('#sendbtn').click(function(){
var $this = $(this);
$this.text('Please wait...');
$this.addClass('disabled');
});
}); });
$(window).resize(function(event) { $(window).resize(function(event) {

View File

@ -76,7 +76,7 @@
</ul> </ul>
</div> </div>
{% if g.user.kindle_mail %} {% if g.user.kindle_mail %}
<a target="_blank" href="{{url_for('send_to_kindle', book_id=entry.id)}}" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> Send to Kindle</a> <a href="{{url_for('send_to_kindle', book_id=entry.id)}}" id="sendbtn" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-send"></span> Send to Kindle</a>
{% endif %} {% endif %}
<a target="_blank" href="{{url_for('read_book', book_id=entry.id)}}" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-eye-open"></span> Read in browser</a> <a target="_blank" href="{{url_for('read_book', book_id=entry.id)}}" class="btn btn-primary" role="button"><span class="glyphicon glyphicon-eye-open"></span> Read in browser</a>

View File

@ -8,9 +8,13 @@
<input type="text" class="form-control" name="mail_server" id="mail_server" value="{{content.mail_server}}"> <input type="text" class="form-control" name="mail_server" id="mail_server" value="{{content.mail_server}}">
</div> </div>
<div class="form-group"> <div class="form-group">
<label for="mail_port">SMTP port</label> <label for="mail_port">SMTP port (usually 25 for unencrypted and 587 for StartTLS)</label>
<input type="text" class="form-control" name="mail_port" id="mail_port" value="{{content.mail_port}}"> <input type="text" class="form-control" name="mail_port" id="mail_port" value="{{content.mail_port}}">
</div> </div>
<div class="form-group">
<label for="mail_use_ssl">Server requires encryption (StartTLS)</label>
<input type="checkbox" name="mail_use_ssl" id="mail_use_ssl" {% if content.mail_use_ssl %}checked{% endif %}>
</div>
<div class="form-group"> <div class="form-group">
<label for="mail_login">SMTP login</label> <label for="mail_login">SMTP login</label>
<input type="text" class="form-control" name="mail_login" id="mail_login" value="{{content.mail_login}}"> <input type="text" class="form-control" name="mail_login" id="mail_login" value="{{content.mail_login}}">

View File

@ -1,13 +1,14 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>library | {{title}}</title> <title>calibre web | {{title}}</title>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<!-- Bootstrap --> <!-- Bootstrap -->
<link rel="shortcut icon" href="{{ url_for('static', filename='favicon.ico') }}">
<link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet" media="screen"> <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet" media="screen">
<link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen"> <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet" media="screen">

View File

@ -25,6 +25,7 @@
<tr> <tr>
<th>SMTP hostname</th> <th>SMTP hostname</th>
<th>SMTP port</th> <th>SMTP port</th>
<th>Server requires SSL</th>
<th>SMTP login</th> <th>SMTP login</th>
<th>SMTP password</th> <th>SMTP password</th>
<th>From mail</th> <th>From mail</th>
@ -32,6 +33,7 @@
<tr> <tr>
<td>{{email.mail_server}}</td> <td>{{email.mail_server}}</td>
<td>{{email.mail_port}}</td> <td>{{email.mail_port}}</td>
<td>{% if email.mail_use_ssl %}<span class="glyphicon glyphicon-ok"></span>{% else %}<span class="glyphicon glyphicon-remove"></span>{% endif %}</td>
<td>{{email.mail_login}}</td> <td>{{email.mail_login}}</td>
<td>********</td> <td>********</td>
<td>{{email.mail_from}}</td> <td>{{email.mail_from}}</td>

View File

@ -109,6 +109,7 @@ class Settings(Base):
id = Column(Integer, primary_key=True) id = Column(Integer, primary_key=True)
mail_server = Column(String) mail_server = Column(String)
mail_port = Column(Integer, default = 25) mail_port = Column(Integer, default = 25)
mail_use_ssl = Column(SmallInteger, default = 0)
mail_login = Column(String) mail_login = Column(String)
mail_password = Column(String) mail_password = Column(String)
mail_from = Column(String) mail_from = Column(String)
@ -121,6 +122,7 @@ def create_default_config():
settings = Settings() settings = Settings()
settings.mail_server = "mail.example.com" settings.mail_server = "mail.example.com"
settings.mail_port = 25 settings.mail_port = 25
settings.mail_use_ssl = 0
settings.mail_login = "mail@example.com" settings.mail_login = "mail@example.com"
settings.mail_password = "mypassword" settings.mail_password = "mypassword"
settings.mail_from = "automailer <mail@example.com>" settings.mail_from = "automailer <mail@example.com>"
@ -137,6 +139,7 @@ def get_mail_settings():
data = { data = {
'mail_server': settings.mail_server, 'mail_server': settings.mail_server,
'mail_port': settings.mail_port, 'mail_port': settings.mail_port,
'mail_use_ssl': settings.mail_use_ssl,
'mail_login': settings.mail_login, 'mail_login': settings.mail_login,
'mail_password': settings.mail_password, 'mail_password': settings.mail_password,
'mail_from': settings.mail_from 'mail_from': settings.mail_from

View File

@ -450,16 +450,16 @@ def logout():
def send_to_kindle(book_id): def send_to_kindle(book_id):
settings = ub.get_mail_settings() settings = ub.get_mail_settings()
if settings.get("mail_server", "mail.example.com") == "mail.example.com": 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: elif current_user.kindle_mail:
x = helper.send_mail(book_id, current_user.kindle_mail) result = helper.send_mail(book_id, current_user.kindle_mail)
if x: if result is None:
flash("Mail successfully send to %s" % current_user.kindle_mail, category="success") flash("Book successfully send to %s" % current_user.kindle_mail, category="success")
helper.update_download(book_id, int(current_user.id)) helper.update_download(book_id, int(current_user.id))
else: else:
flash("There was an error sending this book", category="error") flash("There was an error sending this book: %s" % result, category="error")
else: 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"]) return redirect(request.environ["HTTP_REFERER"])
@app.route("/shelf/add/<int:shelf_id>/<int:book_id>") @app.route("/shelf/add/<int:shelf_id>/<int:book_id>")
@ -607,6 +607,10 @@ def edit_mailsettings():
content.mail_login = to_save["mail_login"] content.mail_login = to_save["mail_login"]
content.mail_password = to_save["mail_password"] content.mail_password = to_save["mail_password"]
content.mail_from = to_save["mail_from"] 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: try:
ub.session.commit() ub.session.commit()
flash("Mail settings updated", category="success") flash("Mail settings updated", category="success")