email_helper_test.rb 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542
  1. require 'test_helper'
  2. class EmailHelperTest < ActiveSupport::TestCase
  3. test 'a mx_records' do
  4. domain = 'znuny.com'
  5. mx_domains = EmailHelper.mx_records(domain)
  6. assert_equal('arber.znuny.com', mx_domains[0])
  7. end
  8. test 'a email parser test' do
  9. user, domain = EmailHelper.parse_email('somebody@example.com')
  10. assert_equal('somebody', user)
  11. assert_equal('example.com', domain)
  12. user, domain = EmailHelper.parse_email('somebody+test@example.com')
  13. assert_equal('somebody+test', user)
  14. assert_equal('example.com', domain)
  15. user, domain = EmailHelper.parse_email('somebody+testexample.com')
  16. assert_not(user)
  17. assert_not(domain)
  18. end
  19. test 'provider test' do
  20. email = 'linus@kernel.org'
  21. password = 'some_pw'
  22. map = EmailHelper.provider(email, password)
  23. assert_equal('imap', map[:google_imap][:inbound][:adapter])
  24. assert_equal('imap.gmail.com', map[:google_imap][:inbound][:options][:host])
  25. assert_equal(993, map[:google_imap][:inbound][:options][:port])
  26. assert_equal(email, map[:google_imap][:inbound][:options][:user])
  27. assert_equal(password, map[:google_imap][:inbound][:options][:password])
  28. assert_equal('smtp', map[:google_imap][:outbound][:adapter])
  29. assert_equal('smtp.gmail.com', map[:google_imap][:outbound][:options][:host])
  30. assert_equal(25, map[:google_imap][:outbound][:options][:port])
  31. assert_equal(true, map[:google_imap][:outbound][:options][:start_tls])
  32. assert_equal(email, map[:google_imap][:outbound][:options][:user])
  33. assert_equal(password, map[:google_imap][:outbound][:options][:password])
  34. end
  35. test 'provider_inbound_mx' do
  36. email = 'linus@znuny.com'
  37. password = 'some_pw'
  38. user, domain = EmailHelper.parse_email(email)
  39. mx_domains = EmailHelper.mx_records(domain)
  40. map = EmailHelper.provider_inbound_mx(user, email, password, mx_domains)
  41. assert_equal('imap', map[0][:adapter])
  42. assert_equal('arber.znuny.com', map[0][:options][:host])
  43. assert_equal(993, map[0][:options][:port])
  44. assert_equal(user, map[0][:options][:user])
  45. assert_equal(password, map[0][:options][:password])
  46. assert_equal('imap', map[1][:adapter])
  47. assert_equal('arber.znuny.com', map[1][:options][:host])
  48. assert_equal(993, map[1][:options][:port])
  49. assert_equal(email, map[1][:options][:user])
  50. assert_equal(password, map[1][:options][:password])
  51. end
  52. test 'provider_inbound_guess' do
  53. email = 'linus@znuny.com'
  54. password = 'some_pw'
  55. user, domain = EmailHelper.parse_email(email)
  56. map = EmailHelper.provider_inbound_guess(user, email, password, domain)
  57. assert_equal('imap', map[0][:adapter])
  58. assert_equal('mail.znuny.com', map[0][:options][:host])
  59. assert_equal(993, map[0][:options][:port])
  60. assert_equal(user, map[0][:options][:user])
  61. assert_equal(password, map[0][:options][:password])
  62. assert_equal('imap', map[1][:adapter])
  63. assert_equal('mail.znuny.com', map[1][:options][:host])
  64. assert_equal(993, map[1][:options][:port])
  65. assert_equal(email, map[1][:options][:user])
  66. assert_equal(password, map[1][:options][:password])
  67. end
  68. test 'provider_outbound_mx' do
  69. email = 'linus@znuny.com'
  70. password = 'some_pw'
  71. user, domain = EmailHelper.parse_email(email)
  72. mx_domains = EmailHelper.mx_records(domain)
  73. map = EmailHelper.provider_outbound_mx(user, email, password, mx_domains)
  74. assert_equal('smtp', map[0][:adapter])
  75. assert_equal('arber.znuny.com', map[0][:options][:host])
  76. assert_equal(25, map[0][:options][:port])
  77. assert_equal(true, map[0][:options][:start_tls])
  78. assert_equal(user, map[0][:options][:user])
  79. assert_equal(password, map[0][:options][:password])
  80. assert_equal('smtp', map[1][:adapter])
  81. assert_equal('arber.znuny.com', map[1][:options][:host])
  82. assert_equal(25, map[1][:options][:port])
  83. assert_equal(true, map[1][:options][:start_tls])
  84. assert_equal(email, map[1][:options][:user])
  85. assert_equal(password, map[1][:options][:password])
  86. end
  87. test 'provider_outbound_guess' do
  88. email = 'linus@znuny.com'
  89. password = 'some_pw'
  90. user, domain = EmailHelper.parse_email(email)
  91. map = EmailHelper.provider_outbound_guess(user, email, password, domain)
  92. assert_equal('smtp', map[0][:adapter])
  93. assert_equal('mail.znuny.com', map[0][:options][:host])
  94. assert_equal(25, map[0][:options][:port])
  95. assert_equal(true, map[0][:options][:start_tls])
  96. assert_equal(user, map[0][:options][:user])
  97. assert_equal(password, map[0][:options][:password])
  98. assert_equal('smtp', map[1][:adapter])
  99. assert_equal('mail.znuny.com', map[1][:options][:host])
  100. assert_equal(25, map[1][:options][:port])
  101. assert_equal(true, map[1][:options][:start_tls])
  102. assert_equal(email, map[1][:options][:user])
  103. assert_equal(password, map[1][:options][:password])
  104. end
  105. test 'z probe_inbound' do
  106. # invalid adapter
  107. result = EmailHelper::Probe.inbound(
  108. adapter: 'imap2',
  109. options: {
  110. host: 'not_existsing_host',
  111. port: 993,
  112. ssl: true,
  113. user: 'some@example.com',
  114. password: 'password',
  115. }
  116. )
  117. assert_equal('failed', result[:result])
  118. # network issues
  119. result = EmailHelper::Probe.inbound(
  120. adapter: 'imap',
  121. options: {
  122. host: 'not_existsing_host',
  123. port: 993,
  124. ssl: true,
  125. user: 'some@example.com',
  126. password: 'password',
  127. }
  128. )
  129. assert_equal('invalid', result[:result])
  130. assert_equal('Hostname not found!', result[:message_human])
  131. assert_equal('not_existsing_host', result[:settings][:options][:host])
  132. # try to access imap on host with blocked port to force a "Connection refused!" error
  133. result = EmailHelper::Probe.inbound(
  134. adapter: 'imap',
  135. options: {
  136. host: 'no-imap-host.test.zammad.org',
  137. port: 993,
  138. ssl: true,
  139. user: 'some@example.com',
  140. password: 'password',
  141. }
  142. )
  143. assert_equal('invalid', result[:result])
  144. assert_equal('Connection refused!', result[:message_human])
  145. assert_equal('no-imap-host.test.zammad.org', result[:settings][:options][:host])
  146. result = EmailHelper::Probe.inbound(
  147. adapter: 'imap',
  148. options: {
  149. host: '172.42.42.42',
  150. port: 993,
  151. ssl: true,
  152. user: 'some@example.com',
  153. password: 'password',
  154. }
  155. )
  156. assert_equal('invalid', result[:result])
  157. assert_match(/Host not reachable|No route to host/, result[:message_human])
  158. assert_equal('172.42.42.42', result[:settings][:options][:host])
  159. # gmail
  160. result = EmailHelper::Probe.inbound(
  161. adapter: 'imap',
  162. options: {
  163. host: 'imap.gmail.com',
  164. port: 993,
  165. ssl: true,
  166. user: 'some@example.com',
  167. password: 'password',
  168. }
  169. )
  170. assert_equal('invalid', result[:result])
  171. assert_match(/Authentication failed, username incorrect|Authentication failed, invalid credentials/, result[:message_human])
  172. assert_equal('imap.gmail.com', result[:settings][:options][:host])
  173. result = EmailHelper::Probe.inbound(
  174. adapter: 'imap',
  175. options: {
  176. host: 'imap.gmail.com',
  177. port: 993,
  178. ssl: true,
  179. user: 'frank.tailor05@googlemail.com',
  180. password: 'password',
  181. }
  182. )
  183. assert_equal('invalid', result[:result])
  184. # if we have to many failed logins, we need to handle another error message
  185. if result[:message_human].present?
  186. assert_match(/Authentication failed, username incorrect|Authentication failed, invalid credentials/, result[:message_human])
  187. else
  188. assert_match(/Web login required/, result[:message])
  189. end
  190. assert_equal('imap.gmail.com', result[:settings][:options][:host])
  191. # dovecot
  192. result = EmailHelper::Probe.inbound(
  193. adapter: 'imap',
  194. options: {
  195. host: 'arber.znuny.com',
  196. port: 993,
  197. ssl: true,
  198. user: 'some@example.com',
  199. password: 'password',
  200. }
  201. )
  202. assert_equal('invalid', result[:result])
  203. assert_equal('Authentication failed!', result[:message_human])
  204. assert_equal('arber.znuny.com', result[:settings][:options][:host])
  205. # realtest - test I
  206. if !ENV['EMAILHELPER_MAILBOX_1']
  207. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  208. end
  209. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  210. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  211. user, domain = EmailHelper.parse_email(mailbox_user)
  212. result = EmailHelper::Probe.inbound(
  213. adapter: 'imap',
  214. options: {
  215. host: 'arber.znuny.com',
  216. port: 993,
  217. ssl: true,
  218. user: user,
  219. password: mailbox_password,
  220. }
  221. )
  222. assert_equal('ok', result[:result])
  223. end
  224. test 'z probe_outbound' do
  225. # invalid adapter
  226. result = EmailHelper::Probe.outbound(
  227. {
  228. adapter: 'smtp2',
  229. options: {
  230. host: 'not_existsing_host',
  231. port: 25,
  232. start_tls: true,
  233. user: 'some@example.com',
  234. password: 'password',
  235. },
  236. },
  237. 'some@example.com',
  238. )
  239. assert_equal('failed', result[:result])
  240. # network issues
  241. result = EmailHelper::Probe.outbound(
  242. {
  243. adapter: 'smtp',
  244. options: {
  245. host: 'not_existsing_host',
  246. port: 25,
  247. start_tls: true,
  248. user: 'some@example.com',
  249. password: 'password',
  250. }
  251. },
  252. 'some@example.com',
  253. )
  254. assert_equal('invalid', result[:result])
  255. assert_equal('Hostname not found!', result[:message_human])
  256. assert_equal('not_existsing_host', result[:settings][:options][:host])
  257. # try to access SMTP on host with blocked port to force a "Connection refused!" error
  258. result = EmailHelper::Probe.outbound(
  259. {
  260. adapter: 'smtp',
  261. options: {
  262. host: 'no-imap-host.test.zammad.org',
  263. port: 26,
  264. start_tls: true,
  265. user: 'some@example.com',
  266. password: 'password',
  267. }
  268. },
  269. 'some@example.com',
  270. )
  271. assert_equal('invalid', result[:result])
  272. assert_equal('Connection refused!', result[:message_human])
  273. assert_equal('no-imap-host.test.zammad.org', result[:settings][:options][:host])
  274. result = EmailHelper::Probe.outbound(
  275. {
  276. adapter: 'smtp',
  277. options: {
  278. host: '172.42.42.42',
  279. port: 25,
  280. start_tls: true,
  281. user: 'some@example.com',
  282. password: 'password',
  283. }
  284. },
  285. 'some@example.com',
  286. )
  287. assert_equal('invalid', result[:result])
  288. assert_match(/Host not reachable|No route to host/, result[:message_human])
  289. assert_equal('172.42.42.42', result[:settings][:options][:host])
  290. # gmail
  291. result = EmailHelper::Probe.outbound(
  292. {
  293. adapter: 'smtp',
  294. options: {
  295. host: 'smtp.gmail.com',
  296. port: 25,
  297. start_tls: true,
  298. user: 'some@example.com',
  299. password: 'password',
  300. }
  301. },
  302. 'some@example.com',
  303. )
  304. assert_equal('invalid', result[:result])
  305. assert_equal('Authentication failed!', result[:message_human])
  306. assert_equal('smtp.gmail.com', result[:settings][:options][:host])
  307. result = EmailHelper::Probe.outbound(
  308. {
  309. adapter: 'smtp',
  310. options: {
  311. host: 'smtp.gmail.com',
  312. port: 25,
  313. start_tls: true,
  314. user: 'frank.tailor05@googlemail.com',
  315. password: 'password',
  316. }
  317. },
  318. 'some@example.com',
  319. )
  320. assert_equal('invalid', result[:result])
  321. # if we have to many failed logins, we need to handle another error message
  322. if result[:message_human].present?
  323. assert_equal('Authentication failed!', result[:message_human])
  324. else
  325. assert_match(/Please log in with your web browser and then try again/, result[:message])
  326. end
  327. assert_equal('smtp.gmail.com', result[:settings][:options][:host])
  328. # dovecot
  329. result = EmailHelper::Probe.outbound(
  330. {
  331. adapter: 'smtp',
  332. options: {
  333. host: 'arber.znuny.com',
  334. port: 25,
  335. start_tls: true,
  336. user: 'some@example.com',
  337. password: 'password',
  338. }
  339. },
  340. 'some@example.com',
  341. )
  342. assert_equal('invalid', result[:result])
  343. assert_equal('Authentication failed!', result[:message_human])
  344. assert_equal('arber.znuny.com', result[:settings][:options][:host])
  345. # realtest - test I
  346. if !ENV['EMAILHELPER_MAILBOX_1']
  347. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  348. end
  349. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  350. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  351. user, domain = EmailHelper.parse_email(mailbox_user)
  352. result = EmailHelper::Probe.outbound(
  353. {
  354. adapter: 'smtp',
  355. options: {
  356. host: 'arber.znuny.com',
  357. port: 25,
  358. start_tls: true,
  359. user: user,
  360. password: mailbox_password,
  361. }
  362. },
  363. mailbox_user,
  364. )
  365. assert_equal('ok', result[:result])
  366. end
  367. test 'zz probe' do
  368. result = EmailHelper::Probe.full(
  369. email: 'invalid_format',
  370. password: 'somepass',
  371. )
  372. assert_equal('invalid', result[:result])
  373. assert_not(result[:setting])
  374. # realtest - test I, with imap
  375. if !ENV['EMAILHELPER_MAILBOX_1']
  376. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  377. end
  378. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  379. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  380. result = EmailHelper::Probe.full(
  381. email: mailbox_user,
  382. password: mailbox_password,
  383. )
  384. assert_equal('ok', result[:result])
  385. assert_equal('arber.znuny.com', result[:setting][:inbound][:options][:host])
  386. assert_equal('arber.znuny.com', result[:setting][:outbound][:options][:host])
  387. # realtest - test II, gmail with only pop3
  388. if !ENV['EMAILHELPER_MAILBOX_2']
  389. raise "Need EMAILHELPER_MAILBOX_2 as ENV variable like export EMAILHELPER_MAILBOX_2='hansb36621@gmail.com:somepass'"
  390. end
  391. mailbox_user = ENV['EMAILHELPER_MAILBOX_2'].split(':')[0]
  392. mailbox_password = ENV['EMAILHELPER_MAILBOX_2'].split(':')[1]
  393. result = EmailHelper::Probe.full(
  394. email: mailbox_user,
  395. password: mailbox_password,
  396. )
  397. assert_nil(result[:reason])
  398. assert_equal('ok', result[:result])
  399. assert_equal('pop.gmail.com', result[:setting][:inbound][:options][:host])
  400. assert_equal('smtp.gmail.com', result[:setting][:outbound][:options][:host])
  401. end
  402. test 'zz verify' do
  403. # realtest - test I, with imap
  404. if !ENV['EMAILHELPER_MAILBOX_1']
  405. raise "Need EMAILHELPER_MAILBOX_1 as ENV variable like export EMAILHELPER_MAILBOX_1='unittestemailhelper01@znuny.com:somepass'"
  406. end
  407. mailbox_user = ENV['EMAILHELPER_MAILBOX_1'].split(':')[0]
  408. mailbox_password = ENV['EMAILHELPER_MAILBOX_1'].split(':')[1]
  409. user, domain = EmailHelper.parse_email(mailbox_user)
  410. result = EmailHelper::Verify.email(
  411. inbound: {
  412. adapter: 'imap',
  413. options: {
  414. host: 'arber.znuny.com',
  415. port: 993,
  416. ssl: true,
  417. user: user,
  418. password: mailbox_password,
  419. },
  420. },
  421. outbound: {
  422. adapter: 'smtp',
  423. options: {
  424. host: 'arber.znuny.com',
  425. port: 25,
  426. start_tls: true,
  427. user: user,
  428. password: mailbox_password,
  429. },
  430. },
  431. sender: mailbox_user,
  432. )
  433. assert_equal('ok', result[:result])
  434. # realtest - test II, gmail with pop3
  435. if !ENV['EMAILHELPER_MAILBOX_2']
  436. raise "Need EMAILHELPER_MAILBOX_2 as ENV variable like export EMAILHELPER_MAILBOX_2='hansb36621@gmail.com:somepass'"
  437. end
  438. mailbox_user = ENV['EMAILHELPER_MAILBOX_2'].split(':')[0]
  439. mailbox_password = ENV['EMAILHELPER_MAILBOX_2'].split(':')[1]
  440. user, domain = EmailHelper.parse_email(mailbox_user)
  441. result = EmailHelper::Verify.email(
  442. inbound: {
  443. adapter: 'pop3',
  444. options: {
  445. host: 'pop.gmail.com',
  446. port: 995,
  447. ssl: true,
  448. user: mailbox_user,
  449. password: mailbox_password,
  450. },
  451. },
  452. outbound: {
  453. adapter: 'smtp',
  454. options: {
  455. host: 'smtp.gmail.com',
  456. port: 25,
  457. start_tls: true,
  458. user: mailbox_user,
  459. password: mailbox_password,
  460. },
  461. },
  462. sender: mailbox_user,
  463. )
  464. assert_equal('ok', result[:result])
  465. end
  466. end