verify.rb 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. module EmailHelper
  2. class Verify
  3. =begin
  4. get result of inbound probe
  5. result = EmailHelper::Verify.email(
  6. inbound: {
  7. adapter: 'imap',
  8. options: {
  9. host: 'imap.gmail.com',
  10. port: 993,
  11. ssl: true,
  12. user: 'some@example.com',
  13. password: 'password',
  14. },
  15. },
  16. outbound: {
  17. adapter: 'smtp',
  18. options: {
  19. host: 'smtp.gmail.com',
  20. port: 25,
  21. ssl: true,
  22. user: 'some@example.com',
  23. password: 'password',
  24. },
  25. },
  26. sender: 'sender_and_recipient_of_verify_email@example.com',
  27. )
  28. returns on success
  29. {
  30. result: 'ok'
  31. }
  32. returns on fail
  33. {
  34. result: 'invalid',
  35. message: 'Verification Email not found in mailbox.',
  36. subject: subject,
  37. }
  38. or
  39. {
  40. result: 'invalid',
  41. message: 'Authentication failed!.',
  42. subject: subject,
  43. }
  44. =end
  45. def self.email(params)
  46. # send verify email
  47. subject = params[:subject].presence || '#' + rand(99_999_999_999).to_s
  48. result = EmailHelper::Probe.outbound(params[:outbound], params[:sender], subject)
  49. if result[:result] != 'ok'
  50. result[:source] = 'outbound'
  51. return result
  52. end
  53. # validate adapter
  54. adapter = params[:inbound][:adapter].downcase
  55. if !EmailHelper.available_driver[:inbound][adapter.to_sym]
  56. return {
  57. result: 'failed',
  58. message: "Unknown adapter '#{adapter}'",
  59. }
  60. end
  61. # looking for verify email
  62. 9.times do
  63. sleep 5
  64. # fetch mailbox
  65. fetch_result = nil
  66. begin
  67. require "channel/driver/#{adapter.to_filename}"
  68. driver_class = Object.const_get("Channel::Driver::#{adapter.to_classname}")
  69. driver_instance = driver_class.new
  70. fetch_result = driver_instance.fetch(params[:inbound][:options], self, 'verify', subject)
  71. rescue => e
  72. result = {
  73. result: 'invalid',
  74. source: 'inbound',
  75. message: e.to_s,
  76. message_human: EmailHelper::Probe.translation(e.message),
  77. invalid_field: EmailHelper::Probe.invalid_field(e.message),
  78. subject: subject,
  79. }
  80. return result
  81. end
  82. next if !fetch_result
  83. next if fetch_result[:result] != 'ok'
  84. return fetch_result
  85. end
  86. {
  87. result: 'invalid',
  88. message: 'Verification Email not found in mailbox.',
  89. subject: subject,
  90. }
  91. end
  92. end
  93. end