meteor2013
V2EX  ›  PHP

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

  •  
  •   meteor2013 · Jun 25, 2013 · 18241 views
    This topic created in 4883 days ago, the information mentioned may be changed or developed.
    这是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 replies  •  1970-01-01 08:00:00 +08:00
    solu
    solu
    Jun 25, 2013
    1
    这个是要本地smtp服务支持的吧
    meteor2013
    meteor2013
    OP
    Jun 25, 2013
    2
    @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
    lichao
    Jun 25, 2013
    3
    你声称邮件来自 example.com,那你机器的 hostname 是否是 example.com 呢,收邮件的时候会去验证的。否则你能以任何人的名义发邮件了
    meteor2013
    meteor2013
    OP
    Jun 25, 2013
    4
    @lichao 发件人地址没有关系。只要收件人地址对了就可以。
    我在MT(http://mediatemple.net/)上的服务器上运行 上面的示例代码, 就可以发到我的Gmail邮箱。

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

    不认同你的看法。Gmail 会去验证你邮箱的 domain 跟你发邮件的 IP 是否匹配的。否则你可以用 任意如:[email protected] 的发件人地址来发邮件了。
    wtbhk
    wtbhk
    Jun 25, 2013
    6
    @meteor2013 这么草率的就说发件地址没关系?我记得我当时学习邮件协议的时候就试过了,发件地址还真有关系,但具体取决于收件邮箱服务器的规则。
    solu
    solu
    Jun 25, 2013
    7
    @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
    jerry
    Jun 25, 2013
    8
    需要smtp服务支持的,linux一般默认都安装了sendmail做MTA
    meteor2013
    meteor2013
    OP
    Jun 25, 2013
    9
    @wtbhk @lichao
    各位大哥,我是真用example.com发到我gmail了啊。
    请看下图:
    [img]http://s8.postimg.org/z5xxdxa3p/20130624223627.jpg[/img]
    meteor2013
    meteor2013
    OP
    Jun 25, 2013
    10
    @jerry 看来问题真是smtp? 就是说一定要设置smtp服务?
    在 MAMP上怎么装sendmail做MTA呢?
    lichao
    lichao
    Jun 25, 2013
    11
    @meteor2013 那说明 Gmail 过滤规则有时候会变(你即使受到了,应该也是在垃圾箱吧),我几年前还伪装成比尔盖茨的邮件地址发邮件给我同学来着,但是现在肯定行不通了。
    solf
    solf
    Jun 25, 2013
    12
    linux 下的sendmail或者postfix关了,启动一下这个service吧。

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

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

    用这个蛮好的呀。
    ybf1220
    ybf1220
    Jul 5, 2013
    23
    不用smtp协议是不可能的,如果要用本地MTA发的话.ML自带postfix,基本完全兼容sendmail这MTA的,不过收不收的到这是关于邮件过滤规则了,毕竟这是私自架设的,另外简单点直接用网络上的MTA去发,只要有个帐号就行啦,肯定是行的,
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1843 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 59ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    ♥ Do have faith in what you're doing.