バリケンのRuby日記 RSSフィード

2007-02-12

[] Gmailメールを送る  Gmailでメールを送る - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  Gmailでメールを送る - バリケンのRuby日記  Gmailでメールを送る - バリケンのRuby日記 のブックマークコメント

またmechanizeの練習として、こんどはテキストファイルで書いた文章をGmailで送るスクリプトを作ってみたよ(Windows版)。ちなみにWindows以外でも「$KCODE = 's'」を「$KCODE = 'e'」か「$KCODE = 'u'」にすれば多分動くと思うよ。

$KCODE = 's'

USERNAME = '(ユーザ名)'
PASSWORD = '(パスワード)'

require 'mechanize'
require 'kconv'
require 'fileutils'

body = open('up.txt').read.to_a
to = body.shift.chomp
cc = body.shift.chomp
bcc = body.shift.chomp
subject = body.shift.chomp
body = body.join

agent = WWW::Mechanize.new
gmail_page = agent.get('http://mail.google.com/mail/h/')

login_form = gmail_page.forms.first
login_form['Email'] = USERNAME
login_form['Passwd'] = PASSWORD

agent.submit(login_form)

agent.get('http://mail.google.com/mail/h/')

gmail_page = agent.get('?v=b&pv=tl&cs=b')

mail_form = gmail_page.form('f')

mail_form['to'] = to
mail_form['cc'] = cc
mail_form['bcc'] = bcc
mail_form['subject'] = subject.toutf8
mail_form['body'] = body.toutf8

files = ARGV.map do |i|
  File.expand_path(i)
end

if ARGV[0]
  raise if not File.exist?(files[0]) or File.directory?(files[0])
  mail_form.file_uploads.name('file0').first.file_name = files[0]
end

send_button = mail_form.buttons.name('nvp_bu_send')

agent.submit(mail_form, send_button)

これをgmail_sender.rbとして保存してね。スクリプト中の「(ユーザ名)」と「(パスワード)」は、各自の環境に合わせて編集してね。あ、もちろんスクリプト中に生パスワードを書くことになるから、このファイルの扱いには十分注意してね。

使い方

gmail_sender.rbが置かれたフォルダに、up.txtというテキストファイルを作ってね。ファイルは、1行目が「To:」フィールド、2行目が「Cc:」フィールド、3行目が「Bcc:」フィールド、4行目がメールタイトル、5行目以降がメールの本文になるよ。複数のメールアドレスを指定したいときは、カンマで区切ってね。たとえば、up.txtを次のようにすると、

hoge@example.com, fuga@example.com
foo@example.com
bar@example.com
メール送信のテスト
Gmailでメールを送ってみるテストです。

ちゃんと届きましたか?

「To:」が「hoge@example.com, fuga@example.com」、「Cc:」が「foo@example.com」、「Bcc:」が「bar@example.com」、メールタイトルが「メール送信のテスト」になるよ。

Cc:」や「Bcc:」フィールドが不要なら、2行目と3行目は空行(改行だけの行)にしてね。

あとは、

> ruby gmail_sender.rb

で、up.txtの内容でメールが送信できるよ。さらに

> ruby gmail_sender.rb [添付ファイル名]

で、「[添付ファイル名]」で指定したファイルを添付して送ることができるよ。いまのところ、手抜きして添付ファイルは1つしか付けられない仕様で作っちゃったから、複数ファイルを送りたいときはアーカイブして送ってね。

garyogaryo2007/02/23 11:23こんにちは。こちらのエントリーを参考にPRagger用Gmail送信プラグイン作ってみました。PRaggerの開発元に送ってもいいですか?http://ruby.g.hatena.ne.jp/garyo/20070223/1172196852

muscovyduckmuscovyduck2007/02/23 11:41garyoさん>
日記中のソースコードは、ライセンスは明示していませんが、Rubyライセンス準拠でどうぞご自由にご利用ください!
http://www.ruby-lang.org/ja/LICENSE.txt

garyogaryo2007/02/23 11:43ありがとうございます。

muda_kskmuda_ksk2007/09/06 00:08昨日こちらのスクリプトを使用させてもらおうとしたのですが、mail_form = gmail_page.form('f')でエラーがでました。
agent.get('http://mail.google.com/mail/h/')
gmail_page = agent.get('?v=b&pv=tl&cs=b')
これを
gmail_page = agent.get('http://mail.google.com/mail/h/?v=b&pv=tl&cs=b')
とするとスクリプトは終わったようにみえるのですが、
送信できませんでした。
サポートされないブラウザとして扱われているようです。

muscovyduckmuscovyduck2007/09/06 07:22muda_kskさん>
Gmailの仕様が変わったのかもしれませんね。
agent = WWW::Mechanize.newの次の行に
agent.user_agent_alias = 'Windows IE 6'
とか入れるとどうでしょうか?

muda_kskmuda_ksk2007/09/06 21:49user agent設定してみましたが、送信されないようです。
ブラウザで簡易HTMLモードを試していると、
http://mail.google.com/mail/h/ランダムな文字/?v=b&pv=tl&cs=b
のようになっていてセッション管理でもしているのではないかと思われます。
また、ログインボタンを押した後のページ遷移ではMetaタグで行き先を指定されるよう、
なのですが、
follow_meta_refresh = ture
などとするとuriのパースで例外が出てしまいます。
なかなか手ごわい感じです。