As I get ready to try a second time to attract users, I decided to use MailChimp mailing lists to keep in touch with these users, as well as setting up some ‘tutorial’ emails at regular intervals. (I’m imagining something like “You’ve been using dynamic-efl.com for a week now, did you know you can do this to get more out of it?”)
To do this, I’d have to have code in Django that automatically signed members up. That means that this is my first attempt to work with an API, even by way of a library.
I decided to go with the mailchimp3 library and installed it in my virtualenv according to the instructions and set up some variables in my settings.py file.
# Mailchimp stuff # Authentication MAILCHIMP_LOGIN = 'login' MAILCHIMP_KEY = '===>SECRET<===' # The lists MAILCHIMP_LISTS = {'welcome': 'listID', 'germany': 'listID', 'beta-testers': 'listID'}<span data-mce-type="bookmark" id="mce_SELREST_start" data-mce-style="overflow:hidden;line-height:0" style="overflow:hidden;line-height:0" ></span>
The idea here is that I’ll be able to iterate over the keys in the lists, if I ever need to check that the user is in all the lists (for example, removing a user should include removing him from all lists).
To that end, I added a function at the beginning of my models.py file. (This probably isn’t good form).
def mailchimp_get(): """ Returns a logged-in mailchimp client """ return MailChimp(settings.MAILCHIMP_LOGIN, settings.MAILCHIMP_KEY)<span data-mce-type="bookmark" id="mce_SELREST_start" data-mce-style="overflow:hidden;line-height:0" style="overflow:hidden;line-height:0" ></span>
It seemed like the easiest way to only write the login once.
Finally, I had to create a few methods in the Model in question (in my case, this is my teacher model, as my users are called ‘Teachers’ in this bit.
def mailchimp_add_teacher_to_list(self, listname): """ Takes a listname, checks that the teacher is not a member of the list, then adds it. """ client = mailchimp_get() listid = settings.MAILCHIMP_LISTS[listname] if not self.mailchimp_teacher_in_list(listname): data = { 'email_address': self.user.email, 'status': 'subscribed', 'merge_fields': { 'FNAME': self.user.first_name } } client.lists.members.create(listid, data) def mailchimp_lists_get(self): """ TEMPORARY - Returns a list of all mailchimp lists """ client = mailchimp_get() return client.lists.all(get_all=True, fields="lists.name,lists.id") def mailchimp_teacher_in_list(self, listname): """ Returns a bool indicating if this teacher's email address is in the list """ email = self.user.email client = mailchimp_get() results = client.lists.members.all(settings.MAILCHIMP_LISTS[listname], get_all=True, fields="members.email_address") members = results['members'] addresses = [] for m in members: addresses.append(m['email_address']) return email in addresses
I think the names should be pretty self-explanatory. The mailchimp_lists_get() method was just an experiment based on following the instructions in the documents.
Lastly, I created a view and a URL just to test these functions by printing to the console and looking at the (currently empty) lists in mailchimp.
Summary
It was my first time sitting down and thinking critically about what I wanted and how to do it and I have to say that mailchimp and the library basically made it painless. I have other project ideas that will require more API integration, and it’s made me hopeful.
This is cool thanks. So are you using Mailchimp for all transactional emails? I started using SendGrid but am utterly confused with their API and lack of tutorials.
LikeLike
So far, users are hypothetical. Before inviting people to use the site, I wanted to have a series of ‘tutorials’ or ‘tips and tricks’ set up to automatically send. I haven’t had a need to make transactional emails, but I think mailchimp discourages that.
Now that I think about it, I think I would try and use django’s own send email function.
LikeLike