折磨了好几天了。 用PHP的原生的mail()发邮件,显示发送成功。就是收不到 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
meteor2013
V2EX    PHP

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

  •  
  •   meteor2013 2013-06-25 09:43:03 +08:00 17180 次点击
    这是一个创建于 4546 天前的主题,其中的信息可能已经有所发展或是发生改变。
    这是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
    solu
        1
    solu  
       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 这么草率的就说发件地址没关系?我记得我当时学习邮件协议的时候就试过了,发件地址还真有关系,但具体取决于收件邮箱服务器的规则。
    solu
        7
    solu  
       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  
    PRO
       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 帮你发。否则多半会进垃圾邮件,或者垃圾邮件都没进。
    vilicvane
        19
    vilicvane  
       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     Solana     1082 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 53ms UTC 18:09 PVG 02:09 LAX 10:09 JFK 13:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86