外部托管电子邮件并使用 PHP 发送电子邮件

Posted

技术标签:

【中文标题】外部托管电子邮件并使用 PHP 发送电子邮件【英文标题】:Externally hosted email and using PHP to send email 【发布时间】:2018-01-12 01:00:04 【问题描述】:

我将使用 G Suite(以前称为 Google Apps)来托管在单独主机上运行的网站的电子邮件。

但是,网站上有一个联系表,我还没有看,但我认为它会使用标准的mail() 函数。

据我了解mail() 仍将使用服务器邮件服务器发送邮件,这可能是一个愚蠢的问题,但我认为这不会因此导致任何垃圾邮件检测问题?比如,我知道如果 From 和/或 Sender 标头与来自的服务器不匹配(或者在某些情况下,如果您在这些标题中设置的电子邮件不存在)。

因此,如果邮件托管在 G Suite 上,并且From/Sender 标头中设置的电子邮件地址存在于 G Suite 上,这不会导致有没有正确的问题?

最后,我知道使用 SMTP 通过 Google 发送邮件可能是一个更好的主意,但我可能没有这个选择,所以我想找出上面的答案以防万一。

编辑:根据 Nima 的 answer,这是可以避免的,还是只能使用 Google 的 SMTP 服务器发送?

【问题讨论】:

这不是***.com/a/33506709/623150 的部分副本,因为您可以使用 SMTP 到 gmail 从 gmail 服务器发送电子邮件 @MartinBarker 不,请阅读我对您的回答的回复。我的问题是不是关于使用 SMTP;我谈到了这一点,但主要问题是基于设置邮件标题,如果这样做会导致任何问题。 好的,所以根据您的反馈,您到底想要回答什么,请使用sendmail 或使用 SMTP。由于sendmail 仅用作 SMTP 前面的管理器应用程序,因此它们是 php 中唯一的选择,除非您想为您的服务器构建自己的 sendmail 兼容的可执行文件 这不是 PHP 问题。这是一个邮件服务器问题。您可能会在 ServerFault 上获得更好的答案。但是,如果您想从您的 MailServer 接受其他电子邮件提供商的电子邮件,您需要确保反向 DNS (RDNS) 可能已配置并与发件人域匹配。 @MartinBarker 我认为我的问题清楚地解释了我想要回答的内容;如果通常这样做不会导致任何问题,或者是否有可能,我会更好地建议直接从 Google 使用 SMTP。 【参考方案1】:

当您使用 GSUITE 托管电子邮件时,很明显您将向 GSUITE 提供一些域名。

现在,电子邮件根据内容以及发送服务器的证书被标记为垃圾邮件而不是垃圾邮件,并且发送服务器对面向交易和面向营销的电子邮件提供不同的服务。而 GSUITE 仅提供事务性邮件服务,来自邮件服务的事务性邮件(具有有效证书且未列入黑名单)会直接进入收件箱或其他标签,但会进入垃圾邮件/促销。

现在 GSUITE 拥有所有正确的证书,我认为没有任何面向消费者的邮件服务提供商可以阻止来自谷歌服务器的电子邮件。

其他问题:- 电子邮件标题中的From Address 重要吗? 到目前为止,我从未见过 from address 会影响接收服务器的任何内容,但是一些消费者邮件服务会阻止使用 from address 而非帐户电子邮件地址,就像移动运营商不让我们使用别人的 caller id 一样(理想情况下)。 但是企业的邮件服务提供商允许您在电子邮件标题中使用任何地址作为from 值。

编辑:- 如果您仍然不确定电子邮件的传递,您可以使用 replyTo 标头没有任何问题。

PS:- 我自己用数千封电子邮件对此进行了测试,但使用的是 SendGrid 服务器。

【讨论】:

设置From: 标头肯定会对一些接收邮件服务器产生影响,我一次又一次地看到人们有时收不到邮件的情况他们的联系表格,这是因为 From: 标头已设置为提交表格的用户电子邮件,而不是来自发送服务器的电子邮件地址;这就是为什么始终使用 Reply-To: 标头总是一个好主意的原因;我看到的另一个问题是一些服务器拒绝来自实际不存在的地址的邮件。 嗯,是的,我知道我可以使用reply-to,但正如我指出的,由于From: 和/或Sender: 地址不正确,某些服务器会拒绝电子邮件,我正在尝试建立如果我不能使用 SMTP,最好的方法。 @Brett 好吧,那么 replyTo 将是最好的解决方案。 不是真的,这只是设置Reply-to 地址,你仍然需要设置From: - 这是必需的。【参考方案2】:

http://php.net/manual/en/function.mail.php

mail() 的 Windows 实现在许多方面与 Unix 实现。首先,它不使用本地二进制文件 撰写消息,但仅在直接套接字上运行,这意味着 需要 MTA 侦听网络套接字(可以在 本地主机或远程机器)。

在 linux 上,sendmail 可执行文件用于与 Windows 上配置的 SMTP 服务器通信,您可以/可以配置 mail() 函数以使用 SMTP

