## Send email to a list of users

| categories: | tags: | View Comments

I have a need to send a lot of emails to users in my class. I have to send each student an email containing there userid and a password assigned to them. I have a list of these, so the strategy is to create a function that will email that information to one user, and then use mapcar to apply the function to each pair in a list. First, we work out a function that will send one email to one user.

(defun send-mail (userid password)
"send email to userid@andrew.cmu.edu containing their password"
(interactive)
(mail)
(mail-to)
(insert (format "%s@andrew.cmu.edu" userid))
(mail-subject)
(insert "[06-640] account information")
(mail-text)
(insert (format "
An account has been created on gilgamesh.cheme.cmu.edu
userid: %s
(mail-send-and-exit))

(send-mail "jkitchin" "trustme99")


That worked well. I ran the block and got the email.

Now, suppose I have this data:

user1 trustme99
user2 foolme99
user3 blameme99

We can pass that to a source block as a list of lists that will look like this:

 ((user1 trustme99) (user2 foolme99) (user3 blameme99))


Then, we can use a mapcar to process each element. Here I use a dummy function with two arguments. If I substitute the function above, each of these users would get an email.

(defun fun (a b)
(princ (format "user: %s\npassword: %s\n" a b)))

(mapcar (lambda (x) (fun (car x) (cadr x))) data)

user: user1
user: user2
user: user3


I am not sure that is the best way to get the first and second elements in the list element. It looks funny to me, but it works fine. the alternative is not much prettier:

(defun fun (a b)
(princ (format "user: %s\npassword: %s\n" a b)))

(mapcar (lambda (x) (fun (nth 0 x) (nth 1 x))) data)

user: user1