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

2016-05-24 00:37:34 +08:00
 leisurelylicht

给单个人地址发就没问题,多人 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?= <leisurelylicht@126.com>
Subject: test
To: leisurelylicht@126.com,licht00@163.com

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

求各位指教

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

多谢各位,我也觉得是网易的问题。
比较让人崩溃的是,其实有个早期版本的代码现在还一直在服务器上稳定的跑着没问题,现在这个是我改着改着不知道怎么回事就不能向多人发送了。
TimePPT
2016-05-24 14:10:12 +08:00
@leisurelylicht
ESP (邮件服务商)对个人及企业邮箱账号的每日发件量及发件频率有严格限制,是不允许进行大宗群发的。如果确实需要,还是用商业 EDM 发送服务吧。
这是反垃圾策略,也是服务成本考虑。
azh7138m
2016-05-24 14:47:33 +08:00
@SlipStupig 请问机器学习怎么对抗 anti-spam filter ?
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 向量阈值,然后拉去被分类的样本进行强化训练,发送之前靠逃逸组件去组合新策略出来,最大程度绕开检测(这个完全是体力活,毫无技术含量可言),最终目的就是根据拉取的样本推测出厂商更新,然后通知开发人员开发新的策略去更新或者做相关的策略组合调整(目前我技术不到家,片面认为全自动是做不到的)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/280791

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX