С Новым годом! Форум программистов, компьютерный форум, киберфорум
Ruby
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135

Получить имя отправителя письма (Ruby Mail)

30.01.2017, 17:39. Показов 1581. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Забираю почту с ящика таким кодом:

Ruby
1
2
3
4
5
6
7
pop = Net::POP3.APOP(apop).new(host, port)
pop.start(pop_options[:username], pop_options[:password]) do |pop_session|
    pop_session.each_mail do |msg|
      message = msg.pop
      #делаю мир лучше
    end
end
Как из message вытащить имя отправителя? message.from возвращает только адрес. Также особенность, что в некоторых письмах заголовок From выглядит так:
From: "SSK_POS" <example@example.ru>\r\n

А, допустим, с яндекса приходит в BASE64:
From: =?utf-8?B?0KDQvtC80LDQvSDQodC60LjQtNCw0L0=?= <example@ya.ru>\r\n
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
30.01.2017, 17:39
Ответы с готовыми решениями:

Как узнать имя отправителя письма в Outlook?
По теме нашел в этом форуме ответ с таким макросом Dim oApp As Outlook.Application Dim oNameSpace As NameSpace Dim oFolder As...

Объект MailItem: как получить email отправителя письма?
Задача получить список сообщений из заданной папки Outlook'а В списке дата получения, тема письма, отправитель, email отправителя. ...

Pop без Imap, получить адрес отправителя и тело письма
данная тема здесь уже обсуждалась но до конца так и не решилась, вот помогите до вести до конца вот код $connect = fsockopen...

10
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
31.01.2017, 09:06
Воспользуйтесь гемом mail
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
require 'mail'
 
mail = Mail.new do
  from '=?utf-8?B?0KDQvtC80LDQvSDQodC60LjQtNCw0L0=?= <example@ya.ru>'
  to 'test@example.com'
  subject 'This is a test mail'
  body 'Hello my friend'
end
puts mail[:from]
 
Mail.defaults do
  retriever_method :pop3,
    address: 'pop.example.com',
    port: 110,
    user_name: 'username@example.com',
    password: 'password'
end
 
mail = Mail.first
puts mail[:from]
puts mail[:from].display_names # puts mail[:from].display_names.first
puts mail.from
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
31.01.2017, 09:30  [ТС]
j2FunOnly, дело в том, что данный гем я уже пробывал. Проблема в том, что не пойму, каким образом мне забрать все непрочитанные письма с ящика, а также после получения пометить их как прочитанные, чтобы в следующий раз они не забирались?
Код, который я использовал, так и делает, но не возвращает корректно отправителя.
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
01.02.2017, 08:27
Цитата Сообщение от Neo-X2006 Посмотреть сообщение
Код, который я использовал, так и делает
Неужели?
POP поддерживает простые требования «загрузи-и-удали» для доступа к удаленным почтовым ящикам. Хотя большая часть POP-клиентов предоставляет возможность оставить почту на сервере после загрузки, использующие POP клиенты обычно соединяются, извлекают все письма, сохраняют их на пользовательском компьютере как новые сообщения, удаляют их с сервера, после чего разъединяются.

Другие протоколы, в частности IMAP, предоставляют более полный и комплексный удаленный доступ к типичным операциям с почтовым ящиком. Многие клиенты электронной почты поддерживают как POP, так и IMAP; однако, гораздо меньше интернет-провайдеров поддерживают IMAP.
https://ru.wikipedia.org/wiki/POP3

Вы и сами можете почитать в интернетах по запросу "pop3 unseen messages" - по правилам форума я оставлю для вас найденое: http://stackoverflow.com/quest... d-messages

POP3 протокол не имеет механизма, с помощью которого можно различать прочитаные и не прочитаные письма. Вы можете забрать и удалить почту с сервера. Если вы её не удаляете, то вам надо со стороны клиента реализовать какой-либо алгоритм различия сообщений, например по уникальному идентификатору.

https://www.example-code.com/ruby/pop3_unread.asp

P. S. Не прошло и года Получение электронной почты Используйте IMAP
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
16.02.2017, 11:56  [ТС]
Цитата Сообщение от j2FunOnly Посмотреть сообщение
POP поддерживает простые требования «загрузи-и-удали» для доступа к удаленным почтовым ящикам.
j2FunOnly, ок, подскажите пожалуйста, как при использовании гема mail сделать действие "удали"?
"Загрузи" он делает корректно, но про "удали" в документации не слова.
Цитата Сообщение от j2FunOnly Посмотреть сообщение
Неужели?
Именно так.
Ruby
1
2
3
4
5
6
7
8
9
10
require 'net/pop'
 
pop.start(pop_options[:username], pop_options[:password]) do |pop_session|
        pop_session.each_mail do |msg|
        message = msg.pop
        message_id = (message =~ /^Message-I[dD]: (.*)/ ? $1 : '').strip
        msg.delete
            
    end
end
Конкретно строчка msg.delete помечает сообщение как удаленное, и при следующем старте скрипта его не загружает. Я бы и пользовался данным кодом, если-бы корректно возвращалось имя отправителя
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
17.02.2017, 00:31
Neo-X2006, ну смотрите, по протоколу POP3 считываются письма и можно помечать их на удаление, которое выполнится при завершении сессии. Вы в первом сообщении скрыли, что ставите метку на удаление, за многозначительным
Цитата Сообщение от Neo-X2006 Посмотреть сообщение
#делаю мир лучше
К сожалению, у меня нет под рукой сервера, который умеет работать по протоколу APOP. Но, gem mail - это обёртка над net/pop, в котором реализованы всякие танцы с кодировками в заголовках почтовых сообщений и прочее, неужели такой же подход с удалением полученых сообщений, как и при использовании net/pop из стандартной библиотеки не подходит?

