パーソナルツール
現在の場所: ホーム takalog 退職しました
書いた本
Plone 完全活用ガイド の Chapter 1, 2, 3, 11 を執筆しました。
plone のインストール、使い方から、機能・デザインのカスタマイズ、プロダクトの作り方まで、 plone のすべてがぎゅっと詰まっている書籍になっていると思います。
plone に興味がある人から、すでに使いこなしている方まで、ぜひ読んでみてください。
Plone 完全活用ガイドのサポートページ
« 2017March »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
このBlogについて
鈴木たかのりです。とりあえず日記っぽく雑多なことを書き込んでいこうと思っています。 zope/plone関係の技術的な内容については http://takanory.net の方にまとめていこうと思います。 コメント・ツッコミはご自由にどうぞ。
twitter facebook linkedin foursquare
カテゴリ
android (16)
av (27)
books (35)
coreblog (49)
ds (22)
emacs (8)
ferret (24)
google (34)
icecream (44)
lego (71)
mac (22)
misc (75)
moblog (277)
movie (33)
pc (44)
plone (339)
puzzle (43)
python (66)
server (67)
snowscoot (9)
software (125)
sports (40)
suidou (30)
winds (47)
 
文書操作

退職しました

作成者 takanori投稿日 2012年03月02日 16時57分 最終変更日時 2012年03月03日 19時07分
PyCon mini JPのJob Board

あんまりこのブログには仕事のこととかは書いていないんですけど、「退職エントリを書くまでが退職です」と言われたので書いとこうかと思います。

2012年2月29日に退職 して、 3月1日から新しい会社で働き 始めました。

で、まぁここでなんで退職してなんでそこに入ったか何をするかとか書いたりするんですけど、それもつまらないので最終日に作成した退職メールを送るまでの道のりについて書きます。

手順としてはこんな感じでする。

  • 送信先メールアドレスの抽出
  • メールアドレスの名寄せ
  • 送受信数によるランク分け、メッセージを追加
  • メールを送信

メールアドレスの抽出

まずはメールアドレスを抽出します。

私は過去メールを Maildir 形式で保存しています。 これらのメールを以下のようなスクリプトで走査して、私と直接メールをやりとりした社内の人のメールアドレスをとりあえず抽出します。

コードを書いた時の個人的なポイントはこんな感じです。

  • mailbox.Maildir で Maildir フォルダから各メールファイルを読み込む。
  • rfc822 を使用してメールアドレスのみを抜き出す。
  • set とか正規表現を使って、自分のメールアドレスが含まれているか、社内のメールアドレスかを調べる。
#!/usr/bin/env python

from __future__ import print_function
import mailbox
import rfc822
import re

# 自分のメールアドレスの一覧
my_address = set(['takanori@kuzo.spam.com',
                  'takanori@kuzo.ham.jp',
                  'takanori@spam-inet.or.jp',
                  'takanori@egg.spam-inet.or.jp'])
# 社内のメールアドレスのドメイン一覧
domains = re.compile('@((egg.)?spam-inet.or.jp|cii.spam.co.jp|spam.com|mk.ham.jp|kuzo.ham.com|kuzo.spam.jp)$')

# 社内のドメインに合致するメールアドレスを書きだす
def find_to_addr(addr_set, str, ffile):
    for addr in addr_set:
        if domains.search(addr) != None:
            print("%s %s" % (addr, str), file=ffile)

# 関連するメールアドレスをファイルに書きだす
def address(fromaddr, tolist, cclist, ffile, tfile):
    toset = set(tolist)
    ccset = set(cclist)
    # From が自分のメールアドレス
    if fromaddr in my_address:
        find_to_addr(toset, "To", ffile)
        find_to_addr(ccset, "Cc", ffile)
    # To、Cc に自分のメールアドレスを含んでいる
    if len(toset & my_address) != 0:
        if domains.search(fromaddr) != None:
            print("%s %s" % (fromaddr, "To"), file=ffile)
    if len(ccset & my_address) != 0:
        if domains.search(fromaddr) != None:
            print("%s %s" % (fromaddr, "Cc"), file=tfile)

if __name__ == '__main__':
    # 結果を保存するファイル
    ffile = open("from-me.txt", "w")
    tfile = open("to-me.txt", "w")
    maildir = mailbox.Maildir("~/Maildir", None, create=False)
    for folder in maildir.list_folders():
        # 条件に合致するフォルダのみを検索する
        if folder.find("ham") != -1:
            folder = maildir.get_folder(folder)
            for key in folder.iterkeys():
                try:
                    message = folder[key]
                    # From, To, Cc のメールアドレスを取得
                    fromaddr = rfc822.parseaddr(message['From'])[1].lower()
                    tolist = [i[1].lower() for i in rfc822.AddressList(message['To'])]
                    cclist = [i[1].lower() for i in rfc822.AddressList(message['Cc'])]
                    address(fromaddr, tolist, cclist, ffile, tfile)
                except:
                    continue

