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
ryan93
V2EX  ›  Python

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

  •  1
     
  •   ryan93 · 2016-05-24 11:03:42 +08:00 · 26187 次点击
    这是一个创建于 2865 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    #!/usr/bin/python
    import smtplib
    from email.mime.text import MIMEText
     
    mailto_list="[email protected]"
     
    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"
    13 条回复    2016-05-25 10:29:20 +08:00
    jugelizi
        1
    jugelizi  
       2016-05-24 11:14:11 +08:00
    发送给多个人呗 你 web 端写邮件不也是分号加多个人嘛
    vexplore
        2
    vexplore  
       2016-05-24 11:23:28 +08:00 via iPhone
    我也试过网易邮箱,发多人不行,发单人可以,发单人 cc 一个人也可以, cc 多了也不行。
    upczww
        3
    upczww  
       2016-05-24 12:06:31 +08:00
    把分号插进收件人列表, [email protected];[email protected];[email protected] 这样子
    TimePPT
        4
    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
        5
    yylzcom  
       2016-05-24 15:48:58 +08:00
    用 smtp 协议,另外做好 spf 和 dkim ,不要发送大量重复内容(用户不需要)的邮件
    leisurelylicht
        6
    leisurelylicht  
       2016-05-24 16:07:18 +08:00
    @vexplore 如果不是量特别大的话,发多人是可以的
    foo2bar
        7
    foo2bar  
       2016-05-24 17:42:25 +08:00
    >>> mailto_list="[email protected]"
    >>> 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
    [email protected]

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



    手机回复,对格式别挑剔啦。
    georgema1982
        10
    georgema1982  
       2016-05-25 04:01:50 +08:00
    很多邮箱服务器对于使用它们的 smtp 发送邮件有很大限制,唯恐你用他们的 smtp 来发送垃圾邮件。所以一般不建议直接用 smtp 发送邮件,而是用专门的邮件发送服务(比如 sparkpost )
    ryan93
        11
    ryan93  
    OP
       2016-05-25 09:06:27 +08:00
    foo2bar
        12
    foo2bar  
       2016-05-25 09:40:05 +08:00
    @ryan93
    为什么要这样写?
    因为 send_mail()接收一个 list ,而 msg['To']接收的是一个字符串,所以在这里用 join()方法把 list 里的所有字符串连接为一个字符串。
    ryan93
        13
    ryan93  
    OP
       2016-05-25 10:29:20 +08:00
    @TimePPT 我发现 hotmail 检查垃圾邮件规则很严格,我用 163.com, sina.com, qq.com, foxmail.com 等邮箱均可发送成功, hotmail 相同主题和内容发送成功一次,第二次发送就拒收了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   994 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 22:16 · PVG 06:16 · LAX 15:16 · JFK 18:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.