V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
meteor2013
V2EX  ›  PHP

折磨了好几天了。 用PHP的原生的mail()发邮件,显示发送成功。就是收不到

  •  
  •   meteor2013 · 2013-06-25 09:43:03 +08:00 · 16565 次点击
    这是一个创建于 4201 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是PHP网站上的示例代码:

    <?php
    $to = '[email protected]'; //这里已经改为自己的email
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
    'Reply-To: [email protected]' . "\r\n" .
    'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
    ?>


    我的环境是,
    1. Mac Pro上mountain lion运行的MAMP
    2. Windows 7上运行的XAMPP

    都修改了php.ini 里面的 [mail function]的设置.

    不管是MAMP 还是XAMPP , 都是发送成功。就是收不到邮件。
    大家觉得是什么原因啊?
    23 条回复    1970-01-01 08:00:00 +08:00
    solupro
        1
    solupro  
       2013-06-25 09:49:35 +08:00
    这个是要本地smtp服务支持的吧
    meteor2013
        2
    meteor2013  
    OP
       2013-06-25 09:55:49 +08:00
    @solupro

    必须要本地smtp服务吗?
    为什么php.ini 里面的 [mail function], 如果设置For Unix 就不需要设置SMTP 呢?
    是不是可以选SMTP 发送,也可以sendmail发送? 有点晕了。。。。。


    [mail function]
    ; For Win32 only.
    SMTP = localhost
    smtp_port = 25

    ; For Win32 only.
    ;sendmail_from = [email protected]

    ; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
    ;sendmail_path =
    lichao
        3
    lichao  
       2013-06-25 10:01:38 +08:00
    你声称邮件来自 example.com,那你机器的 hostname 是否是 example.com 呢,收邮件的时候会去验证的。否则你能以任何人的名义发邮件了
    meteor2013
        4
    meteor2013  
    OP
       2013-06-25 10:10:02 +08:00
    @lichao 发件人地址没有关系。只要收件人地址对了就可以。
    我在MT(http://mediatemple.net/)上的服务器上运行 上面的示例代码, 就可以发到我的Gmail邮箱。

    现在的问题是我自己架设的2台电脑发出去收不到 (1. Mac Pro上mountain lion运行的MAMP
    2. Windows 7上运行的XAMPP)
    lichao
        5
    lichao  
       2013-06-25 10:15:35 +08:00
    @meteor2013 发件人地址没有关系??

    不认同你的看法。Gmail 会去验证你邮箱的 domain 跟你发邮件的 IP 是否匹配的。否则你可以用 任意如:[email protected] 的发件人地址来发邮件了。
    wtbhk
        6
    wtbhk  
       2013-06-25 10:36:43 +08:00
    @meteor2013 这么草率的就说发件地址没关系?我记得我当时学习邮件协议的时候就试过了,发件地址还真有关系,但具体取决于收件邮箱服务器的规则。
    solupro
        7
    solupro  
       2013-06-25 10:42:43 +08:00
    @meteor2013
    嗯,配置默认就是监听localhost的25端口了吧。
    至于调用远程服务器的smtp服务发送邮件,可以看看这里
    http://email.about.com/od/emailprogrammingtips/qt/Configure_PHP_to_Use_a_Remote_SMTP_Server_for_Sending_Mail.htm
    但是如果远程服务器需要验证好像就不能通过mail函数发送了,里面有相关链接你可以参考一下!
    jerry
        8
    jerry  
       2013-06-25 10:46:44 +08:00
    需要smtp服务支持的,linux一般默认都安装了sendmail做MTA
    meteor2013
        9
    meteor2013  
    OP
       2013-06-25 10:51:18 +08:00
    @wtbhk @lichao
    各位大哥,我是真用example.com发到我gmail了啊。
    请看下图:
    [img]http://s8.postimg.org/z5xxdxa3p/20130624223627.jpg[/img]
    meteor2013
        10
    meteor2013  
    OP
       2013-06-25 10:53:09 +08:00
    @jerry 看来问题真是smtp? 就是说一定要设置smtp服务?
    在 MAMP上怎么装sendmail做MTA呢?
    lichao
        11
    lichao  
       2013-06-25 11:07:28 +08:00
    @meteor2013 那说明 Gmail 过滤规则有时候会变(你即使受到了,应该也是在垃圾箱吧),我几年前还伪装成比尔盖茨的邮件地址发邮件给我同学来着,但是现在肯定行不通了。
    solf
        12
    solf  
       2013-06-25 12:11:40 +08:00
    linux 下的sendmail或者postfix关了,启动一下这个service吧。

    Mac不知道有没有这个MTA
    darasion
        13
    darasion  
       2013-06-25 12:17:50 +08:00
    haijd
        14
    haijd  
       2013-07-02 17:58:23 +08:00
    发邮件还是建议使用 SMTP 协议,注册一个正规的邮箱来发,不然很容易被当做垃圾邮件过滤掉的。
    Gmail少量测试还可以,数量多以后一样会被判为垃圾邮件。
    code4craft
        15
    code4craft  
       2013-07-03 07:37:08 +08:00
    程序内调用的话,应该也是用SMTP协议发送(不清楚PHP,但是如果之前发送收到了,那应该就是对的),跟本地搭建MTA的效果差距不大。
    SMTP本身不复杂,但是邮件运营方的过滤策略就比较复杂了。抛开内容不谈,大的运营商都会根据发信IP进行过滤,你可以在gmail里选一封邮件,显示原始邮件,`Received: from`一栏就能说明问题了。你这样的邮件很可能已经被gmail拒收了。
    你可以本地搭建一个接收服务器(postfix之类的),然后测试一下。
    gdtv
        16
    gdtv  
       2013-07-04 13:06:17 +08:00
    你电脑上必须要有邮件服务器才行,
    我是windows7+xampp
    php.ini 里面的 [mail function]不用修改,用默认的设置就行
    在win7里运行1st smtp server这个简单的邮件服务器软件,打开就行,不用设置,下载地址自己去谷歌一下。
    然后就可以在php里直接用mail()函数发送了,并且1st smtp server还能看到出错信息,方便调试。

    如果你电脑上没有邮件服务器,就要用smtp方式发送,要修改php.ini 里面的 [mail function]或者在php里用代码实现。
    shiny
        17
    shiny  
       2013-07-04 13:08:15 +08:00
    发件地址gmail和国内一些邮箱是不会验证的,但是QQ邮箱会。以前试过伪造 @taobao.com 的地址都成功了。
    clowwindy
        18
    clowwindy  
       2013-07-04 13:25:33 +08:00
    1. 本地要有 sendmail。
    2. 生产环境要支持 SPF 和 DKIM,或者找邮件服务商,比如 Mailgun 帮你发。否则多半会进垃圾邮件,或者垃圾邮件都没进。
    vilic
        19
    vilic  
       2013-07-04 13:32:10 +08:00
    服务器信誉问题?对应发件域名添加相关txt记录应该就可以了。就像hotmail验证其他邮箱之后可以发送对应邮件一样,别个收件的相信那个发件服务器。
    shixinyu
        20
    shixinyu  
       2013-07-04 23:25:30 +08:00
    现在自建邮件服务器不靠谱的地方就在于发出去了,对方不一定能收到,不是被对方邮箱服务商拒收就是放入垃圾箱了。所以应该考虑使用EDM商,非专业的用QQ企业邮箱绑定自己域名来走SMTP协议发送,专业的用搜狐的SendCloud(http://sendcloud.sohu.com)来发送吧。
    octopus_new
        21
    octopus_new  
       2013-07-04 23:30:30 +08:00
    奇怪,难道你们都不清楚为什么?
    先问问LZ网络是家用网络么?是固定IP么?非商用网络运营商对25端口都做过处理,为了防止spam。如果想要发信,你需要做relay。用Gmail做Relay就可以,sendmail or postfix
    做好relay之后就可以发信啦!
    flyingnn
        22
    flyingnn  
       2013-07-04 23:57:41 +08:00
    https://github.com/Synchro/PHPMailer

    用这个蛮好的呀。
    ybf1220
        23
    ybf1220  
       2013-07-05 00:57:26 +08:00
    不用smtp协议是不可能的,如果要用本地MTA发的话.ML自带postfix,基本完全兼容sendmail这MTA的,不过收不收的到这是关于邮件过滤规则了,毕竟这是私自架设的,另外简单点直接用网络上的MTA去发,只要有个帐号就行啦,肯定是行的,
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 01:17 · PVG 09:17 · LAX 17:17 · JFK 20:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.