Sending email with PHP from an SMTP server

$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

I have trouble sending email in PHP. I get an error: SMTP server response: 530 SMTP authentication is required.

I was under the impression that you can send email without SMTP to verify. I know that this mail will propably get filtered out, but that doesn't matter right now.

[mail function]
; For Win32 only.
; http://php.net/smtp
SMTP = localhost
; http://php.net/smtp-port
smtp_port = 25


; For Win32 only.
; http://php.net/sendmail-from
sendmail_from = someonelse@example.com

This is the setup in the php.ini file. How should I set up SMTP? Are there any SMTP servers that require no verification or must I setup a server myself?

843523 次浏览

有些 SMTP 服务器不需要身份验证就可以工作,但是如果服务器需要身份验证,那么就没有办法规避这一点。

PHP 的内置邮件函数非常有限——只能在 WIndows 中指定 SMTP 服务器。在 * nix 上,mail()将使用操作系统的二进制文件。

如果要将电子邮件发送到网络上的任意 SMTP 服务器,请考虑使用类似 SwiftMailer的库。这将使您能够使用,例如,谷歌邮件的外出服务器。

当您通过需要 SMTP Auth 的服务器发送电子邮件时,您确实需要指定它,并设置主机、用户名和密码(如果不是默认端口,可能还需要设置端口 -25)。

例如,我通常使用 PHPMailer,其设置与下面这个类似:

$mail = new PHPMailer();


// Settings
$mail->IsSMTP();
$mail->CharSet = 'UTF-8';


$mail->Host       = "mail.example.com";    // SMTP server example
$mail->SMTPDebug  = 0;                     // enables SMTP debug information (for testing)
$mail->SMTPAuth   = true;                  // enable SMTP authentication
$mail->Port       = 25;                    // set the SMTP port for the GMAIL server
$mail->Username   = "username";            // SMTP account username example
$mail->Password   = "password";            // SMTP account password example


// Content
$mail->isHTML(true);                       // Set email format to HTML
$mail->Subject = 'Here is the subject';
$mail->Body    = 'This is the HTML message body <b>in bold!</b>';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';


$mail->send();

你可以在这里找到更多关于 PHPMailer 的信息: https://github.com/PHPMailer/PHPMailer

<?php
ini_set("SMTP", "aspmx.l.google.com");
ini_set("sendmail_from", "YOURMAIL@gmail.com");


$message = "The mail message was sent with the following mail setting:\r\nSMTP = aspmx.l.google.com\r\nsmtp_port = 25\r\nsendmail_from = YourMail@address.com";


$headers = "From: YOURMAIL@gmail.com";


mail("Sending@provider.com", "Testing", $message, $headers);
echo "Check your email now....&lt;BR/>";
?>

或者,更详细地说,继续读

对于 Unix 用户,mail ()实际上是使用 发邮件命令发送电子邮件。不需要修改应用程序,您可以更改环境。你好是一个 SMTP 客户端,具有与 Sendmail 兼容的 CLI 语法,这意味着它可以代替 Sendmail 使用。只需要对 php.ini 做一个小小的修改。

sendmail_path = "/usr/bin/msmtp -C /path/to/your/config -t"

然后,即使是低级的 mail ()函数也可以使用 SMTP 优点。如果您试图在不修改应用程序的情况下将现有应用程序连接到 sendgrid 或 mandrill 之类的邮件服务,那么它非常有用。

问题是 PHP mail()函数的功能非常有限。有几种从 PHP 发送邮件的方法。

  1. mail()在系统上使用 SMTP 服务器。至少有两台服务器可以在 Windows 上使用: HMailServerXmail。我花了好几个小时来配置和升起它们。我认为第一个更简单。目前,hMailServer 正在 Windows7x64上运行。
  2. mail()通过 Linux 在远程或虚拟机上使用 SMTP 服务器。当然,像 Gmail 这样的真正的邮件服务不允许没有任何凭证或密钥的直接连接。您可以设置虚拟机或使用位于您的 LAN 中的虚拟机。大多数 Linux 发行版都有开箱即用的邮件服务器。配置一下,玩得开心点。我在 Debian7上使用缺省 exim4监听它的 LAN 接口。
  3. 邮件库使用直接连接。Libs 更容易建立。我用的是 SwiftMailer,它完美地从 Gmail 账户发送邮件。我认为 PHPMailer 也很不错。

不管你的选择是什么,我建议你使用一些抽象层。您可以在运行 Windows 的开发机器上使用 PHP 库,在使用 Linux 的生产机器上使用简单的 mail()函数。抽象层允许您根据应用程序所运行的系统交换邮件驱动程序。用抽象 send()方法创建抽象 MyMailer类或接口。继承两个类 MyPhpMailerMySwiftMailer。以适当的方式实现 send()方法。

在 Linux 上托管 WordPress站点并具有服务器访问权限的情况下,可以通过安装 msmtp 来节省一些麻烦,msmtp 允许您从标准 PHP mail ()函数通过 SMTP发送。Msmtp 是后缀的一个更简单的替代品,后缀需要更多的配置。

以下是步骤:

安装 msmtp

sudo apt-get install msmtp-mta ca-certificates

创建一个新的配置文件:

