0 / 0 / 0
Регистрация: 15.03.2016
Сообщений: 135

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

30.01.2017, 17:39. Показов 1678. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru