V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
leisurelylicht
V2EX  ›  Python

python 使用 smtp 无法向多人发邮件?

  •  
  •   leisurelylicht · 2016-05-24 00:37:34 +08:00 · 5791 次点击
    这是一个创建于 3109 天前的主题,其中的信息可能已经有所发展或是发生改变。

    给单个人地址发就没问题,多人 list 就不行了。

    这是报错内容

    Error in functon : " send_text_email " ,
         Error name is : " SMTPDataError " ,
         Error type is : " <class 'smtplib.SMTPDataError'> " ,
         Error Message is : " (554, 'DT:SPM 126 smtp2,DMmowECZeEbGLkNX_iNcAA--.205S2 1464020678,please see http://mail.163.com/help/help_spam_16.htm?ip=123.150.243.7&hostid=smtp2&time=1464020678') " ,
         Error doc is : " The SMTP server didn't accept the data. " , 
    

    msg 内容

    From nobody Tue May 24 00:24:38 2016
    Content-Type: text/plain; charset="utf-8"
    MIME-Version: 1.0
    Content-Transfer-Encoding: base64
    From: =?utf-8?b?5rWL6K+V5py65Zmo5Lq6?= <[email protected]>
    Subject: test
    To: [email protected],[email protected]
    
    aW5mbw==
    

    主要代码

    def send_text_email(self, title, message, message_type):
            """
            发送文本邮件
            没有返回值
            函数内调用_format_address()
            :param message_type:
            :param message:
            :param title:
            """
            print 'send_text_email %s ' % title
            msg = MIMEText(message, 'plain', 'utf-8') 
            msg['From'] = self._format_address(u'%s<%s>' % (self.mailName, self.sender))
            msg['Subject'] = Header(title)
            while 1:
                try:
                    smtp = smtplib.SMTP()
                    # smtp.set_debuglevel(1)
                    print '开始尝试连接邮箱'
                    smtp.connect(self.smtp_server, self.smtp_server_port)
                    print '成功连接邮箱'
                    print '开始尝试登陆邮箱'
                    smtp.login(self.username, self.password)
                    print '成功登陆邮箱'
                    if message_type == "securityInfo":
                        print '开始发送事件邮件'
                        msg['To'] = ','.join(self.receiver)
                        print 'msg', msg
                        smtp.sendmail(self.sender, self.receiver, msg.as_string())
                        print '成功发送事件邮件'
                except smtplib.SMTPAuthenticationError:
                    print '认证失败,邮箱连接可能出问题了'
                    self.count += 1
                    if self.count < 3:
                        time.sleep(10)
                        continue
                    else:
                        print '更换邮箱后重试...'
                        self.Mail_choose = not self.Mail_choose
                        self.mail_init()
                        self.count = 0
                        continue
                except Exception as e:
                    error_text = exception_format(get_current_function_name(), e)
                    print error_text
                    time.sleep(10)
                    continue
                else:
                    smtp.quit()
                    self.count = 0
                    break
    

    求各位指教

    10 条回复    2016-05-24 17:05:14 +08:00
    peter999
        1
    peter999  
       2016-05-24 00:59:06 +08:00
    邮箱提供商都有反垃圾措施,免费的非常紧,即使是付费邮箱,每天的发送量也是有限制的,你需要的是这个
    https://sendcloud.sohu.com
    flynaj
        2
    flynaj  
       2016-05-24 01:03:39 +08:00 via Android
    这个是邮件服务器的问题,
    ericls
        3
    ericls  
       2016-05-24 01:22:05 +08:00 via iPhone
    你需要 mailgun
    qqmishi
        4
    qqmishi  
       2016-05-24 01:23:31 +08:00 via Android
    看到 spam 了,可能是网易对发送频率的限制
    SlipStupig
        5
    SlipStupig  
       2016-05-24 02:22:24 +08:00
    对抗 anti-spam filter 不用机器学习会累死你的
    TimePPT
        6
    TimePPT  
       2016-05-24 10:22:21 +08:00
    曾经跟人说过,发邮件是最简单的活也是最复杂的活,待过几家公司,真正懂的技术没几个。
    leisurelylicht
        7
    leisurelylicht  
    OP
       2016-05-24 10:50:48 +08:00
    @peter999
    @flynaj
    @ericls
    @qqmishi
    @SlipStupig
    @TimePPT

    多谢各位,我也觉得是网易的问题。
    比较让人崩溃的是,其实有个早期版本的代码现在还一直在服务器上稳定的跑着没问题,现在这个是我改着改着不知道怎么回事就不能向多人发送了。
    TimePPT
        8
    TimePPT  
       2016-05-24 14:10:12 +08:00
    @leisurelylicht
    ESP (邮件服务商)对个人及企业邮箱账号的每日发件量及发件频率有严格限制,是不允许进行大宗群发的。如果确实需要,还是用商业 EDM 发送服务吧。
    这是反垃圾策略,也是服务成本考虑。
    azh7138m
        9
    azh7138m  
       2016-05-24 14:47:33 +08:00
    @SlipStupig 请问机器学习怎么对抗 anti-spam filter ?
    SlipStupig
        10
    SlipStupig  
       2016-05-24 17:05:14 +08:00
    @azh7138m 这个可不是一两句话说的清楚的,关于垃圾邮件检测大概有几十个维度,有几万个向量,主要检测向量在,可以这么划分几个大类(这里只是简单说一下检测的大类,如果详细说明可以出本书了):
    1.IP :主要是检测你的 IP 是否是在黑名单里面
    2.域名:是否有 SPF 记录是否有 DKIM 记录,域名是否在 RBL 这类黑名单
    3.发件源:这个发件源指的不是 IP 也不是域名,而是发件时间和域名信息存在的规律,结合你发件的速度和频率和周期能得出你是不是 spammer ,如果你没做过对抗,你很难听明白,简单的来说, ESP 厂商发现某一个段的 IP 在固定时间以差不多的速度,域名也差不多,这个就有可能是一个 spammer 了
    4.数据:这个是 spammer 检测最大的一块,也是最复杂的一块。这个又可以分为几个小的类型
    4.1 信头:检测信头部相似度,还有一个有没有伪造域名等等等
    4.2 标题:邮件标题相似度,是否存在黑关键字,如果词库中存在存在就报黑,对于主动(AD)的分类为广告箱,例如(AD)恭喜您中奖了,中奖为黑名单由于有 AD 被归类为广告邮件
    4.3 附件:存在附件相似度,是否有敏感内容等等
    4.4 邮件收件人和发件人:这块主要是投递的线性概率是失败率,如果大量投递失败,则被 ban 掉
    4.5 邮件正文这块:我实在不想讲,因为不讲细节都有一堆小标题

    说完了检测方,我们再来说说对抗和 ML 的区别(目前国内没有一家 EDM 能真真靠技术对抗 ESP ,做机器学习过检测更加没有),首先人工定义一些基本策略去测试 ESP 向量阈值,然后拉去被分类的样本进行强化训练,发送之前靠逃逸组件去组合新策略出来,最大程度绕开检测(这个完全是体力活,毫无技术含量可言),最终目的就是根据拉取的样本推测出厂商更新,然后通知开发人员开发新的策略去更新或者做相关的策略组合调整(目前我技术不到家,片面认为全自动是做不到的)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1055 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 20:36 · PVG 04:36 · LAX 12:36 · JFK 15:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.