2012-03-19 17 views
4

私は電子メールを送信するためにRubyスクリプトと "mail" gemを使用しています。ディスクに保存せずにRubyで電子メールでグラフを送る方法は?

質問 - どのようにディスクに保存せずにRubyで電子メールでグラフを送信することができましたか?これは可能ですか?どのグラフ作成ツールをお勧めしますか?そして「メール」宝石は何とかこれをストリーミングしますか? (またはそれをディスクに保存する必要があります)可能であれば/簡単なサンプルコード行はどうやって偉大になるのでしょうか?

+0

もっと情報が参考になると思います。 「グラフ」とは何ですか?ノードとエッジを持つもの、機能的なデータをグラフィック表示したもの、まったく異なるものですか?どのような種類のデータを使い始めていますか?なぜディスクへの保存に問題がありますか? – dantswain

+0

@dantswain Re graphは単純なグラフ、例えば棒グラフを作成するもので、X、Yなどのハッシュ値を入力することを意味していました。 1つの特定の場合。だから、グラフhttp://www.germane-software.com/software/SVG/SVG%3A%3AGraph/下のCorensのリンクから参照されるSVGライブラリのようなものはうまく見えます。 – Greg

+0

@ Corenの答えが正しい軌道にあるように見えます。 – dantswain

答えて

7

あなたの完全な答え。

これは、単純化するために純粋なRuby PNGグラフを使用しています。実際のアプリケーションでは、SVG、高速ネイティブコード、またはグラフAPIを使用する可能性があります。

#!/usr/bin/env ruby 
=begin 

How to send a graph via email in Ruby without saving to disk 
Example code by Joel Parker Henderson at SixArm, [email protected] 

    http://stackoverflow.com/questions/9779565 

You need two gems: 

    gem install chunky_png 
    gem install mail 

Documentation: 

    http://rdoc.info/gems/chunky_png/frames 
    https://github.com/mikel/mail 

=end 


# Create a simple PNG image from scratch with an x-axis and y-axis. 
# We use ChunkyPNG because it's pure Ruby and easy to write results; 
# a real-world app would more likely use an SVG library or graph API. 

require 'chunky_png' 
png = ChunkyPNG::Image.new(100, 100, ChunkyPNG::Color::WHITE) 
png.line(0, 50, 100, 50, ChunkyPNG::Color::BLACK) # x-axis 
png.line(50, 0, 50, 100, ChunkyPNG::Color::BLACK) # y-axis 

# We do IO to a String in memory, rather than to a File on disk. 
# Ruby does this by using the StringIO class which akin to a stream. 
# For more on using a string as a file in Ruby, see this blog post: 
# http://macdevelopertips.com/ruby/using-a-string-as-a-file-in-ruby.html 

io = StringIO.new 
png.write(io) 
io.rewind 

# Create a mail message using the Ruby mail gem as usual. 
# We create it item by item; you may prefer to create it in a block. 

require 'mail' 
mail = Mail.new 
mail.to = '[email protected]' 
mail.from = '[email protected]' 
mail.subject = 'Hello World' 

# Attach the PNG graph, set the correct mime type, and read from the StringIO 

mail.attachments['graph.png'] = { 
    :mime_type => 'image/png', 
    :content => io.read 
} 

# Send mail as usual. We choose sendmail because it bypasses the OpenSSL error. 
mail.delivery_method :sendmail 
mail.deliver 
5

私はあなたができなかった理由は分かりません。 mail's documentationでは、このサンプルコードを見ることができます:

mail = Mail.new do 
    from  '[email protected]' 
    to  '[email protected]' 
    subject 'Here is the image you wanted' 
    body  File.read('body.txt') 
    add_file :filename => 'somefile.png', :content => File.read('/somefile.png') 
end 

mail.deliver! 

あなたは自分のメモリ内のファイルの内容を:content => ...のターゲットを交換する必要があります。そしてそれで十分でしょう。添付ファイルは、base64で再エンコードされ、メールの最後に追加されるため、一時的にでもディスクに保存する必要はありません。

質問の2番目の部分には、そこに多くのプロット/グラフのlibがあります。例えば、this questionまたはthis libを参照してください。

この種の問題については、実際には他のものよりも1つのライブラリはありません。多くの異なった使用のための多くのlibがあり、あなたはあなたのニーズとあなたの制約をより適合させるものを選択しなければなりません。

関連する問題