tvl-depot/rfcToKindle/main.go

90 lines
2.3 KiB
Go
Raw Normal View History

// Author: wpcarro@gmail.com
//
// Wirelessly transfer RFC documents to your Kindle to device for an alternative
// medium for reading.
//
// Usage:
// ```shell
// > go run rfcToKindle.go -document rfc6479 -recipient username@kindle.com
// ```
//
// This uses `sendgmr` to send the file to the Kindle. Make sure:
// 1. That `sendgmr` is installed and available on $PATH.
// 2. That it is configured to work with your preferred email address.
// 3. That the email address `sendgmr` is configured to use is whitelisted in
// your Kindle "Personal Document Settings".
package main
import (
"flag"
"fmt"
"io"
"io/ioutil"
"log"
"net/http"
"os"
"os/exec"
"strings"
)
func main() {
document := flag.String("document", "", "(Required) The name of the document to fetch. For example \"RFC6479\".")
recipient := flag.String("recipient", "", "(Required) The email address of the Kindle device.")
subject := flag.String("subject", "", "(Optional) The email address of the Kindle device.")
flag.Parse()
if *document == "" {
// TODO: Is log.Fatal the best function to use here?
log.Fatal("-document cannot be empty. See -help for more information.")
}
if *recipient == "" {
log.Fatal("-recipient cannot be empty. See -help for more information.")
}
*document = strings.ToLower(*document)
url := fmt.Sprintf("https://www.ietf.org/rfc/%s.txt", *document)
resp, err := http.Get(url)
fmt.Printf("Downloading %s ... ", url)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
f, err := ioutil.TempFile("", fmt.Sprintf("%s-*.txt", *document))
if err != nil {
log.Fatal(err)
}
// TODO: Verify if this is cleaning up or not.
defer os.Remove(f.Name())
_, err = io.Copy(f, resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("done.")
if *subject == "" {
*subject = fmt.Sprintf("%s - Sent from rfcToKindle.go", *document)
}
// Although I couldn't find it documented anywhere, the email sent to the
// Kindle must have a body, even if the body isn't used for anything.
fmt.Printf("Emailing %s to %s ... ", f.Name(), *recipient)
cmd := exec.Command("sendgmr",
fmt.Sprintf("--to=%s", *recipient),
fmt.Sprintf("--body_file=%s", f.Name()),
fmt.Sprintf("--subject=%s", *subject),
fmt.Sprintf("--attachment_files=%s", f.Name()))
err = cmd.Run()
if err != nil {
log.Fatal(err)
}
fmt.Println("done.")
os.Exit(0)
}