Django 特定のグループにメールを送付する方法

Djangoでは組み込みでグループモデルがついていますが、特定のグループに所属するユーザーにだけメールを送りたい、というケースはあると思います。
今回はグループ名を指定してメールの送信リストを作成する方法について記事を書いていきます。

グループの作成

まずはグループを作成していきましょう。
管理画面からパッショーネというグループを作成します。
パーミッションは今回は何も選択しないで、名前だけ入れて保存します。


ユーザーにグループを割り当てる

次に作成したグループをユーザーに割り当てていきましょう。



ユーザーの一覧はこのようになっています。
ブローノ・ブチャラティナランチャ・ギルガに先ほど作成したグループパッショーネを割り当てていきます。
ブチャラティとナランチャのメールアドレスはそれぞれbuccellati@jojo.comnarancha@jojo.comという風に設定しています。

ブチャラティを選択しますと、下のように先ほど作成したグループが表示されています。



パッショーネをクリックして、右矢印を押すと下のようになります。



これで選択された状態になりましたので、保存をしましょう。

ナランチャも同様にグループを設定します。

グループ一覧を取得する処理

後はviews.py内にグループ一覧を取得する処理を書いていきます。
手順としては以下のような感じです。

  • groupモデルをインポート
  • groupモデルの一覧を取得
  • group名からgroupのidを取得
  • group idでuserモデルをフィルタリング
  • メールアドレスを加えていく
from django.core.mail import EmailMessage
from django.contrib.auth.models import Group,User
...他省略

def 何らかのタイミング():  
  # メール送信リストの空のリストを作成
  bcc = []
  # groupの一覧を取得
  groups = Group.objects.all().values()
  group_id = ''
  # group名からメールを送りたいグループの名前を取得
  for group in groups:
      if group.get('name') == 'パッショーネ':
          group_id = group.get('id')
  if group_id:
      # userオブジェクトをgroup_idでフィルタリング
      users = User.objects.filter(groups=group_id)
      for user in users.values():
          # 一人ずつ送信リストに加える
          bcc.append(user.get('email'))

     subject = 'Kenmei'
     message = 'messagemessage'
     from_email = settings.DEFAULT_FROM_EMAIL
     email = EmailMessage(subject, message, from_email, [], bcc)
     email.send()


試しにbccをprintしてみましょう。

print(bcc)
>>>
['buccellati@jojo.com', 'narancha@jojo.com']


割り当てたブチャラティとナランチャのメールアドレスが設定されていますね。

よくやるのが、何らかの投稿や更新がされた際にメールを送るということかと思います。
その場合はform_valid関数の中に記述すると良いでしょう。

TOPページ