SesClassObject.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. from Ansjer.config import ALY_SES_ACCESS_NAME, ALY_SES_ACCESS_PAW, ALY_SES_ACCESS_REPLYTO, AWS_SES_ACCESS_REGION, \
  2. SES_COMPANY_EMAIL
  3. from boto3.session import Session
  4. import traceback
  5. import smtplib
  6. import email
  7. from email.mime.multipart import MIMEMultipart
  8. from email.mime.text import MIMEText
  9. from email.header import Header
  10. from django.conf import settings
  11. AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID
  12. AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY
  13. class SesClassObject:
  14. def __init__(self, *args, **kwargs):
  15. self.company_email = SES_COMPANY_EMAIL
  16. self.aliyun_username = ALY_SES_ACCESS_NAME
  17. self.aliyun_password = ALY_SES_ACCESS_PAW
  18. self.aliyun_replyto = ALY_SES_ACCESS_REPLYTO
  19. session = Session(
  20. aws_access_key_id=AWS_ACCESS_KEY_ID[1],
  21. aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1],
  22. region_name=AWS_SES_ACCESS_REGION,
  23. )
  24. self.conn = session.client('ses')
  25. # 发送邮箱阿里云的邮箱接口
  26. def alyEmailCode(self,send_address_list=[], subject='', body=''):
  27. print ('我开始发送邮箱咯')
  28. # 发件人地址,通过控制台创建的发件人地址
  29. username = self.aliyun_username
  30. # 发件人密码,通过控制台创建的发件人密码
  31. password = self.aliyun_password
  32. # 自定义的回复地址
  33. replyto = self.aliyun_replyto
  34. # 收件人地址或是地址列表,支持多个收件人,最多30个
  35. # rcptto = '***,***'
  36. # rcptto = '1758730877@qq.com'
  37. rcptto = send_address_list
  38. # 构建alternative结构
  39. msg = MIMEMultipart('alternative')
  40. msg['Subject'] = Header(subject).encode()
  41. msg['From'] = '%s <%s>' % (Header('user_server').encode(), username)
  42. # msg['To'] = rcptto
  43. msg['Reply-to'] = replyto
  44. msg['Message-id'] = email.utils.make_msgid()
  45. msg['Date'] = email.utils.formatdate()
  46. # 构建alternative的text/plain部分
  47. # textplain = MIMEText('自定义TEXT纯文本部分', _subtype='plain', _charset='UTF-8')
  48. # msg.attach(textplain)
  49. texthtml = MIMEText(body, _subtype='html', _charset='UTF-8')
  50. msg.attach(texthtml)
  51. # 发送邮件
  52. try:
  53. client = smtplib.SMTP()
  54. # python 2.7以上版本,若需要使用SSL,可以这样创建client
  55. # client = smtplib.SMTP_SSL()
  56. # SMTP普通端口为25或80
  57. client.connect('smtpdm.aliyun.com', 80)
  58. # client.connect('smtpdm-ap-southeast-2.aliyun.com', 80)
  59. # 开启DEBUG模式
  60. client.set_debuglevel(0)
  61. client.login(username, password)
  62. # 发件人和认证地址必须一致
  63. # 备注:若想取到DATA命令返回值,可参考smtplib的sendmaili封装方法:
  64. # 使用SMTP.mail/SMTP.rcpt/SMTP.data方法
  65. client.sendmail(username, rcptto, msg.as_string())
  66. client.quit()
  67. print('邮件发送成功')
  68. return True
  69. except smtplib.SMTPConnectError as e:
  70. print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error)
  71. return False
  72. except smtplib.SMTPAuthenticationError as e:
  73. print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error)
  74. return False
  75. except smtplib.SMTPSenderRefused as e:
  76. print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error)
  77. return False
  78. except smtplib.SMTPRecipientsRefused as e:
  79. print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error)
  80. return False
  81. except smtplib.SMTPDataError as e:
  82. print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error)
  83. return False
  84. except smtplib.SMTPException as e:
  85. print('邮件发送失败, ', e.message)
  86. return False
  87. except Exception as e:
  88. print('邮件发送异常, ', str(e))
  89. return False
  90. def send_email(self, send_address_list=[], subject='', body=''):
  91. try:
  92. response = self.conn.send_email(
  93. # 发送人
  94. Source=self.company_email,
  95. Destination={
  96. # 收件人
  97. 'ToAddresses': send_address_list
  98. # 'ToAddresses': [
  99. # '1758730877@qq.com',
  100. # ],
  101. },
  102. Message={
  103. # 标题
  104. 'Subject': {
  105. 'Data': subject,
  106. 'Charset': 'utf-8'
  107. },
  108. 'Body': {
  109. 'Html': {
  110. 'Data': body,
  111. 'Charset': 'utf-8'
  112. }
  113. }
  114. },
  115. )
  116. except Exception as e:
  117. errorInfo = traceback.format_exc()
  118. print(errorInfo)
  119. self.send_email(send_address_list=[self.company_email], subject='邮件发送错误信息提醒', body='<br>请向开发人员反馈并修改</br>' +'\n错误信息位'+str(errorInfo))
  120. if response['MessageId']:
  121. return True
  122. else:
  123. print(response)
  124. self.send_email(send_address_list=[self.company_email],subject='邮件发送错误信息提醒',body='<br>请向开发人员反馈并修改</br>')
  125. return False