SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|10|11|

2024-08-09(Fri) Maveの力を借りて、今、必殺の、メール送信ッ!

  世はAI流行りであるが、AIへの関わり方もイロイロで、スマホで語りかける関わり方もあれば、ゼロから学習させる関わり方もある。以前にやった画像認識は、既存のモデルを使っているからその中間か。で、いまは仕事で、客からの問い合わせに対する回答文の自動作成に取り組んでいる。半ば遊びでもあるのだが。

  日本語で既存の生成AIに問い合わせる形なので、HTTP経由でAPIを叩いているだけであり、技術レベルとしては上記の画像認識よりも浅い。しかし「客からの問い合わせ(メール)に応答し」さらに「客からの『再』問い合わせ(メール)にも応答する」となると、メールのハンドリングだけで地味に大仕事である。キチンとメールを蓄積しておき、キチンとスレッド単位でメール本文を引き出せなくてはならない。軽く「メール本文」て言うけど、エンコード方式はひとつじゃないし、マルチパートだったりするしで、容易ではない。

  そこに絶好なのが自作のメーラである「Mave」だ。メールの着信を検知したら、そのメッセージIDを元に、過去のメールをスレッドの頭から順に取り出すことができる。

mail0 = folder.get_mail_by_message_id(message_id)
mail0.folder.thread_sqs(mail0.sq).each {|sq|
	mail = mail0.folder.get_mail(sq)
	mailbody = ''; 	mail.body_each {|line|
		mailbody << line
	}
  :

  我ながら、悪くないコードだ。sqってのは各メールのシーケンス番号。これだけのコードで、過去の問い合わせの経緯をまとめることができる。

  で、本題。まとめた経緯をAIに渡し、自動作成させた回答文をAIから受取り、どうする? 客に返す……のはちょっと早すぎる。当面は回答作成担当者へのサジェスチョンに使うのがせいぜいだ。が、どっちにしろ、回答文はメールで送ることになる。どうやって?

  以前に書いたライブラリを使おうと思ったが、そこでふと思いついた。外からMaveのメール受信機能を拝借してメールをpopするmave_fetchコマンドがあるのだから、逆に、外からMaveのメール送信機能を拝借してメールをsmtpするmave_sendコマンドがあってもいいんじゃないかと。

  そうすれば、改めて送受信アカウントなどを設定する必要もなくなるし、勝手に「送信済み(Sent)」フォルダにメールが残るし、勝手に「電子署名(S/MIME)」にも対応することになり、いいことづくめだ。

  で、書いてみたら、紆余曲折の末、実質は以下だけで済んでしまった。我ながら、無駄がないにも程がある。書いてあるまんまだ。

Encoding.default_external = 'UTF-8'
begin
	mave = MaveController.new({:CONFIGS => @configs})
	header = {}
	header['Subject'] = 'テストメール'
	header['From'] = '送信元 <from@example.com>'
	header['To'] = '送信先 <to@example.com>'
	header['X-Mave-Store-Folder'] = 'Outbox'
	mave.generate_mail(header, [], ['テスト'])
	mave.send_mail_smtp
	mave.kill_mave
rescue
	print($!.message + $/)
end

  画像の説明

  あとはこれを、生成AIとやりとりするコードの後に足すだけだ。はい、これにて、今回の盆栽の剪定作業は終了。いやぁ、盆栽って本当に楽しいもんですねぇ。ではまた。