Fixes broken send-to-kindle
This commit is contained in:
parent
6bfaeb4b2b
commit
34cd613e29
|
@ -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
BIN
cps/static/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 519 B |
|
@ -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) {
|
||||||
|
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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}}">
|
||||||
|
|
|
@ -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">
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
|
|
16
cps/web.py
16
cps/web.py
|
@ -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")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user