質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

929閲覧

メールの内容の複数取得

naonao11

総合スコア97

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2018/07/30 05:36

開発環境:ubuntu 18.0.4

したいこと

fetchmailを用いてメールを取ってき,textProcessing.rbにメールの内容を入れ特定の処理を行い,csvファイルにFROM,氏名,参加イベント日時(氏名,参加イベント日時については本文に書いています)を取ってきたく思います。

fetchmailの設定内容について

defaults uidl no mimedecode no rewrite mda /home/name/process/textProcessing.rb # メールを渡すプログラムのフル>パス keep poll mail.example.jp protocol POP3 username example@example.jp password xxxxxxxx ssl

textProcessing.rbについて

ruby

1#! /usr/bin/ruby 2# coding: utf-8 3#------------------------------------------------- 4# Ruby script to get a mail via alias of postfix. 5#------------------------------------------------- 6require 'mail' 7 8class GetMail 9 def initialize 10 dt = Time.now.strftime("%Y%m%d_%H%M%S%L") 11 @out_file = "/home/name/#{dt}.txt" 12 end 13 14 def execute 15 open(@out_file, "w") do |f| 16 mails = Mail.new($stdin.read) 17 for mail in mails 18 f.puts mail.from.first 19 f.puts mail.subject 20 f.puts "Body:\n#{mail.body.decoded.encode("UTF-8", mail.charset)}" 21 end 22 end 23 rescue => e 24 $stderr.puts "[#{e.class}] #{e.message}" 25 e.backtrace.each{|trace| $stderr.puts "\t#{trace}"} 26 exit 1 27 end 28end 29 30exit unless $0 == __FILE__ 31GetMail.new.execute

以下エラーが出てきます。

[NoMethodError] undefined method `each' for nil:NilClass

わからない点について

・一度fetchmailを回すともう一回メール内容が取れなくなるのでその対処
・複数のメールアドレスの取得
・body内から特定の情報を取ってくる方法

ご助力のほどよろしくお願いします。。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

for mail in mailsは何を意図した物でしょうか?mailsMailオブジェクトなので、forつまりeachは出来ません。

[NoMethodError] undefined method `each' for nil:NilClass

Mail.newの結果がnilになった原因は分かりません。

・一度fetchmailを回すともう一回メール内容が取れなくなるのでその対処

~/.fetchidsに取り込んだメールのPOPIDがあるので、該当行を消せばそのメールを再度取り込みます。

・複数のメールアドレスの取得

これは意味が分からない。

・body内から特定の情報を取ってくる方法

普通のテキスト処理です。正規表現など。

投稿2018/07/30 06:41

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

naonao11

2018/07/30 06:52

ありがとうございます! メール処理について1つずつメールアドレスを取りたいと思い,特定の時間に来た複数のメールのアドレスを取得するためにforを使いました… テキスト処理とありますが,mail.body のときにおこなうのでしょうか …?
otn

2018/07/30 07:21

> メール処理について1つずつメールアドレスを取りたいと思い,特定の時間に来た複数のメールのアドレスを取得するためにforを使いました… 意味が分かりません。 > テキスト処理とありますが,mail.body のときにおこなうのでしょうか …? mail.body.to_sが文字列なので、そこから情報を取り出します。
naonao11

2018/07/30 07:29

申し訳ございません!fetchmailから取れてきていました。。。 mail.body.to_sから取ってくると(入れた内容:ほげほげ明日) --0000000000007d67600572325eeb Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 44G744GS44G744GS5piO5pelDQo= --0000000000007d67600572325eeb Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+44G744GS44G744GS5piO5pelPC9kaXY+DQo= --0000000000007d67600572325eeb-- と出てきました…
otn

2018/07/31 00:52

マルチパートのメールであるなら、gem mail の機能でtext/plainの部分だけ取り出せます。 mail.body.parts[0].body.to_s text/plainがparts[0]じゃない可能性もあるので、各要素のcontent_typeを調べる必要があります。
naonao11

2018/07/31 00:55

mail.text_part.bodyで取得できました! ありがとうございます!
otn

2018/07/31 00:58

あ、そんなメソッドもあったんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問