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