所以最好的方式是直接使用SMTP发送邮件到Gmail发送邮件。

取自: https://***.com/a/33506709/623150

这是使用 PHP PEAR 的一种方法

// Pear Mail Library
require_once "Mail.php";

$from = '<your@mail.com>'; //change this to your email address
$to = '<someone@mail.com>'; // change to address
$subject = 'Insert subject here'; // subject of mail
$body = "Hello world! this is the content of the email"; //content of mail

$headers = array(
    'From' => $from,
    'To' => $to,
    'Subject' => $subject
);

$smtp = Mail::factory('smtp', array(
        'host' => 'ssl://smtp.gmail.com',
        'port' => '465',
        'auth' => true,
        'username' => 'your@gmail.com', //your gmail account
        'password' => 'snip' // your password
    ));

// Send the mail
$mail = $smtp->send($to, $headers, $body);

如果您使用 gmail smtp,请记住在您的 gmail 帐户中启用 SMTP, 在设置下

在 Linux 服务器上,您不能通过邮件功能使用 SMTP。

【讨论】:

感谢您的回答,但我已经知道如何使用 SMTP。我的问题是关于使用 PHP 的 mail 函数和/或 sendmail,它会导致 gmail 认为 from/sender 值是否可疑。 已更新以隐藏它,因为它的工作方式因您使用的操作系统而异 SMTP 服务器是发送电子邮件而不是 PHP,如果您不提供标头,它不会在 Google 的 SMTP 服务器上覆盖它们,如果您这样做,只会让它们丢失。 我知道 PHP 在技术上并不发送电子邮件本身,但我想你知道我在这里得到什么 - 让 PHP 到 port 或设置是有区别的您的邮件要发送到 SMTP 服务器,而不是直接使用 SMTP。【参考方案3】:

如果你想要它简单,那么简单使用SMTP。

由于垃圾邮件,多个邮件服务器提供商正在阻止来自未配置正确 RDNS (Reverse DNS) 和 MTA 名称的邮件服务器的邮件。

您要确保所有三个名称都根据您的 MX 记录匹配:

发件人主机名(例如 *mail@demohost.com、note that from can be what ever you want) MTA-Name/HELO-Hostname(在 Mailserver 中配置,例如 demohost.com) RDNS(基本上它为每个 IP 地址提供主机名(例如 42.42.42.42 -> demohost.com)

还要确保您的 php.ini 对您的邮件服务器进行了正确的配置。恭喜您现在可以使用 mail(...) 发送邮件了。

正如我所说,使用 SMTP 可能是最简单的。将繁重的工作分配给主持人。

【讨论】:

好的,所以您基本上是在说,将From: 和/或Sender: 标头设置为GSuite 所在的邮件域可能不是一个好主意。 -fact 不是来自 Google 的邮件服务器,但如果我出于某种原因想要这样做,那么我必须按照您上面的解释进行操作?如果是这样,那么是的,SMTP 似乎 更容易哈! 不要混淆FromSender。看看here。基本上,发件人主机名是带有 MX-Record 到您的邮件服务器的主机名。发件人可以有不同的域,例如您的谷歌地址。但是,是的,如果您已经拥有一个邮件服务器,为什么还要维护自己的邮件服务器。每个 SMTP 的简单身份验证。这就是要走的路。 @布雷特 另外请注意,您可以有一个单独的电子邮件帐户用于发送目的,如果这就是您不喜欢 SMTP 的原因,则该帐户具有您的主电子邮件帐户的“发件人”。由于 gmail 以重写这些标头而闻名,也许您可​​以使用另一个发件人从站。 Normaly 你在你的域名卖家有一个电子邮件帐户?或者,您也可以更改 Reply-To,而不是更改 From。但这只是假设您提出问题的动机。 @布雷特 好吧,我一点也不讨厌 SMTP,只是不确定在这种情况下我是否会使用它。我通常将From: 标头设置为noreply@mydonain.com,将Reply-to: 设置为提交表单的用户电子邮件;这是因为过去曾发生过一些邮件服务器在将From: 设置为用户电子邮件地址时拒绝邮件的情况;但也许那是因为我没有设置 Sender: 标头? 这很可能是因为使用了本地邮件服务器,而域可能未配置为(请参阅上面的 3 个主机名)。发件人通常由邮件服务器设置。要么正确配置邮件服务器,要么永远无法正常工作。在 php 方面没有什么可以改变的。

以上是关于外部托管电子邮件并使用 PHP 发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

通过 php 脚本定期发送电子邮件

用于打开 Outlook 并发送电子邮件的 PHP 代码

从托管在 Hostgator 服务器上的 PHP 脚本发送 SMTP 电子邮件

如何强制电子邮件程序显示使用 php 在 html 电子邮件中发送的图像?

使用 PHP 有效地使用 Google App Engine 发送大量电子邮件?

使用 PHP Mailer 从本地服务器外部的电子邮件地址发送 smtp 电子邮件