mirror of
https://github.com/janeczku/calibre-web
synced 2024-12-25 09:30:31 +00:00
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):
|
||||
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
BIN
cps/static/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 519 B |
@ -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) {
|
||||
|
@ -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>
|
||||
|
||||
|
@ -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}}">
|
||||
|
@ -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">
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
16
cps/web.py
16
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/<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")
|
||||
|
Loading…
Reference in New Issue
Block a user