Если бы вы могли привести воспроизводимый пример проблемы, с интересом бы поэкспериментировал. Нет никакого желания разводить тут полемику.
1
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
02.03.2017, 11:54  [ТС]
j2FunOnly, спасибо.
Как я понял, считывать определенную папку нельзя? На данный момент забирается также почта из папки спам, можно как-то забирать только из входящих или POP3 не поддерживает такое?
0
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
03.03.2017, 12:19  [ТС]
Цитата Сообщение от j2FunOnly Посмотреть сообщение
неужели такой же подход с удалением полученых сообщений, как и при использовании net/pop из стандартной библиотеки не подходит?
В том то и дело, что нет. В данной библиотеке можно удалить все разом сообщения, используя Mail.delete_all.
Цитата Сообщение от j2FunOnly Посмотреть сообщение
вы могли привести воспроизводимый пример проблемы
Проблема в том, что при использовании такого подхода:
Ruby
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 emails = Mail.all(:order => :asc)
      puts Mail.inspect
      emails_count = emails.count
 
      if emails_count > 0
        emails.each do |mail|
          success_create = create_issue mail
          unless create_issue mail
            next
          end
          mail.delete
        end
        #Mail.delete_all
      end
mail.delete не срабатывает, так просто нет такого метода. В методе create_issue я обрабатываю полученные письма и сохраняю их в базу грубо говоря. Если успешно, то это письмо можно пометить как прочтенное, и в следующий раз не выгребать его из ящика (скрипт работает каждые 10 минут). Можно только удалить сразу все Mail.delete_all. Но а если возникает какая-то ошибка, то в след раз оно просто не заберется из ящика, т.к. оно уже помечено как удаленное, и следовательно оно не попадет мне в базу. Конечно, есть вариант сохранять ID письма , и при каждом запуске проверять есть уже такое письмо в базе или нет, при этом не удаляя письма. Конечно, я ограничен протоколом POP3, возможно это единственный выход
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
03.03.2017, 13:43
Neo-X2006, попробуйте Mail#find_and_delete в связке с Mail::Message#skip_deletion
Ruby
1
Mail.find_and_delete { |mail| mail.skip_deletion unless create_issue(mail) }
1
0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135
03.03.2017, 14:16  [ТС]
Цитата Сообщение от j2FunOnly Посмотреть сообщение
попробуйте Mail#find_and_delete в связке с Mail::Message#skip_deletion
Не пойму, данную конструкцию необходимо использовать внутри моего цикла? find_and_delete возвращает первые найденные письма (last or first emails. The default is :first.), но какие? Каким условиям они удовлетворяют?
0
the hardway first
Эксперт JS
 Аватар для j2FunOnly
2475 / 1847 / 910
Регистрация: 05.06.2015
Сообщений: 3,610
03.03.2017, 14:51
Neo-X2006, данную конструкцию использовать вместо вашего цикла.
По опциям, если я правильно всё понял, то what: :first - вернет старые письма, what: :last - вернет новые письма, :count - количество писем (по умолчанию 10), :order - порядок этих писем :asc - сначала старые, :desc - сначала новые. Например если вы хотите вывести в консоль 5 писем начиная с новейших, то:
Ruby
1
2
3
Mail.find(what: :last, order: :desc, count: 5) do |mail|
  puts mail.subject
end
Если вы хотите удалять письма, то можно так:
Ruby
1
2
3
Mail.find(what: :last, order: :desc, count: 5, delete_after_find: true) do |mail|
  puts mail.subject
end
Что эквивалентно
Ruby
1
2
3
Mail.find_and_delete(what: :last, order: :desc, count: 5) do |mail|
  puts mail.subject
end
А если надо оставить, например, все письма, кроме отчетов о доставке
Ruby
1
2
3
4
Mail.find_and_delete(what: :last, order: :desc, count: 5) do |mail|
  puts mail.subject
  mail.skip_deletion unless mail.subject == 'Successful Mail Delivery Report'
end
C параметром :count сами определитесь, смотря сколько писем вам приходит за эти 10 минут.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.03.2017, 14:51
Помогаю со студенческими работами здесь

Функция mail(): Не очень понятно, как указывается e-mail отправителя. Разъясните кто-нибудь, пожалуйста.
Есть вопрос по поводу функции mail(). Не очень понятно, как указывается e-mail отправителя. Разъясните кто-нибудь, пожалуйста.

Узнать ip отправителя письма
Добрый день всем. Столкнулся с мелочью. Но практики нет в этом. Собственно необходимо узнать IP email отправителя. Подробнее......

Как получить доменное имя из e-mail-адреса
Добрый вечер, возник вопрос - есть переменная $email = &quot;example@gmail.com&quot;; каким образом вывести доменное имя почтовика типа $email_pars...

Как побороть ???? в имени отправителя письма
Использую CDONTS. Путем вставляния &lt;%Session.CodePage = 1251%&gt; везде, где только можно, прописывания кодировки windows-1251 в html в тэге...

На gmail приходят письма от неизвестного отправителя
вот код отправки письма: $title = 'Потвеждение регистрации на сайте sochi-relax'; $headers = &quot;Content-type: text/plain;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru