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

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

30.01.2017, 17:39. Показов 1672. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru