解決阿里雲郵件發送不能使用25端口問題

本地測試發郵件功能很流暢,部署到阿里雲上之後發現老是NOT FIND,這就很奇怪。開始覺得是url寫錯了致使的,檢查N多遍發現徹底一毛同樣的。後來各類百度,發現是由於阿里雲禁用了25端口致使的。查看各類資料,解決的辦法五花八門。試了幾種解決方案,都解決了問題。如今整理以下:(不用去嘗試申請解禁25端口的,能夠很認真負責的告訴你,徹底沒有卵用)html

首先,是阿里大大給的官方的解決方案,用SMTP發送郵件:代碼以下python

# -*- coding:utf-8 -*-
import urllib, urllib2
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
# 發件人地址,經過控制檯建立的發件人地址
username = 'xxx@xxx.com'
# 發件人密碼,經過控制檯建立的發件人密碼
password = 'XXXXXXXX'
# 收件人地址列表,支持多個收件人,最多30個
rcptlist = ['to1@to.com', 'to2@to.com']
receivers = ','.join(rcptlist)
# 構建 multipart 的郵件消息
msg = MIMEMultipart('mixed')
msg['Subject'] = 'Test Email'
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()
    #python 2.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 '郵件發送成功!'
except smtplib.SMTPRecipientsRefused:
    print '郵件發送失敗,收件人被拒絕'
except smtplib.SMTPAuthenticationError:
    print '郵件發送失敗,認證錯誤'
except smtplib.SMTPSenderRefused:
    print '郵件發送失敗,發件人被拒絕'
except smtplib.SMTPException,e:
    print '郵件發送失敗, ', e.message
阿里官方解決方案

官方的固然好用嘍,就是寫的太詳細和複雜了,實在懶得折騰,爲了儘量少的改代碼,就放棄了。django

 

下面是兩種網友提供的簡單的解決方案服務器

這個是簡化版的SMTP方式app

import smtplib
from email.mime.text import MIMEText

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('成功')
except s.SMTPException as e:
    print(e)
finally:
    s.quit()

方法二:爲使用send_mail模塊發送(和我原來的代碼類似,改動較少,牆裂推薦)ide

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.pyui

rom django.core.mail import send_mail   # 導入郵箱模塊
from threading import Thread     # 導入線程模塊
from threading import Thread
  t1 = Thread(target=send_mail,args=(
  '您的%s文章被%s評論了'%(article_name,user_name),
  '這我的評論了:%s'%(content),
  settings.EMAIL_HOST_USER,
  ['1670874977@qq.com'] ))   t1.start()
相關文章
相關標籤/搜索