您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 
 

188 行
8.3 KiB

  1. # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
  2. # MIT License. See license.txt
  3. from __future__ import unicode_literals
  4. import unittest, frappe, re, email
  5. from six import PY3
  6. test_dependencies = ['Email Account']
  7. class TestEmail(unittest.TestCase):
  8. def setUp(self):
  9. frappe.db.sql("""delete from `tabEmail Unsubscribe`""")
  10. frappe.db.sql("""delete from `tabEmail Queue`""")
  11. frappe.db.sql("""delete from `tabEmail Queue Recipient`""")
  12. def test_email_queue(self, send_after=None):
  13. frappe.conf.use_ssl = True
  14. frappe.sendmail(recipients=['test@example.com', 'test1@example.com'],
  15. sender="admin@example.com",
  16. reference_doctype='User', reference_name='Administrator',
  17. subject='Testing Queue', message='This mail is queued!',
  18. unsubscribe_message="Unsubscribe", send_after=send_after)
  19. email_queue = frappe.db.sql("""select name,message from `tabEmail Queue` where status='Not Sent'""", as_dict=1)
  20. self.assertEqual(len(email_queue), 1)
  21. queue_recipients = [r.recipient for r in frappe.db.sql("""SELECT recipient FROM `tabEmail Queue Recipient`
  22. WHERE status='Not Sent'""", as_dict=1)]
  23. self.assertTrue('test@example.com' in queue_recipients)
  24. self.assertTrue('test1@example.com' in queue_recipients)
  25. self.assertEqual(len(queue_recipients), 2)
  26. self.assertTrue('<!--unsubscribe url-->' in email_queue[0]['message'])
  27. # check for email tracker
  28. self.assertTrue('frappe.core.doctype.communication.email.mark_email_as_seen' in email_queue[0]['message'])
  29. frappe.conf.use_ssl = False
  30. def test_send_after(self):
  31. self.test_email_queue(send_after=1)
  32. from frappe.email.queue import flush
  33. flush(from_test=True)
  34. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
  35. self.assertEqual(len(email_queue), 0)
  36. def test_flush(self):
  37. self.test_email_queue()
  38. from frappe.email.queue import flush
  39. flush(from_test=True)
  40. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
  41. self.assertEqual(len(email_queue), 1)
  42. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  43. where status='Sent'""", as_dict=1)]
  44. self.assertTrue('test@example.com' in queue_recipients)
  45. self.assertTrue('test1@example.com' in queue_recipients)
  46. self.assertEqual(len(queue_recipients), 2)
  47. self.assertTrue('Unsubscribe' in frappe.safe_decode(frappe.flags.sent_mail))
  48. def test_cc_header(self):
  49. # test if sending with cc's makes it into header
  50. frappe.sendmail(recipients=['test@example.com'],
  51. cc=['test1@example.com'],
  52. sender="admin@example.com",
  53. reference_doctype='User', reference_name="Administrator",
  54. subject='Testing Email Queue', message='This is mail is queued!',
  55. unsubscribe_message="Unsubscribe", expose_recipients="header")
  56. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Not Sent'""", as_dict=1)
  57. self.assertEqual(len(email_queue), 1)
  58. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  59. where status='Not Sent'""", as_dict=1)]
  60. self.assertTrue('test@example.com' in queue_recipients)
  61. self.assertTrue('test1@example.com' in queue_recipients)
  62. message = frappe.db.sql("""select message from `tabEmail Queue`
  63. where status='Not Sent'""", as_dict=1)[0].message
  64. self.assertTrue('To: test@example.com' in message)
  65. self.assertTrue('CC: test1@example.com' in message)
  66. def test_cc_footer(self):
  67. # test if sending with cc's makes it into header
  68. frappe.sendmail(recipients=['test@example.com'],
  69. cc=['test1@example.com'],
  70. sender="admin@example.com",
  71. reference_doctype='User', reference_name="Administrator",
  72. subject='Testing Email Queue', message='This is mail is queued!',
  73. unsubscribe_message="Unsubscribe", expose_recipients="footer", now=True)
  74. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
  75. self.assertEqual(len(email_queue), 1)
  76. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  77. where status='Sent'""", as_dict=1)]
  78. self.assertTrue('test@example.com' in queue_recipients)
  79. self.assertTrue('test1@example.com' in queue_recipients)
  80. self.assertTrue('This email was sent to test@example.com and copied to test1@example.com' in frappe.safe_decode(
  81. frappe.flags.sent_mail))
  82. def test_expose(self):
  83. from frappe.utils.verified_command import verify_request
  84. frappe.sendmail(recipients=['test@example.com'],
  85. cc=['test1@example.com'],
  86. sender="admin@example.com",
  87. reference_doctype='User', reference_name="Administrator",
  88. subject='Testing Email Queue', message='This is mail is queued!',
  89. unsubscribe_message="Unsubscribe", now=True)
  90. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Sent'""", as_dict=1)
  91. self.assertEqual(len(email_queue), 1)
  92. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  93. where status='Sent'""", as_dict=1)]
  94. self.assertTrue('test@example.com' in queue_recipients)
  95. self.assertTrue('test1@example.com' in queue_recipients)
  96. message = frappe.db.sql("""select message from `tabEmail Queue`
  97. where status='Sent'""", as_dict=1)[0].message
  98. self.assertTrue('<!--recipient-->' in message)
  99. email_obj = email.message_from_string(frappe.safe_decode(frappe.flags.sent_mail))
  100. for part in email_obj.walk():
  101. content = part.get_payload(decode=True)
  102. if content:
  103. if PY3:
  104. eol = "\r\n"
  105. else:
  106. eol = "\n"
  107. frappe.local.flags.signed_query_string = \
  108. re.search(r'(?<=/api/method/frappe.email.queue.unsubscribe\?).*(?=' + eol + ')',
  109. content.decode()).group(0)
  110. self.assertTrue(verify_request())
  111. break
  112. def test_expired(self):
  113. self.test_email_queue()
  114. frappe.db.sql("UPDATE `tabEmail Queue` SET `modified`=(NOW() - INTERVAL '8' day)")
  115. from frappe.email.queue import set_expiry_for_email_queue
  116. set_expiry_for_email_queue()
  117. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Expired'""", as_dict=1)
  118. self.assertEqual(len(email_queue), 1)
  119. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  120. where parent = %s""", email_queue[0].name, as_dict=1)]
  121. self.assertTrue('test@example.com' in queue_recipients)
  122. self.assertTrue('test1@example.com' in queue_recipients)
  123. self.assertEqual(len(queue_recipients), 2)
  124. def test_unsubscribe(self):
  125. from frappe.email.queue import unsubscribe, send
  126. unsubscribe(doctype="User", name="Administrator", email="test@example.com")
  127. self.assertTrue(frappe.db.get_value("Email Unsubscribe",
  128. {"reference_doctype": "User", "reference_name": "Administrator",
  129. "email": "test@example.com"}))
  130. before = frappe.db.sql("""select count(name) from `tabEmail Queue` where status='Not Sent'""")[0][0]
  131. send(recipients=['test@example.com', 'test1@example.com'],
  132. sender="admin@example.com",
  133. reference_doctype='User', reference_name="Administrator",
  134. subject='Testing Email Queue', message='This is mail is queued!', unsubscribe_message="Unsubscribe")
  135. # this is sent async (?)
  136. email_queue = frappe.db.sql("""select name from `tabEmail Queue` where status='Not Sent'""",
  137. as_dict=1)
  138. self.assertEqual(len(email_queue), before + 1)
  139. queue_recipients = [r.recipient for r in frappe.db.sql("""select recipient from `tabEmail Queue Recipient`
  140. where status='Not Sent'""", as_dict=1)]
  141. self.assertFalse('test@example.com' in queue_recipients)
  142. self.assertTrue('test1@example.com' in queue_recipients)
  143. self.assertEqual(len(queue_recipients), 1)
  144. self.assertTrue('Unsubscribe' in frappe.safe_decode(frappe.flags.sent_mail))
  145. def test_image_parsing(self):
  146. import re
  147. email_account = frappe.get_doc('Email Account', '_Test Email Account 1')
  148. frappe.db.sql('''delete from `tabCommunication` where sender = 'sukh@yyy.com' ''')
  149. with open(frappe.get_app_path('frappe', 'tests', 'data', 'email_with_image.txt'), 'r') as raw:
  150. communication = email_account.insert_communication(raw.read())
  151. self.assertTrue(re.search('''<img[^>]*src=["']/private/files/rtco1.png[^>]*>''', communication.content))
  152. self.assertTrue(re.search('''<img[^>]*src=["']/private/files/rtco2.png[^>]*>''', communication.content))
  153. if __name__ == '__main__':
  154. frappe.connect()
  155. unittest.main()