First of all, the first argument of subprocess.Popen should be a list of arguments, not a single string, unless (a) you're using shell=True, or (b) writing code that's Windows-specific. Neither of those is true in your case.
That being said, if you want to run that command, you should be using shell=True. Otherwise, you're just running the cat command with | as a second argument, ssh as the third, and so forth. And cat doesn't know what to do with that; it just looks for a file named |, and fails. If you want to use shell features like | pipelines, you have to use the shell.
While we're at it, '… ssh ' + USER + "@" + EACH + 'tee -a…' has no space between the hostname and the tee, which is unlikely to be what you want. That's one of the many reasons that %-formatting or the format function is better:
cmdline = 'cat ~/.ssh/id_pub.rsa | ssh {}@{} tee -a .ssh/authorized_keys'.format(USER, EACH)
That being said, you shouldn't be using shell features you don't need. The docs have a great section on Replacing Older Functions with the subprocess Module, and one of the first examples shows you how to replace the shell pipeline and do it all in Python.
For that matter, there is almost never a good reason to pipe cat foo to another program. Just pass it foo as its input. In the shell, bar < foo is like cat foo | bar but a bit simpler and with less overhead; in Python, opening the file and then passing stdin=foo is a lot easier than piping cat to it.
That being said, trying to drive ssh as a command-line app has all kinds of fiddly issues that you don't want to deal with; it's much better to use a library like paramiko or fabric.
If, on the other hand, you really do want to use the ssh command-line tool and shell pipelines and so forth… bash is a much better language for that than Python.
print outputline will never be reached.