使用 python 发送邮件,为什么会被认为垃圾邮件(返回 554 DT.SPM)

2016-05-24 11:03:42 +08:00
 ryan93

我在 csdn 和 cnblog 找到关于 python 发送邮件的例子,代码如下。但在执行时却返回 554 DT.SPM 的错误,上网找原因是对方服务器认为是垃圾邮件而拒收了。还有,关于代码中 msg['To']=';'.join(to_list) 是什么意思?我该如何理解这行代码?

#!/usr/bin/python
import smtplib
from email.mime.text import MIMEText
 
mailto_list="xxx@hotmail.com"
 
mail_host="smtp.163.com"
mail_user="xxx"
mail_pass="xxx"
mail_postfix="163.com"
 
def send_mail(to_list, sub, content):
        me="Ryan Mok"+"<"+mail_user+"@"+mail_postfix+">"
        msg=MIMEText(content, _subtype='plain',_charset='gb2312')
        msg['Subject']=sub
        msg['From']=me
        msg['To']=';'.join(to_list)
        try:
                server=smtplib.SMTP()
                server.connect(mail_host)
                server.login(mail_user,mail_pass)
                server.sendmail(me,to_list,msg.as_string())
                server.close()
                return True
        except Exception, e:
         print str(e)
         return False
 
if __name__ == '__main__':
        if send_mail(mailto_list,"This is test mail","This is a test email send from python."):
                print "Send succeed!\n"
        else:
                print "Send failed!\n"
26228 次点击
所在节点    Python
13 条回复
jugelizi
2016-05-24 11:14:11 +08:00
发送给多个人呗 你 web 端写邮件不也是分号加多个人嘛
vexplore
2016-05-24 11:23:28 +08:00
我也试过网易邮箱,发多人不行,发单人可以,发单人 cc 一个人也可以, cc 多了也不行。
upczww
2016-05-24 12:06:31 +08:00
把分号插进收件人列表, a@z.com;b@z.com;c@z.com 这样子
TimePPT
2016-05-24 15:46:08 +08:00
被判垃圾邮件常见情况:
1. 发送频率过大;
2. 收件人有大量无效地址;
3. 发送域名 /IP 信用评级过低;
4. 用了个人邮箱或企业邮箱的个人账户大量群发直接被邮件服务发件方给 ban 了。

对于 1 :减小发送频率;
对于 2 :严控收件人地址真实性;
对于 3 :做好域名反解析,有条件的上数字签名( SPF 和 DKIM );
对于 4 :自建 sendmail 服务或者用专业的 EDM 发送服务。

其实,你只要用下专业 EDM 发送服务,加上初始配置合理,发小宗邮件无压力。
yylzcom
2016-05-24 15:48:58 +08:00
用 smtp 协议,另外做好 spf 和 dkim ,不要发送大量重复内容(用户不需要)的邮件
leisurelylicht
2016-05-24 16:07:18 +08:00
@vexplore 如果不是量特别大的话,发多人是可以的
foo2bar
2016-05-24 17:42:25 +08:00
>>> mailto_list="v2ex@hotmail.com"
>>> list_1 = ';'.join(mailto_list)
>>> print list_1
v;2;e;x;@;h;o;t;m;a;i;l;.;c;o;m
>>> list_2 = ';'.join([mailto_list])
>>> print list_2
v2ex@hotmail.com

明明你写的是"mailto_list",为什么赋值是一个字符串?把 mailto_list 赋值一个 list ,你再使用 join()看看结果。
bravecarrot
2016-05-24 17:46:12 +08:00
我之前做过,据我观察,很可能和邮件内容有关
包括 subject 和 content
bravecarrot
2016-05-24 17:57:06 +08:00
“;” join ( list )
是指把 list 中的所有元素按顺序连起来,用;做分割,
返回一个字符串。
;可以是任意字符或字符串
list 是 list 或字符串等 iterable 对象。



手机回复,对格式别挑剔啦。
georgema1982
2016-05-25 04:01:50 +08:00
很多邮箱服务器对于使用它们的 smtp 发送邮件有很大限制,唯恐你用他们的 smtp 来发送垃圾邮件。所以一般不建议直接用 smtp 发送邮件,而是用专门的邮件发送服务(比如 sparkpost )
ryan93
2016-05-25 09:06:27 +08:00
foo2bar
2016-05-25 09:40:05 +08:00
@ryan93
为什么要这样写?
因为 send_mail()接收一个 list ,而 msg['To']接收的是一个字符串,所以在这里用 join()方法把 list 里的所有字符串连接为一个字符串。
ryan93
2016-05-25 10:29:20 +08:00
@TimePPT 我发现 hotmail 检查垃圾邮件规则很严格,我用 163.com, sina.com, qq.com, foxmail.com 等邮箱均可发送成功, hotmail 相同主题和内容发送成功一次,第二次发送就拒收了。

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

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

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

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

© 2021 V2EX