sudo nano /etc/msmtprc

... 配置信息如下:

# Set defaults.
defaults


# Enable or disable TLS/SSL encryption.
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt


# Set up a default account's settings.
account default
host <smtp.example.net>
port 587
auth on
user <username@example.net>
password <password>
from <address-to-receive-bounces@example.net>
syslog LOG_MAIL

您需要替换由“ <”和“ >”中的所有内容表示的配置数据(包括,删除这些内容)。对于 host/username/password,使用通常的凭据通过邮件提供程序发送邮件。

告诉 PHP 使用它

sudo nano /etc/php5/apache2/php.ini

加上这一行:

sendmail_path = /usr/bin/msmtp -t

完整的文档可以在这里找到:

Https://marlam.de/msmtp/

对于另一种方法,您可以采用如下文件:

From: Sunday <sunday@gmail.com>
To: Monday <monday@gmail.com>
Subject: Day


Tuesday Wednesday

像这样发送:

<?php
$a1 = ['monday@gmail.com'];
$r1 = fopen('a.txt', 'r');
$r2 = curl_init('smtps://smtp.gmail.com');
curl_setopt($r2, CURLOPT_MAIL_RCPT, $a1);
curl_setopt($r2, CURLOPT_NETRC, true);
curl_setopt($r2, CURLOPT_READDATA, $r1);
curl_setopt($r2, CURLOPT_UPLOAD, true);
curl_exec($r2);

Https://php.net/function.curl-setopt

我为 PHP 创建了一个简单的轻量级 SMTP 电子邮件发送器,如果有人需要的话:

Https://github.com/nerdtrix/ezmail

它在生产和开发环境中都进行了测试。

我知道这是一个老问题,但它仍然是活动的,我看到的所有答案都显示了基本的认证,这是不推荐的。下面的例子展示了如何使用带 XOAUTH2身份验证的 PHPMailer 通过 Google 的 Gmail 服务器发送邮件:

//Import PHPMailer classes into the global namespace
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\OAuth;
//Alias the League Google OAuth2 provider class
use League\OAuth2\Client\Provider\Google;


//SMTP needs accurate times, and the PHP time zone MUST be set
//This should be done in your php.ini, but this is how to do it if you don't have access to that
date_default_timezone_set('Etc/UTC');


//Load dependencies from composer
//If this causes an error, run 'composer install'
require '../vendor/autoload.php';


//Create a new PHPMailer instance
$mail = new PHPMailer();


//Tell PHPMailer to use SMTP
$mail->isSMTP();


//Enable SMTP debugging
//SMTP::DEBUG_OFF = off (for production use)
//SMTP::DEBUG_CLIENT = client messages
//SMTP::DEBUG_SERVER = client and server messages
$mail->SMTPDebug = SMTP::DEBUG_SERVER;


//Set the hostname of the mail server
$mail->Host = 'smtp.gmail.com';


//Set the SMTP port number:
// - 465 for SMTP with implicit TLS, a.k.a. RFC8314 SMTPS or
// - 587 for SMTP+STARTTLS
$mail->Port = 465;


//Set the encryption mechanism to use:
// - SMTPS (implicit TLS on port 465) or
// - STARTTLS (explicit TLS on port 587)
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS;


//Whether to use SMTP authentication
$mail->SMTPAuth = true;


//Set AuthType to use XOAUTH2
$mail->AuthType = 'XOAUTH2';


//Fill in authentication details here
//Either the gmail account owner, or the user that gave consent
$email = 'someone@gmail.com';
$clientId = 'RANDOMCHARS-----duv1n2.apps.googleusercontent.com';
$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';


//Obtained by configuring and running get_oauth_token.php
//after setting up an app in Google Developer Console.
$refreshToken = 'RANDOMCHARS-----DWxgOvPT003r-yFUV49TQYag7_Aod7y0';


//Create a new OAuth2 provider instance
$provider = new Google(
[
'clientId' => $clientId,
'clientSecret' => $clientSecret,
]
);


//Pass the OAuth provider instance to PHPMailer
$mail->setOAuth(
new OAuth(
[
'provider' => $provider,
'clientId' => $clientId,
'clientSecret' => $clientSecret,
'refreshToken' => $refreshToken,
'userName' => $email,
]
)
);


//Set who the message is to be sent from
//For gmail, this generally needs to be the same as the user you logged in as
$mail->setFrom($email, 'First Last');


//Set who the message is to be sent to
$mail->addAddress('someone@gmail.com', 'John Doe');


//Set the subject line
$mail->Subject = 'PHPMailer GMail XOAUTH2 SMTP test';


//Read an HTML message body from an external file, convert referenced images to embedded,
//convert HTML into a basic plain-text alternative body
$mail->CharSet = PHPMailer::CHARSET_UTF8;
$mail->msgHTML(file_get_contents('contentsutf8.html'), __DIR__);


//Replace the plain text body with one created manually
$mail->AltBody = 'This is a plain-text message body';


//Attach an image file
$mail->addAttachment('images/phpmailer_mini.png');


//send the message, check for errors
if (!$mail->send()) {
echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
echo 'Message sent!';
}

参考资料: PHPMailer 示例文件夹