code: func getEmail(storage Storage, userPresent bool) string {
  	// First try memory (command line flag or typed by user previously)
  	leEmail := DefaultEmail
  	if leEmail == "" {
  		// Then try to get most recent user email
  		leEmail = storage.MostRecentUserEmail()
  		// Save for next time
  		DefaultEmail = leEmail
  	}
  	if leEmail == "" && userPresent {
  		// Alas, we must bother the user and ask for an email address;
  		// if they proceed they also agree to the SA.
  		reader := bufio.NewReader(stdin)
  		fmt.Println("\nYour sites will be served over HTTPS automatically using Let's Encrypt.")
  		fmt.Println("By continuing, you agree to the Let's Encrypt Subscriber Agreement at:")
  		fmt.Println("  " + saURL) // TODO: Show current SA link
  		fmt.Println("Please enter your email address so you can recover your account if needed.")
  		fmt.Println("You can leave it blank, but you'll lose the ability to recover your account.")
  		fmt.Print("Email address: ")
  		var err error
  		leEmail, err = reader.ReadString('\n')
  		if err != nil {
  			return ""
  		}
  		leEmail = strings.TrimSpace(leEmail)
  		DefaultEmail = leEmail
  		Agreed = true
  	}
  	return strings.ToLower(leEmail)
  }
docs: // getEmail does everything it can to obtain an email
  // address from the user within the scope of storage
  // to use for ACME TLS. If it cannot get an email
  // address, it returns empty string. (It will warn the
  // user of the consequences of an empty email.) This
  // function MAY prompt the user for input. If userPresent
  // is false, the operator will NOT be prompted and an
  // empty email may be returned.