コマンドラインから添付ファイル付きメールを送信したい。cron で定期的にメール送信するバッチが必要になった。
エラーを追求する手間をかけるよりも、今回は他の解決策を探した方が良いと私のゴーストがささやいている。「From の指定」など、mpack には無い機能も使いたいし。というわけで、今回は Perl か Ruby で SMTP と Content-Type: multipart/mixed; を扱うスクリプトを書くことにしよう。
ActivePerlからメールを送る
http://member.nifty.ne.jp/hippo2000/perltips/perlmail.htm
さすがは Perl、全くスクリプトを書かなくてもやりたいことを達成できてしまった。
Google で ruby 添付ファイル メール 送信を検索。なんだかあまりヒットしないな。こういう細かい仕事を自動化するスクリプトの需要は結構あると思うんだけどな。検索語が悪いのかも。英語でやってみよう。Google で ruby base64 mail attachment を検索。[ruby-list:30312] composing a mail with a big file attached がヒット。なるほど、Tmail という便利なライブラリがあるんだね。
TMail
http://www.loveruby.net/ja/prog/tmail.html
オフィシャルサイトの説明には「Ruby 用 メール総合ライブラリ」って書いてある。かなり高機能なライブラリのようだ。あ、Tmail の作者は 「Rubyソースコード完全解説」や「Ruby レシピブック」で有名な青木さんだ。
tar を展開して、
setup.rb config
setup.rb setup
setup.rb install
を実行するだけ。
コンパイルの時にいろいろエラーがでたけど、セットアップスクリプトが ignore するよって言ってるんだから気にしないことにする。
さて、この便利なライブラリ Tmail を使えば、簡単に添付ファイル付きメール送信スクリプトが書けるだろう。でも、やっぱりだれかが同じようなスクリプトを書いているはず。それを探して使うほうが早いだろう。ウェブを探してみると、高林さんが書いた「vCard ファイルを添付したメールを作る」が Tmail を使っている。短いし、これをちょっと修正すればやりたいことは達成できそう。
vCard ファイルを添付したメールを作る
http://namazu.org/~satoru/attic/vcardmail.rb
- 2003-12-12 でも同じ記事を書いたけど
2003-12-12 にも同じ「添付ファイル付きメールをコマンドラインから送信」という記事を書いたが、あれは Linux での話だ。今回は cygwin で同じことをやりたい。本当は前回の記事でも使った mpack を cygwin 環境でコンパイルして使おうと思ったんだけど、コンパイルエラーとなってしまった。エラーを追求する手間をかけるよりも、今回は他の解決策を探した方が良いと私のゴーストがささやいている。「From の指定」など、mpack には無い機能も使いたいし。というわけで、今回は Perl か Ruby で SMTP と Content-Type: multipart/mixed; を扱うスクリプトを書くことにしよう。
- Perl で添付ファイル付きメールを送信
Perl であれば、すでに添付ファイル付きメール送信スクリプトのサンプルが河馬屋二千年堂のウェブサイトにあったはずなので、それを使えばいい。このサンプルを動かすには、いくつか必要なモジュールがある。その部分だけ引用しておく。ActivePerlからメールを送る
http://member.nifty.ne.jp/hippo2000/perltips/perlmail.htm
添付ファイル付のメールを送信する + 日本語への対応+HTMLメール
use Net::SMTP;
use MIME::Entity;
use MIME::Words qw (:all);
require 'jcode.pl';
さすがは Perl、全くスクリプトを書かなくてもやりたいことを達成できてしまった。
- RUby で添付ファイル付きメールを送信
Ruby は標準インストールされるライブラリが充実してるから、もしかしたら smtp や base64 を扱うクラス、果ては添付ファイル付きメール送信クラスなんてものまで標準で用意されてるかも。ちょっと期待。Google で ruby 添付ファイル メール 送信を検索。なんだかあまりヒットしないな。こういう細かい仕事を自動化するスクリプトの需要は結構あると思うんだけどな。検索語が悪いのかも。英語でやってみよう。Google で ruby base64 mail attachment を検索。[ruby-list:30312] composing a mail with a big file attached がヒット。なるほど、Tmail という便利なライブラリがあるんだね。
TMail
http://www.loveruby.net/ja/prog/tmail.html
オフィシャルサイトの説明には「Ruby 用 メール総合ライブラリ」って書いてある。かなり高機能なライブラリのようだ。あ、Tmail の作者は 「Rubyソースコード完全解説」や「Ruby レシピブック」で有名な青木さんだ。
- Tmail のインストール
cygwin でも無事インストールできた。tar を展開して、
setup.rb config
setup.rb setup
setup.rb install
を実行するだけ。
コンパイルの時にいろいろエラーがでたけど、セットアップスクリプトが ignore するよって言ってるんだから気にしないことにする。
さて、この便利なライブラリ Tmail を使えば、簡単に添付ファイル付きメール送信スクリプトが書けるだろう。でも、やっぱりだれかが同じようなスクリプトを書いているはず。それを探して使うほうが早いだろう。ウェブを探してみると、高林さんが書いた「vCard ファイルを添付したメールを作る」が Tmail を使っている。短いし、これをちょっと修正すればやりたいことは達成できそう。
vCard ファイルを添付したメールを作る
http://namazu.org/~satoru/attic/vcardmail.rb
- スクリプト完成、いざメール送信
高林さんのスクリプトほとんどそのまま。元のスクリプトが GPL2 なので、以下のスクリプトのライセンスも GPL2。#!/usr/bin/env ruby
require 'kconv'
require 'tmail'
require 'net/smtp'
def generate_filename (vcard)
/^FN:(.*)/ =~ vcard
name = $1
"=?ISO-2022-JP?B?" + (name + '.vcf').tojis.to_a.pack('m').chomp + "?="
end
raise unless ARGV.length == 2
to = ARGV.shift
vcard = File.open(ARGV.shift).readlines.join('')
mail = TMail::Mail.new
mail.to = to
mail.from = 'example@example.com'
mail.subject = "vcard"
mail.date = Time.now
mail.mime_version = '1.0'
message = TMail::Mail.new
message.set_content_type('text', 'plain')
message.transfer_encoding = '7bit'
message.body = "vcard is attached.\n"
filename = 'atch'
encoded_vcard = [vcard].pack('m').chomp.gsub(/.{76}/, "\\1\n")
attachment = TMail::Mail.new
attachment.body = encoded_vcard
attachment.transfer_encoding = 'base64'
attachment.set_content_type('text', 'x-vcard', 'name' => filename)
attachment.set_content_disposition('attachment',
'filename' => filename)
mail.parts.push(message)
mail.parts.push(attachment)
mail.write_back
$smtp_server = '10.83.0.38'
Net::SMTP.start($smtp_server) do |smtp|
smtp.sendmail(mail.encoded, mail.from, to)
end
- 2004年7月7日追記
って、あれ? この記事はもう少し加筆してから公開しようかと思ってたんだけど、いつの間にか公開状態になってる。まあいいや。上記スクリプトも変数名を直したり、複数添付ファイルに対応しようと思ってた。もしかしたら全く動かないかもしれない。そのうち直す予定。- 2004-10-09 追記
Ruby 1.8 の標準ライブラリだけで動作する添付ファイル付きメール送信スクリプトを 2004-10-09 に書いた。以上の内容はhttp://sonic64.com//2004-07-02.htmlより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます
モバイルやる夫Viewer Ver0.14