私は電子メールを送信するためにRubyスクリプトと "mail" gemを使用しています。ディスクに保存せずにRubyで電子メールでグラフを送る方法は?
質問 - どのようにディスクに保存せずにRubyで電子メールでグラフを送信することができましたか?これは可能ですか?どのグラフ作成ツールをお勧めしますか?そして「メール」宝石は何とかこれをストリーミングしますか? (またはそれをディスクに保存する必要があります)可能であれば/簡単なサンプルコード行はどうやって偉大になるのでしょうか?
私は電子メールを送信するためにRubyスクリプトと "mail" gemを使用しています。ディスクに保存せずにRubyで電子メールでグラフを送る方法は?
質問 - どのようにディスクに保存せずにRubyで電子メールでグラフを送信することができましたか?これは可能ですか?どのグラフ作成ツールをお勧めしますか?そして「メール」宝石は何とかこれをストリーミングしますか? (またはそれをディスクに保存する必要があります)可能であれば/簡単なサンプルコード行はどうやって偉大になるのでしょうか?
あなたの完全な答え。
これは、単純化するために純粋な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
私はあなたができなかった理由は分かりません。 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があり、あなたはあなたのニーズとあなたの制約をより適合させるものを選択しなければなりません。
もっと情報が参考になると思います。 「グラフ」とは何ですか?ノードとエッジを持つもの、機能的なデータをグラフィック表示したもの、まったく異なるものですか?どのような種類のデータを使い始めていますか?なぜディスクへの保存に問題がありますか? – dantswain
@dantswain Re graphは単純なグラフ、例えば棒グラフを作成するもので、X、Yなどのハッシュ値を入力することを意味していました。 1つの特定の場合。だから、グラフhttp://www.germane-software.com/software/SVG/SVG%3A%3AGraph/下のCorensのリンクから参照されるSVGライブラリのようなものはうまく見えます。 – Greg
@ Corenの答えが正しい軌道にあるように見えます。 – dantswain