user-email 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. #!/bin/sh
  2. # Prints the user's email address, with confirmation from the user.
  3. #
  4. # Copyright (C) 2001-2003, 2005 Free Software Foundation, Inc.
  5. #
  6. # This program is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2, or (at your option)
  9. # any later version.
  10. #
  11. # This program is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software Foundation,
  18. # Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  19. # Prerequisites for using /usr/lib and ${datarootdir}/locale.
  20. prefix="/usr"
  21. exec_prefix="/usr"
  22. datarootdir="${prefix}/share"
  23. datadir="/usr/share"
  24. # Set variables libdir, localedir.
  25. libdir="/usr/lib"
  26. localedir="${datarootdir}/locale"
  27. # Support for relocatability.
  28. if test "no" = yes; then
  29. orig_installdir="$libdir"/gettext # see Makefile.am's install rule
  30. # Determine curr_installdir without caring for symlinked callers.
  31. curr_installdir=`echo "$0" | sed -e 's,/[^/]*$,,'`
  32. curr_installdir=`cd "$curr_installdir" && pwd`
  33. # Compute the original/current installation prefixes by stripping the
  34. # trailing directories off the original/current installation directories.
  35. while true; do
  36. orig_last=`echo "$orig_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
  37. curr_last=`echo "$curr_installdir" | sed -n -e 's,^.*/\([^/]*\)$,\1,p'`
  38. if test -z "$orig_last" || test -z "$curr_last"; then
  39. break
  40. fi
  41. if test "$orig_last" != "$curr_last"; then
  42. break
  43. fi
  44. orig_installdir=`echo "$orig_installdir" | sed -e 's,/[^/]*$,,'`
  45. curr_installdir=`echo "$curr_installdir" | sed -e 's,/[^/]*$,,'`
  46. done
  47. # Now relocate the directory variables that we use.
  48. libdir=`echo "$libdir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
  49. localedir=`echo "$localedir/" | sed -e "s%^${orig_installdir}/%${curr_installdir}/%" | sed -e 's,/$,,'`
  50. fi
  51. # Internationalization.
  52. . gettext.sh
  53. TEXTDOMAIN=gettext-tools
  54. export TEXTDOMAIN
  55. TEXTDOMAINDIR="$localedir"
  56. export TEXTDOMAINDIR
  57. # Redirect fileno 3 to interactive I/O.
  58. exec 3>/dev/tty
  59. # Output a prompt.
  60. if test $# != 0; then
  61. echo "$1" 1>&3
  62. fi
  63. # Find the user name on the local machine.
  64. user=`id -u -n 2>/dev/null`
  65. if test -z "$user"; then
  66. user="$USER"
  67. if test -z "$user"; then
  68. user="$LOGNAME"
  69. if test -z "$user"; then
  70. user=unknown
  71. fi
  72. fi
  73. fi
  74. # Find the hostname.
  75. # hostname on some systems (SVR3.2, old Linux) returns a bogus exit status,
  76. # so uname gets run too, so we keep only the first line of output.
  77. #host=`(hostname || uname -n) 2>/dev/null | sed 1q`
  78. host=`"$libdir"/gettext/hostname --short 2>/dev/null | sed 1q`
  79. # Find the hostname.
  80. hostfqdn=`"$libdir"/gettext/hostname --fqdn 2>/dev/null | sed 1q`
  81. # Find a list of email addresses from various mailer configuration files.
  82. # All mailers use configuration files under $HOME. We handle them in a
  83. # last-modified - first-priority order.
  84. cd $HOME
  85. files=""
  86. # ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------
  87. # Mozilla Thunderbird addresses
  88. files="$files .thunderbird/*/prefs.js"
  89. # Mozilla addresses
  90. files="$files .mozilla/*/prefs.js"
  91. # Netscape 4 addresses
  92. files="$files .netscape/liprefs.js .netscape/preferences.js"
  93. # Netscape 3 addresses
  94. files="$files .netscape/preferences"
  95. # Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
  96. # XEmacs mew addresses
  97. files="$files .emacs .emacs.el"
  98. # KDE2 addresses
  99. files="$files .kde2/share/config/emaildefaults"
  100. # KDE kmail addresses
  101. files="$files .kde2/share/config/kmailrc"
  102. # GNOME evolution 2 addresses
  103. files="$files .gconf/apps/evolution/mail/%gconf.xml"
  104. # GNOME evolution 1 addresses
  105. files="$files evolution/config.xmldb"
  106. # GNOME balsa addresses
  107. files="$files .gnome/balsa"
  108. # StarOffice and OpenOffice addresses
  109. sed_dos2unix='s/\r$//'
  110. sed_soffice51='s,StarOffice 5\.1=\(.*\)$,\1/sofficerc,p'
  111. sed_soffice52='s,StarOffice 5\.2=\(.*\)$,\1/user/sofficerc,p'
  112. sed_ooffice='s,^OpenOffice[^=]*=\(.*\)$,\1/user/config/registry/instance/org/openoffice/UserProfile.xml,p'
  113. files="$files Office51/sofficerc Office52/user/sofficerc "`sed -n -e "$sed_dos2unix" -e "$sed_soffice51" -e "$sed_soffice52" -e "$sed_ooffice" .sversionrc 2>/dev/null | sed -e 's,^file://*,/,'`
  114. # mutt addresses
  115. files="$files .muttrc"
  116. # pine addresses
  117. files="$files .pinerc"
  118. # xfmail addresses
  119. files="$files .xfmail/.xfmailrc"
  120. # tkrat addresses
  121. files="$files .ratatosk/ratatoskrc"
  122. # ----------------------- END MAILER SPECIFIC CODE -----------------------
  123. # Expand wildcards and remove nonexistent files from the list.
  124. nfiles=""
  125. for file in $files; do
  126. if test -r "$file" && test ! -d "$file"; then
  127. nfiles="$nfiles $file"
  128. fi
  129. done
  130. files="$nfiles"
  131. addresses=""
  132. if test -n "$files"; then
  133. for file in `ls -t $files`; do
  134. case "$file" in
  135. # ----------------------- BEGIN MAILER SPECIFIC CODE -----------------------
  136. # Mozilla and Mozilla Thunderbird addresses
  137. .mozilla/*/prefs.js | .thunderbird/*/prefs.js)
  138. addresses="$addresses "`grep -h '^user_pref("mail\.identity\..*\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\..*\.useremail", "\(.*\)");$/\1/'`
  139. ;;
  140. # Netscape 4 addresses
  141. .netscape/liprefs.js | .netscape/preferences.js)
  142. addresses="$addresses "`grep -h '^user_pref("mail\.identity\.useremail", ".*");$' $file 2>/dev/null | sed -e 's/^user_pref("mail\.identity\.useremail", "\(.*\)");$/\1/'`
  143. ;;
  144. # Netscape 3 addresses
  145. .netscape/preferences)
  146. addresses="$addresses "`grep -h '^EMAIL_ADDRESS:' $file 2>/dev/null | sed -e 's/^EMAIL_ADDRESS:[ ]*//'`
  147. ;;
  148. .emacs | .emacs.el)
  149. # Emacs/XEmacs rmail, Emacs/XEmacs gnus, XEmacs vm addresses
  150. addresses="$addresses "`grep -h '[ (]user-mail-address "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]user-mail-address "\([^"]*\)".*$/\1/'`
  151. # XEmacs mew addresses
  152. domains=`grep -h '[ (]mew-mail-domain "[^"]*"' $file 2>/dev/null | sed -e 's/^.*[ (]mew-mail-domain "\([^"]*\)".*$/\1/'`
  153. if test -n "$domains"; then
  154. for domain in $domains; do
  155. addresses="$addresses ${user}@$domain"
  156. done
  157. fi
  158. ;;
  159. # KDE2 addresses
  160. .kde2/share/config/emaildefaults)
  161. addresses="$addresses "`grep -h '^EmailAddress=' $file 2>/dev/null | sed -e 's/^EmailAddress=//'`
  162. ;;
  163. # KDE kmail addresses
  164. .kde2/share/config/kmailrc)
  165. addresses="$addresses "`grep -h '^Email Address=' $file 2>/dev/null | sed -e 's/^Email Address=//'`
  166. ;;
  167. # GNOME evolution 2 addresses
  168. .gconf/apps/evolution/mail/%gconf.xml)
  169. sedexpr0='s,^.*<addr-spec>\(.*\)</addr-spec>.*$,\1,p'
  170. addresses="$addresses "`sed -n -e "$sedexpr0" < $file`
  171. ;;
  172. # GNOME evolution 1 addresses
  173. evolution/config.xmldb)
  174. sedexpr0='s/^.*<entry name="identity_address_[0-9]*" type="string" value="\([^"]*\)".*$/\1/p'
  175. sedexpr1='s/\(..\)/\\x\1/g'
  176. sedexpr2='s,$,\\n,'
  177. addresses="$addresses "`sed -n -e "$sedexpr0" < $file | while read hexstring; do printf \`echo "$hexstring" | sed -e "$sedexpr1" -e "$sedexpr2"\`; done`
  178. ;;
  179. # GNOME balsa addresses
  180. .gnome/balsa)
  181. addresses="$addresses "`grep -h '^Address=' $file 2>/dev/null | sed -e 's/^Address=//'`
  182. ;;
  183. # OpenOffice addresses
  184. */UserProfile.xml)
  185. addresses="$addresses "`sed -n -e 's,^.*<mail cfg:type="string">\(.*\)</mail>.*$,\1,p' $file 2>/dev/null`
  186. ;;
  187. # StarOffice addresses
  188. # Not a typo. They really write "Adress" with a single d.
  189. # German orthography...
  190. */sofficerc)
  191. addresses="$addresses "`grep -h '^User-Adress=' $file 2>/dev/null | sed -e 's/#[^#]*$//' -e 's/^.*#//'`
  192. ;;
  193. # mutt addresses
  194. .muttrc)
  195. mutt_addresses=`grep -h '^set from="[^"]*"[ ]*$' $file 2>/dev/null | sed -e 's/^set from="\([^"]*\)"[ ]*$/\1/'`
  196. if test -n "$mutt_addresses"; then
  197. addresses="$addresses $mutt_addresses"
  198. else
  199. # mutt uses $EMAIL as fallback.
  200. if test -n "$EMAIL"; then
  201. addresses="$addresses $EMAIL"
  202. fi
  203. fi
  204. ;;
  205. # pine addresses
  206. .pinerc)
  207. domains=`grep -h '^user-domain=' $file 2>/dev/null | sed -e 's/^user-domain=//'`
  208. if test -n "$domains"; then
  209. for domain in $domains; do
  210. addresses="$addresses ${user}@$domain"
  211. done
  212. else
  213. # The use-only-domain-name option is only used if the user-domain option is not present.
  214. domains=`grep -h '^use-only-domain-name=' $file 2>/dev/null | sed -e 's/^use-only-domain-name=//'`
  215. if test "Yes" = "$domains"; then
  216. addresses="$addresses ${user}@"`echo "$hostfqdn" | sed -e 's/^[^.]*\.//'`
  217. fi
  218. fi
  219. ;;
  220. # xfmail addresses
  221. .xfmail/.xfmailrc)
  222. addresses="$addresses "`grep -h '^from=.*<.*>' $file 2>/dev/null | sed -e 's/^.*<\([^<>]*\)>.*$/\1/'`
  223. ;;
  224. # tkrat addresses
  225. .ratatosk/ratatoskrc)
  226. domains=`grep -h '^set option(masquerade_as) ' $file 2>/dev/null | sed -e 's/^set option(masquerade_as) //'`
  227. if test -n "$domains"; then
  228. for domain in $domains; do
  229. addresses="$addresses ${user}@$domain"
  230. done
  231. else
  232. # The domain option is used only if the masquerade_as option is not present.
  233. domains=`grep -h '^set option(domain) ' $file 2>/dev/null | sed -e 's/^set option(domain) //'`
  234. if test -n "$domains"; then
  235. for domain in $domains; do
  236. addresses="$addresses ${user}@${host}.$domain"
  237. done
  238. fi
  239. fi
  240. ;;
  241. # ----------------------- END MAILER SPECIFIC CODE -----------------------
  242. esac
  243. done
  244. fi
  245. # Some Debian systems have a file /etc/mailname.
  246. if test -r /etc/mailname; then
  247. hostmailname=`cat /etc/mailname`
  248. if test -n "$hostmailname"; then
  249. addresses="$addresses ${user}@$hostmailname"
  250. fi
  251. fi
  252. # SuSE Linux >= 8.0 systems have a file /etc/sysconfig/mail.
  253. if test -r /etc/sysconfig/mail; then
  254. hostmailname=`. /etc/sysconfig/mail && echo "$FROM_HEADER"`
  255. if test -n "$hostmailname"; then
  256. addresses="$addresses ${user}@$hostmailname"
  257. fi
  258. fi
  259. # elm has no user-defined addresses.
  260. # mailx has no user-defined addresses.
  261. # mh has no user-defined addresses.
  262. # They use the system default.
  263. addresses="$addresses ${user}@$hostfqdn"
  264. # Normalize addresses: remove addresses without @, lowercase the part after @,
  265. # and remove duplicates.
  266. lowercase_sed='{
  267. h
  268. s/^[^@]*@\(.*\)$/\1/
  269. y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
  270. x
  271. s/^\([^@]*\)@.*/\1@/
  272. G
  273. s/\
  274. //
  275. p
  276. }'
  277. naddresses=""
  278. for addr in $addresses; do
  279. case "$addr" in
  280. "<"*">") addr=`echo "$addr" | sed -e 's/^<//' -e 's/>$//'` ;;
  281. esac
  282. case "$addr" in
  283. *@*)
  284. addr=`echo "$addr" | sed -n -e "$lowercase_sed"`
  285. case " $naddresses " in
  286. *" $addr "*) ;;
  287. *) naddresses="$naddresses $addr" ;;
  288. esac
  289. ;;
  290. esac
  291. done
  292. addresses="$naddresses"
  293. # Now it's time to ask the user.
  294. case "$addresses" in
  295. " "*" "*)
  296. # At least two addresses.
  297. lines=""
  298. i=0
  299. for addr in $addresses; do
  300. i=`expr $i + 1`
  301. lines="${lines}${i} ${addr}
  302. "
  303. done
  304. while true; do
  305. { gettext "Which is your email address?"; echo; } 1>&3
  306. echo "$lines" 1>&3
  307. { gettext "Please choose the number, or enter your email address."; echo; } 1>&3
  308. read answer < /dev/tty
  309. case "$answer" in
  310. *@*) ;;
  311. [0-9]*)
  312. i=0
  313. for addr in $addresses; do
  314. i=`expr $i + 1`
  315. if test "$i" = "$answer"; then
  316. break 2
  317. fi
  318. done
  319. ;;
  320. esac
  321. case "$answer" in
  322. "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
  323. esac
  324. case "$answer" in
  325. *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
  326. *@*.*) ;;
  327. *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
  328. *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
  329. esac
  330. addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
  331. break
  332. done
  333. ;;
  334. " "*)
  335. # One address.
  336. while true; do
  337. { gettext "Is the following your email address?"; echo; } 1>&3
  338. echo " $addresses" 1>&3
  339. { gettext "Please confirm by pressing Return, or enter your email address."; echo; } 1>&3
  340. read answer < /dev/tty
  341. if test -z "$answer"; then
  342. addr=`echo "$addresses" | sed -e 's/^ //'`
  343. break
  344. fi
  345. case "$answer" in
  346. "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
  347. esac
  348. case "$answer" in
  349. *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
  350. *@*.*) ;;
  351. *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
  352. *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
  353. esac
  354. addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
  355. break
  356. done
  357. ;;
  358. "")
  359. # No address.
  360. { gettext "Couldn't find out about your email address."; echo; } 1>&3
  361. while true; do
  362. { gettext "Please enter your email address."; echo; } 1>&3
  363. read answer < /dev/tty
  364. case "$answer" in
  365. "<"*">") answer=`echo "$answer" | sed -e 's/^<//' -e 's/>$//'` ;;
  366. esac
  367. case "$answer" in
  368. *" "*) { gettext "Invalid email address: invalid character."; echo; echo; } 1>&3 ; continue ;;
  369. *@*.*) ;;
  370. *@*) { gettext "Invalid email address: need a fully qualified host name or domain name."; echo; echo; } 1>&3 ; continue ;;
  371. *) { gettext "Invalid email address: missing @"; echo; echo; } 1>&3 ; continue ;;
  372. esac
  373. addr=`echo "$answer" | sed -n -e "$lowercase_sed"`
  374. break
  375. done
  376. ;;
  377. *) echo "internal error" 1>&3 ; exit 1 ;;
  378. esac
  379. # Print to standard output.
  380. echo "$addr"