Как получить адрес получателя письма через IMAP в Ruby - PullRequest
2 голосов
/ 15 февраля 2010

У нас есть пользователь, чей почтовый аккаунт залит спамом. Я подозреваю, что он выставляет большое количество учетных записей электронной почты и поэтому подвергается большему, чем он мог бы иметь только один или два адреса.

Я хочу создать некоторый код, который будет сканировать его почтовый ящик и сообщать о количестве адресов, которые были отправлены по почте (в идеале те, которые были доставлены в его почтовый ящик, например, если он BCC-адрес и To: is billg @ microsoft) .com, я хотел бы знать, какой адрес был тот, который достиг его).

Я могу получить To: если он присутствует в конверте, но если нет, то мне нужно прибегнуть к альтернативам, таким как Cc: и, возможно, на самом деле получить regex-y в заголовках сообщения, чтобы идентифицировать, для кого это сообщение было доставлено. Я могу справиться с этим. Я просто не уверен, как разобрать объект Ruby msg.

Так что, возможно, лучшим вопросом для меня будет: «зная, что у меня есть объект msg, возвращенный из imap.fetch, как я могу проверить различные доступные методы, такие как msg.to и msg.from?»

И, возможно, также «я должен использовать необычную почтовую библиотеку, такую ​​как Ruby's Mail?»

Код до сих пор - я ДЕЙСТВИТЕЛЬНО новичок в 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

1 Ответ

4 голосов
/ 15 февраля 2010

Я делаю что-то похожее на этот скрипт, который у меня есть. Это может помочь вам. Необходимо помнить, что все возвращаемые элементы являются массивами, даже если они имеют только 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]. Почтовый ящик - отправитель без @ domain.com

envelope.to [0] - первый получатель без @ domain.com

envelope.subject является субъектом

и так далее и так далее

...