2

メール アカウントにスパムが殺到しているユーザーがいます。彼は多数の電子メール アカウントを持っているため、1 つまたは 2 つのアドレスしか持たない場合よりも多くの影響を受けるのではないかと私は疑っています。

彼のメールボックスをスキャンして、メールが送信されたアドレスの数をレポートするコードを作成したいと思います (理想的には、彼のメールボックスに配信されたアドレスです。どのアドレスが彼に届いたのか知​​りたいです。)

エンベロープに存在する場合は To: を取得できますが、存在しない場合は Cc: などの代替手段にフォールバックする必要があり、おそらく実際にはメッセージヘッダーで regex-y を取得して、このメッセージが誰に配信されたかを識別します。私はそれを扱うことができます。Ruby msg オブジェクトを分解する方法がわかりません。

「imap.fetch から返されたオブジェクト msg があることを知っているので、msg.to や msg.from などの利用可能なさまざまなメソッドを調べるにはどうすればよいでしょうか?」

また、おそらく「Ruby のメールのような派手なメール ライブラリを使用する必要がありますか?」

ここまでのコード - Ruby はまったくの初心者です。

imap = Net::IMAP.new(server)
imap.login(user, pass)
imap.select(folder)

imap.search(['ALL']).each do |message_id|
  msg = imap.fetch(message_id,'ENVELOPE')[0].attr['ENVELOPE']
  if msg.to
    puts "#{msg.to[0].mailbox}@#{msg.to[0].host}: \t#{msg.from[0].name}: \t#{msg.subject}"
  else 
#    puts msg.inspect
    msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822']
    puts msg.inspect
    quit
  end
#   p msg.methods
end
4

1 に答える 1

4

私が持っているスクリプトに対して、これと同様のことを行います。それはあなたを助けるかもしれません。覚えておくべき重要な点は、要素が 1 つしかない場合でも、返される要素はすべて配列であるということです。

imap.search(["ALL"]).each do |msg|
  envelope = imap.fetch(msg, "ENVELOPE")[0].attr["ENVELOPE"]
  sender = envelope.from[0].mailbox # This will give you the mailbox name without @domain.com
  recipient = envelope.to[0].mailbox # You can also do envelope.to.each { operations } to get the full list of recipients
end

エンベロープには、見ようとしているすべてのデータが含まれています。

Envelope.from[0].mailbox は、@domain.com のない送信者です。

Envelope.to[0] は、@domain.com のない最初の受信者です。

封筒.件名は件名です

などなど

于 2010-02-15T13:07:32.403 に答える