困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

VIMの話-postmail.vimを使えるように頑張る4-

前回の続き。
Ccも送れるようにしてみた。

VIMスクリプトPythonスクリプトの中身が、実際どのような流れで何をしているのか
きちんと理解しながらトレースするぞぉ!

・・・・・










なんていう、新人に教えるようなことをする気は最初っからないので!

ひとまず、Toと書かれている辺りの処理をコピペしてなんとなく似せれば上手く動くだろうと
まず、postmail.vimの中身を検索。

    if l:argc < 1
        let l:to_input = input('To Address : ', l:smtpconf.default_to_address)
        let l:to_input = iconv(l:to_input, &encoding, 'utf-8')
        let l:addresses = [ l:to_input ]
    else
        let l:addresses = a:000
    endif

この辺が、VIMコマンド実行時に入力を促す処理と見た!
根拠は、'To Address'
これが、コマンド実行時に表示されるからだ。
とりあえず、多分変数の概念とかあるんだろうから、コピペする範囲に気をつけて

    if l:argc < 1
        let l:to_input = input('Cc Address : ', l:smtpconf.default_cc_address)
        let l:to_input = iconv(l:to_input, &encoding, 'utf-8')
        let l:cc_addresses = [ l:to_input ]
    else
        let l:cc_addresses = a:000
    endif

 を追加。

l:smtpconf.default_to_address から察するに、postmail.confの中身を参照しているのだろうと推測。
こっちにも

    'default_cc_address': '*****@*****'         ,

 これを追加。

試しにコマンドを打ってみると、Cc Addressの入力を促す入力待機が実行された。


次に、VIMスクリプトに流しているであろう辺りを捜索。
というか、.pyを実行しているのは

    for l:i in split(globpath(&runtimepath, 'plugin/postmail.py'), '\n')

ここだけだから、この周りを調べればおk。

    let l:i = 0
    while l:i < len(l:addresses)
        let l:to_address = l:addresses[l:i]
        call s:Post(

これが、それなんだろうと思うが、この文をそのままVIMスクリプトの知識無しでトレースすると、アドレスが入ってる配列の個数分Post関数呼ばれないかこれ・・・?

と思った。
が、実際は一回しか呼び出されていないので、whileしてるけど、事実上addressesの中身は一個しかない処理なんだと推測し、以下を追加

        let l:to_address = l:addresses[l:i]
        let l:cc_address = l:cc_addresses[l:i]

もちろん、引数にも

            \     l:to_address,
            \     l:cc_address,

こんな感じで。呼び出し先の方も

function! s:Post(auth_type, smtp_host, smtp_port, login_user, login_pass, mail_encoding, from_address, to_address, cc_address, subject, body, pop_host, pop_port, pop_user, pop_pass)

 こんな感じで追加。

そして、一回postmail.pyの方を検索かけてみるが、auth_typeを受け取っているのが

class Mailer(threading.Thread):
    def __init__(self, auth_type, smtp_host, smtp_port, login_user, login_pass, mail_encoding, pop_host, pop_port, pop_user, pop_pass):
        threading.Thread.__init__(self)

        if auth_type == 'None':
            self.mailer = BaseMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding)
        if auth_type == 'TLS':
            self.mailer = TLSMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding)
        if auth_type == 'POP':
            self.mailer = POPMailer(smtp_host, smtp_port, login_user, login_pass, mail_encoding, pop_host, pop_port, pop_user, pop_pass)

 ここだけで、さっきのPython呼び出しとはあんまり関係がなさそうな感じ。
というわけで、他のto_addressをpostmail.vimの方で検索かけていると

to_address    = vim.eval('a:to_address')

ってのがあったので

cc_address    = vim.eval('a:cc_address')

 を追加。

さらに、その下の方に

mailer.sendmail(from_address, to_address, subject, body)

があったので、これがpostmail.py側の

 

    def sendmail(self, from_address, to_address, subject, body):

 に該当すると思い

mailer.sendmail(from_address, to_address, cc_address, subject, body)
    def sendmail(self, from_address, to_address, cc_address, subject, body):

 と追加。

というか、postmail.py側のto_addressが書かれている箇所全てに、cc_addressを思考停止で追加していった。

で、実際にメールを送るpostmail.py内の箇所は

    def __send_tls_auth_message__(self, from_address, to_address, cc_address, message):

 今回はここなので、
http://stackoverflow.com/questions/1546367/python-how-to-send-mail-with-to-cc-and-bcc


ここを参考にして

        to_address_list = to_address.split(",")
        cc_address_list = cc_address.split(",")
        to_address_lists = to_address_list + cc_address_list
        ~~~
        smtp.sendmail(from_address, to_address_lists, message.as_string())

とした。


で、テストして上手く動いてるっぽい挙動をしたので、自分で使う分にはこれでいいやという事で

終わり。

ちなみに、postmail.confのmail_encodingをutf-8にすると、携帯にメールを送ると改行が効かなくなるので注意。

 

エンジニアとして、内部でやっている処理の流れを理解せずに、適当に追加してそれでいいのか!というお叱りを受けそうだが、それがクリティカルになりそうなら調べればいいだろうし、問題が起きた際にどうにでも対応できるんだったら動けばいいんじゃないかな^p^
実際、これは問題が起きたところで何も実害がないので。
仕事ではクリティカルになる場合が多いので、ほとんどの場合はきちんと理解してから使うことになりますね。当たり前ですが。

というわけで、これを参考にする場合は自己責任でお願いします(笑)