解决阿里云邮件发送不能使用25端口问题
本地测试发邮件功能很流畅,部署到阿里云上以后发现总是NOTFIND,这就很奇怪。开始以为是url写错了导致的,检查N多遍发现完全一毛一样的。后来各种百度,发现是因为阿里云禁用了25端口导致的。查看各种资料,解决的办法五花八门。试了几种解决方案,都解决了问题。现在整理如下:(不用去尝试申请解禁25端口的,可以很认真负责的告诉你,完全没有卵用)
首先,是阿里大大给的官方的解决方案,用SMTP发送邮件:代码如下
#-*-coding:utf-8-*-
importurllib,urllib2
importsmtplib
fromemail.mime.multipartimportMIMEMultipart
fromemail.mime.textimportMIMEText
fromemail.mime.applicationimportMIMEApplication
#发件人地址,通过控制台创建的发件人地址
username='xxx@xxx.com'
#发件人密码,通过控制台创建的发件人密码
password='XXXXXXXX'
#收件人地址列表,支持多个收件人,最多30个
rcptlist=['to1@to.com','to2@to.com']
receivers=','.join(rcptlist)
#构建multipart的邮件消息
msg=MIMEMultipart('mixed')
msg['Subject']='TestEmail'
msg['From']=username
msg['To']=receivers
#构建multipart/alternative的text/plain部分
alternative=MIMEMultipart('alternative')
textplain=MIMEText('纯文本部分',_subtype='plain',_charset='UTF-8')
alternative.attach(textplain)
#构建multipart/alternative的text/html部分
texthtml=MIMEText('超文本部分',_subtype='html',_charset='UTF-8')
alternative.attach(texthtml)
#将alternative加入mixed的内部
msg.attach(alternative)
#附件类型
#xlsx类型的附件
xlsxpart=MIMEApplication(open('测试文件1.xlsx','rb').read())
xlsxpart.add_header('Content-Disposition','attachment',filename=Header("测试文件1.xlsx","utf-8").encode())
msg.attach(xlsxpart)
#jpg类型的附件
jpgpart=MIMEApplication(open('2.jpg','rb').read())
jpgpart.add_header('Content-Disposition','attachment',filename=Header("2.jpg","utf-8").encode())
msg.attach(jpgpart)
#mp3类型的附件
mp3part=MIMEApplication(open('3.mp3','rb').read())
mp3part.add_header('Content-Disposition','attachment',filename=Header("3.mp3","utf-8").encode())
msg.attach(mp3part)
#发送邮件
try:
client=smtplib.SMTP()
#python2.7以上版本,若需要使用SSL,可以这样创建client
#client=smtplib.SMTP_SSL()
client.connect('smtpdm.aliyun.com')
client.login(username,password)
#发件人和认证地址必须一致
client.sendmail(username,rcptlist,msg.as_string())
client.quit()
print'邮件发送成功!'
exceptsmtplib.SMTPRecipientsRefused:
print'邮件发送失败,收件人被拒绝'
exceptsmtplib.SMTPAuthenticationError:
print'邮件发送失败,认证错误'
exceptsmtplib.SMTPSenderRefused:
print'邮件发送失败,发件人被拒绝'
exceptsmtplib.SMTPException,e:
print'邮件发送失败,',e.message
官方的当然好用喽,就是写的太详细和复杂了,实在懒得折腾,为了尽可能少的改代码,就放弃了。
下面是两种网友提供的简单的解决方案
这个是简化版的SMTP方式
importsmtplib
fromemail.mime.textimportMIMEText
msg_from='306334678@qq.com'#发送方邮箱
passwd='****'#填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱密码)
msg_to=['****@qq.com','**@163.com','*****@163.com']#收件人邮箱
subject="邮件标题"#主题
content="邮件内容,我是邮件内容,哈哈哈"
#生成一个MIMEText对象(还有一些其它参数)
#_text_:邮件内容
msg=MIMEText(content)
#放入邮件主题
msg['Subject']=subject
#也可以这样传参
#msg['Subject']=Header(subject,'utf-8')
#放入发件人
msg['From']=msg_from
#放入收件人
msg['To']='616564099@qq.com'
#msg['To']='发给你的邮件啊'
try:
#通过ssl方式发送,服务器地址,端口
s=smtplib.SMTP_SSL("smtp.qq.com",465)
#登录到邮箱
s.login(msg_from,passwd)
#发送邮件:发送方,收件方,要发送的消息
s.sendmail(msg_from,msg_to,msg.as_string())
print('成功')
excepts.SMTPExceptionase:
print(e)
finally:
s.quit()
方法二:为使用send_mail模块发送(和我原来的代码相似,改动较少,墙裂推荐)
setting.py配置如下
#EMAIL_BACKEND='django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST='smtp.qq.com'#如果是163改成smtp.163.com EMAIL_PORT=465#端口号 EMAIL_HOST_USER='306334678@qq.com'#发送者的邮箱帐号 EMAIL_HOST_PASSWORD='***'#发送者的邮箱授权 DEFAULT_FROM_EMAIL=EMAIL_HOST_USER #这样收到的邮件,收件人处就会这样显示 #DEFAULT_FROM_EMAIL='lqz<'306334678@qq.com>' EMAIL_USE_SSL=True#使用ssl #EMAIL_USE_TLS=False#使用tls #EMAIL_USE_SSL和EMAIL_USE_TLS是互斥的,即只能有一个为True
views.py
fromdjango.core.mailimportsend_mail#导入邮箱模块 fromthreadingimportThread#导入线程模块 fromthreadingimportThread t1=Thread(target=send_mail,args=( '您的%s文章被%s评论了'%(article_name,user_name), '这个人评论了:%s'%(content), settings.EMAIL_HOST_USER, ['1670874977@qq.com'])) t1.start()
到此这篇关于解决阿里云邮件发送不能使用25端口问题的文章就介绍到这了,更多相关阿里云邮件不能使用25端口内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!