Skip to content

Commit

Permalink
Fixes broken send-to-kindle
Browse files Browse the repository at this point in the history
  • Loading branch information
Jan Broer committed Mar 27, 2016
1 parent 6bfaeb4 commit 1180de8
Show file tree
Hide file tree
Showing 9 changed files with 100 additions and 41 deletions.
101 changes: 70 additions & 31 deletions cps/helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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)
Expand All @@ -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):
Expand Down
Binary file added cps/static/favicon.ico
Binary file not shown.
8 changes: 7 additions & 1 deletion cps/static/js/main.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@


$(function() {
$('.discover .row').isotope({
// options
Expand All @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion cps/templates/detail.html
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ <h3>Description:</h3>
</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>

Expand Down
6 changes: 5 additions & 1 deletion cps/templates/email_edit.html
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,13 @@ <h1>{{title}}</h1>
<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}}">
Expand Down
3 changes: 2 additions & 1 deletion cps/templates/layout.html
Original file line number Diff line number Diff line change
@@ -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">

Expand Down
2 changes: 2 additions & 0 deletions cps/templates/user_list.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,13 +25,15 @@ <h2>SMTP mail settings</h2>
<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>
</tr>
<tr>
<td>{{email.mail_server}}</td>
<td>{{email.mail_port}}</td>
<td>{% if email.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>
Expand Down
3 changes: 3 additions & 0 deletions cps/ub.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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>"
Expand All @@ -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
Expand Down
16 changes: 10 additions & 6 deletions cps/web.py
Original file line number Diff line number Diff line change
Expand Up @@ -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>")
Expand Down Expand Up @@ -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")
Expand Down

0 comments on commit 1180de8

Please sign in to comment.