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):
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):

BIN
cps/static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 519 B

View File

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

View File

@ -76,7 +76,7 @@
</ul>
</div>
{% 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 %}
<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}}">
</div>
<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}}">
</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">
<label for="mail_login">SMTP login</label>
<input type="text" class="form-control" name="mail_login" id="mail_login" value="{{content.mail_login}}">

View File

@ -1,13 +1,14 @@
<!DOCTYPE html>
<html>
<head>
<title>library | {{title}}</title>
<title>calibre web | {{title}}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- 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/style.css') }}" rel="stylesheet" media="screen">

View File

@ -25,6 +25,7 @@
<tr>
<th>SMTP hostname</th>
<th>SMTP port</th>
<th>Server requires SSL</th>
<th>SMTP login</th>
<th>SMTP password</th>
<th>From mail</th>
@ -32,6 +33,7 @@
<tr>
<td>{{email.mail_server}}</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>********</td>
<td>{{email.mail_from}}</td>

View File

@ -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 <mail@example.com>"
@ -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

View File

@ -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/<int:shelf_id>/<int:book_id>")
@ -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")