GNUs email multiple outgoing accounts from the same server without imap
emacs, email, gnus, multiple-accounts, smtp
Solution
I have a similar set-up, where I use posting-styles in gnus to choose between several email accounts. I used to do it as mentioned, defining different aliases for the same host, having authinfo entries. It looked like this:
Contents of ~/.authinfo.gpg:
machine imap.gmail-alias1.com login me@hosteddomain.org password pass port 993
machine imap.gmail-alias2.com login me@gmail.com password pass port 993
machine smtp.gmail1.com login me@hosteddomain.org port 587 password
machine smtp.gmail2.com login me@gmail.com port 587 password
Partial contents of /etc/hosts:
# So I can use multiple gmail accounts in authinfo
# should be same address as imap.gmail.com
173.194.70.108 imap.gmail-alias1.com
173.194.70.108 imap.gmail-alias2.com
74.125.136.108 smtp.gmail1.com
74.125.136.108 smtp.gmail2.com
BUT I switched to using postfix to send the mail. What you can do is set postfix up so that it can (for example) receive mail for USER1@gmail.com, USER2@gmail.com, USER3@googlehosteddomain.com and send all messages to smtp.gmail.com, while using appropriate account credentials in each case. This requires you to install the Postfix program, and set up the files */etc/postfix/sasl_passwd* and */etc/postfix/sender_relay*.
Problem
I use GNUs and multiple email addresses, including changing the outgoing SMTP based on the FROM on the message. SO far so good. Now, though, I have multiple accounts on the same server, so the usual .authinfo doesn't work for me. It seems like the answer should be similar to http://www.cataclysmicmutation.com/2010/11/multiple-gmail-accounts-in-gnus/ but I am NOT using gmail, and I am NOT using imap. I am using SMTP and SSL. How can I extend that solution? (Also: I am using gnus-posting-styles to help send mail with the appropriate address, for what that's worth) Below are the relevant parts of my .gnus. Note that I am trying to get the webdev@[ME].com working, which is in addition to [ME]@[ME].com (both the same server). What do I need in here, and in my authinfo, to make this work? ``` ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; multiple outgoing accounts ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; http://www.mostlymaths.net/2010/12/emacs-30-day-challenge-using-gnus-to.html ;; also see ~/.authinfo (defvar smtp-accounts '( (ssl "[ME]@[ME].com" "mail.[ME].com" 26 "[ME]@[ME].com" secret) ;; (ssl "webdev@[ME].com" "mail.[ME].com" ;; 26 "webdev@[ME].com" secret) (ssl "[ME]@gmail.com" "smtp.gmail.com" 587 "[ME]@gmail.com" secret) (ssl "[ME]@gatech.edu" "mail.gatech.edu" 587 "[ME]@gatech.edu" secret) )) ;; Now lets configure smtpmail.el with your name and functions to send ;; mail using your smtp accounts by changing the from field (require 'smtpmail) (setq send-mail-function 'smtpmail-send-it message-send-mail-function 'smtpmail-send-it mail-from-style nil user-full-name "[ME] S. " smtpmail-debug-info t smtpmail-debug-verb t) (defun set-smtp (mech server port user password) "Set related SMTP variables for supplied parameters." (setq smtpmail-smtp-server server smtpmail-smtp-service port smtpmail-auth-credentials (list (list server port user password)) smtpmail-auth-supported (list mech) smtpmail-starttls-credentials nil) (message "Setting SMTP server to `%s:%s' for user `%s'." server port user)) (defun set-smtp-ssl (server port user password &optional key cert) "Set related SMTP and SSL variables for supplied parameters." (setq starttls-use-gnutls t starttls-gnutls-program "gnutls-cli" starttls-extra-arguments nil smtpmail-smtp-server server smtpmail-smtp-service port smtpmail-auth-credentials (list (list server port user password)) smtpmail-starttls-credentials (list (list server port key cert))) (message "Setting SMTP server to `%s:%s' for user `%s'. (SSL enabled.)" server port user)) (defun change-smtp () "Change the SMTP server according to the current from line." (save-excursion (loop with from = (save-restriction (message-narrow-to-headers) (message-fetch-field "from")) for (auth-mech address . auth-spec) in smtp-accounts when (string-match address from) do (cond ((memq auth-mech '(cram-md5 plain login)) (return (apply 'set-smtp (cons auth-mech auth-spec)))) ((eql auth-mech 'ssl) (return (apply 'set-smtp-ssl auth-spec))) (t (error "Unrecognized SMTP auth. mechanism: `%s'." auth-mech))) finally (error "Cannot infer SMTP information.")))) ;; The previous function will complain if you fill the from field with ;; an account not present in smtp-accounts. (defvar %smtpmail-via-smtp (symbol-function 'smtpmail-via-smtp)) (defun smtpmail-via-smtp (recipient smtpmail-text-buffer) (with-current-buffer smtpmail-text-buffer (change-smtp)) (funcall (symbol-value '%smtpmail-via-smtp) recipient smtpmail-text-buffer)) ;; This wraps send mail via smtp mail, to be able to send multiple ;; messages with smtpmail. ;; Reply-to with same address it was sent to (setq gnus-posting-styles '(((header "to" "[ME]@gmail.com") (address "[ME]@gmail.com")) ((header "to" "[ME]@gatech.edu") (address "[ME]@gatech.edu")) ((header "to" "[ME]@[ME].com") (address "[ME]@[ME].com")) ;; ((header "to" "webdev@[ME].com") ;; (address "webdev@[ME].com")) ;; ((header "cc" "webdev@[ME].com") ;; (address "webdev@[ME].com")) ((header "cc" "[ME]@[ME].com") (address "[ME]@[ME].com")) ((header "cc" "[ME]@gatech.edu") (address "[ME]@gatech.edu")) ((header "cc" "[ME]@gmail.com") (address "[ME]@gmail.com")))) ``` SOLUTION The answer I was looking for came below. For completeness, I'm posting what my end-result solution looked like using my /etc/host file, .authinfo, and .gnus. ``` ;; excerpt from .gnus (defvar smtp-accounts '( (ssl "first@onedomain.com" "mail.onedomain.com" 26 "first@onedomain.com" secret) (ssl "second@onedomain.com" "mail.onedomain2.com" ;; <-- This is the new alias in my /etc/hosts 26 "username@onedomain.com" secret) ;; <-- Added these two lines )) ;; excerpt from .authinfo machine mail.onedomain.com login username@onedomain.com port 26 password MyPASS machine mail.onedomain2.com login username@onedomain.com port 26 password "MyOtherPASS" ;; excerpt from /etc/hosts. The IP was obtained by pinging my mail.onedomain.com 69.89.31.60 mail.onedomain2.com onedomain2 ```