• 解决阿里云邮件发送不能使用25端口问题


    本地测试发邮件功能很流畅,部署到阿里云上以后发现总是NOT FIND,这就很奇怪。开始以为是url写错了导致的,检查N多遍发现完全一毛一样的。后来各种百度,发现是因为阿里云禁用了25端口导致的。查看各种资料,解决的办法五花八门。试了几种解决方案,都解决了问题。现在整理如下:(不用去尝试申请解禁25端口的,可以很认真负责的告诉你,完全没有卵用)

    首先,是阿里大大给的官方的解决方案,用SMTP发送邮件:代码如下

    # -*- 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
    阿里官方解决方案

    官方的当然好用喽,就是写的太详细和复杂了,实在懒得折腾,为了尽可能少的改代码,就放弃了。

    下面是两种网友提供的简单的解决方案

    这个是简化版的SMTP方式

    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模块发送(和我原来的代码相似,改动较少,墙裂推荐)

    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

    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()
  • 相关阅读:
    起点中文网小说爬取-etree,xpath,os
    拉勾网爬虫--待改正
    破解有道词典翻译-版本二
    pycharm错误:11001
    自动化selenium 测试之道(一)
    valgrind 详细说明
    sar命令使用详解
    Linux CPU实时监控mpstat命令详解
    Linux IO实时监控iostat命令详解
    RPM安装命令总结
  • 原文地址:https://www.cnblogs.com/ppzhang/p/10305517.html
Copyright © 2020-2023  润新知