メールアドレスの名寄せ

属するネットワークが変わったり、会社名が変わったりしてメールアドレスが変更しているため、本当は同一なメールアドレスになるように名前を変換します。

ここは単純に sed とかを使用して置換しました。

正規化した後は出現数(何回メールをやりとりしたか)を調べるために sort | uniq -c します。

送受信数によるランク分け、メッセージを追加

次に送受信数でランク分けします。私の場合は from/to のそれぞれのファイルから以下のようなフォーマットの csv ファイルを作成しました。

メールアドレス, 自分From相手To, 自分From相手Cc, 相手From自分To, 相手From自分Cc

こんな感じのコードで上記の csv ファイルを生成しました。 辞書型にデータを入れて最後に出力します。

できあがった CSV ファイルに対して送受信数が多い順にソートしたり、メッセージを追加した CSV ファイルを作成します。私はここの処理は Microsoft Excel を使用しました。

#!/usr/bin/env python

if __name__ == '__main__':
    summary = {}
    # 自分が From で "受信数 受信メールアドレス To/Cc" フォーマットの
    # ファイルを読み込む
    with open("from-me2.txt") as f:
        for line in f:
            (num, addr, tocc) = line.split()
            if not summary.has_key(addr):
                summary[addr] = ["0", "0", "0", "0"]
            if tocc == "To":
                summary[addr][0] = num
            elif tocc == "Cc":
                summary[addr][1] = num
    # 相手が From で "送信数 送信メールアドレス To/Cc" フォーマットの
    # ファイルを読み込む
    with open("to-me2.txt") as f:
        for line in f:
            (num, addr, tocc) = line.split()
            if not summary.has_key(addr):
                summary[addr] = ["0", "0", "0", "0"]
            if tocc == "To":
                summary[addr][2] = num
            elif tocc == "Cc":
                summary[addr][3] = num
    for key in summary.keys():
        num = summary[key]
        print "%s," % key,
        print ",".join(num)

メールを送信

最後に作成したメールアドレスとメッセージのデータを下にメールを送信します。

以下のような csv ファイルを元データとしてメールを送信します。

メールアドレス1,個別メッセージ1
メールアドレス2,
メールアドレス3,個別メッセージ2
メールアドレス4,

上記のデータを入力ファイルとして、退職メールを個別に送信します。 基本的にはテンプレートのメッセージを各メールアドレスに対して送信しますが、 個別メッセージが指定されている場合は個別メッセージを挿入します。

なお、ファイルの文字コードがきちんと合っていないと動作しないので、ご注意ください。 私の場合は全て utf-8 で揃えました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#

import smtplib
from email.mime.text import MIMEText
from email.Header import Header

# デフォルトの個別メッセージ
MESSAGE = u"お世話になりました。また会う日までごきげんよう。"
# 送信するメッセージ
TEXT = u"""鈴木たかのりです。

Subject のとおりですが、2012年2月29日で退職します。
(中略)
なにかあればいかに連絡ください
Twitter: http://twitter.com/takanory
Facebook: http://www.facebook.com/takanory.net

%s
"""

if __name__ == '__main__':
    me = "Takanori Suzuki <takanori@kuzo.ham.jp>"
    encoding = 'utf-8'

    with open("address-list.csv") as f:
        for line in f:
            (addr, message) = line.rstrip().split(",")
            # メールの本文を作成
            if len(message) < 2:
                message = MESSAGE
            else:
                message = unicode(message, encoding)
            # 個別メッセージを挿入
            msg = MIMEText(TEXT % message, 'plain', encoding)
            # メールのヘッダを設定
            msg['Subject'] = Header(u'退職のお知らせ', encoding)
            msg['From'] = me
            msg['To'] = addr
            msg['Reply-To'] = "takanori@hogehoge.net"

            # メールを送信する              
            print "To:", addr
            s = smtplib.SMTP()
            s.connect()
            s.sendmail(me, addr, msg.as_string())
            s.close()

こんな感じで無事数百人の人に退職メールを送信することができました。 大量の「すでの存在しないメールアドレスです」というエラーメールが返って来ましたが。

みなさんも退職するときには参考にしてみてください。

カテゴリ
python python
トラックバック用URL:
http://takanory.net/takalog/1284/tbping
コメントを追加

下のフォームに記入してコメントを追加できます。平文テキスト形式。

(必須)
(必須)
(必須)
(Required)
Enter the word

Powered by vine linux, python, zope, plone, coreblog