from Ansjer.config import ALY_SES_ACCESS_NAME, ALY_SES_ACCESS_PAW, ALY_SES_ACCESS_REPLYTO, AWS_SES_ACCESS_REGION, \ SES_COMPANY_EMAIL from boto3.session import Session import traceback import smtplib import email from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.header import Header from django.conf import settings AWS_ACCESS_KEY_ID = settings.AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY = settings.AWS_SECRET_ACCESS_KEY class SesClassObject: def __init__(self, *args, **kwargs): self.company_email = SES_COMPANY_EMAIL self.aliyun_username = ALY_SES_ACCESS_NAME self.aliyun_password = ALY_SES_ACCESS_PAW self.aliyun_replyto = ALY_SES_ACCESS_REPLYTO session = Session( aws_access_key_id=AWS_ACCESS_KEY_ID[1], aws_secret_access_key=AWS_SECRET_ACCESS_KEY[1], region_name=AWS_SES_ACCESS_REGION, ) self.conn = session.client('ses') # 发送邮箱阿里云的邮箱接口 def alyEmailCode(self,send_address_list=[], subject='', body=''): print ('我开始发送邮箱咯') # 发件人地址,通过控制台创建的发件人地址 username = self.aliyun_username # 发件人密码,通过控制台创建的发件人密码 password = self.aliyun_password # 自定义的回复地址 replyto = self.aliyun_replyto # 收件人地址或是地址列表,支持多个收件人,最多30个 # rcptto = '***,***' # rcptto = '1758730877@qq.com' rcptto = send_address_list # 构建alternative结构 msg = MIMEMultipart('alternative') msg['Subject'] = Header(subject).encode() msg['From'] = '%s <%s>' % (Header('user_server').encode(), username) # msg['To'] = rcptto msg['Reply-to'] = replyto msg['Message-id'] = email.utils.make_msgid() msg['Date'] = email.utils.formatdate() # 构建alternative的text/plain部分 # textplain = MIMEText('自定义TEXT纯文本部分', _subtype='plain', _charset='UTF-8') # msg.attach(textplain) texthtml = MIMEText(body, _subtype='html', _charset='UTF-8') msg.attach(texthtml) # 发送邮件 try: client = smtplib.SMTP() # python 2.7以上版本,若需要使用SSL,可以这样创建client # client = smtplib.SMTP_SSL() # SMTP普通端口为25或80 client.connect('smtpdm.aliyun.com', 80) # client.connect('smtpdm-ap-southeast-2.aliyun.com', 80) # 开启DEBUG模式 client.set_debuglevel(0) client.login(username, password) # 发件人和认证地址必须一致 # 备注:若想取到DATA命令返回值,可参考smtplib的sendmaili封装方法: # 使用SMTP.mail/SMTP.rcpt/SMTP.data方法 client.sendmail(username, rcptto, msg.as_string()) client.quit() print('邮件发送成功') return True except smtplib.SMTPConnectError as e: print('邮件发送失败,连接失败:', e.smtp_code, e.smtp_error) return False except smtplib.SMTPAuthenticationError as e: print('邮件发送失败,认证错误:', e.smtp_code, e.smtp_error) return False except smtplib.SMTPSenderRefused as e: print('邮件发送失败,发件人被拒绝:', e.smtp_code, e.smtp_error) return False except smtplib.SMTPRecipientsRefused as e: print('邮件发送失败,收件人被拒绝:', e.smtp_code, e.smtp_error) return False except smtplib.SMTPDataError as e: print('邮件发送失败,数据接收拒绝:', e.smtp_code, e.smtp_error) return False except smtplib.SMTPException as e: print('邮件发送失败, ', e.message) return False except Exception as e: print('邮件发送异常, ', str(e)) return False def send_email(self, send_address_list=[], subject='', body=''): try: response = self.conn.send_email( # 发送人 Source=self.company_email, Destination={ # 收件人 'ToAddresses': send_address_list # 'ToAddresses': [ # '1758730877@qq.com', # ], }, Message={ # 标题 'Subject': { 'Data': subject, 'Charset': 'utf-8' }, 'Body': { 'Html': { 'Data': body, 'Charset': 'utf-8' } } }, ) except Exception as e: errorInfo = traceback.format_exc() print(errorInfo) self.send_email(send_address_list=[self.company_email], subject='邮件发送错误信息提醒', body='
请向开发人员反馈并修改
' +'\n错误信息位'+str(errorInfo)) if response['MessageId']: return True else: print(response) self.send_email(send_address_list=[self.company_email],subject='邮件发送错误信息提醒',body='
请向开发人员反馈并修改
') return False