使用PHP从SMTP服务器发送电子邮件

sqyvllje  于 2023-02-03  发布在  PHP
关注(0)|答案(9)|浏览(260)
$from = "someonelse@example.com";
$headers = "From:" . $from;
echo mail ("borutflis1@gmail.com" ,"testmailfunction" , "Oj",$headers);

我在PHP中发送电子邮件时遇到问题。我收到一个错误:SMTP server response: 530 SMTP authentication is required.
我的印象是,你可以发送电子邮件没有SMTP验证。我知道这封邮件可能会被过滤掉,但这并不重要了。

[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

这是php.ini文件中的设置。我应该如何设置SMTP?是否有任何SMTP服务器不需要验证或必须自己设置服务器?

wlwcrazw

wlwcrazw1#

有一些SMTP服务器不需要身份验证就可以工作,但是如果服务器需要身份验证,就没有办法绕过它。
PHP的内置邮件函数非常有限--指定SMTP服务器只能在Windows中使用。在 *nix中,mail()将使用操作系统的二进制文件。
如果你想把电子邮件发送到网络上的任意SMTP服务器,可以考虑使用SwiftMailer这样的库,这样你就可以使用Google Mail的发送服务器。

qacovj5a

qacovj5a2#

如果您在Linux上托管WordPress站点并具有服务器访问权限,则可以安装msmtp来避免一些麻烦,msmtp允许您从标准PHP mail()函数通过SMTP发送邮件。msmtp是postfix的更简单的替代方案,需要更多的配置。
步骤如下:
安装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

您需要替换由"〈"和"〉"(包括"〉")中的所有内容表示的配置数据。对于主机/用户名/密码,请使用您的普通凭据通过邮件提供商发送邮件。
告诉PHP使用它

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

添加以下单行:

sendmail_path = /usr/bin/msmtp -t

完整文档可在此处找到:
https://marlam.de/msmtp/

yqyhoc1h

yqyhoc1h3#

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

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

ukdjmx9f

ukdjmx9f4#

我知道这是一个老问题,但它仍然活跃,我看到的所有答案都显示基本身份验证,这是过时的。下面是一个例子,显示如何通过谷歌的Gmail服务器发送使用PHPMailer与XOAUTH2身份验证:

//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 examples folder

gpfsuwkq

gpfsuwkq5#

我为PHP创建了一个简单的轻量级SMTP电子邮件发送器,如果有人需要它的话。
https://github.com/Nerdtrix/EZMAIL
它在生产和开发两种环境中进行了测试。

yruzcnhs

yruzcnhs6#

当您通过需要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->setFrom('domain@example.com');   
$mail->addAddress('receipt@domain.com');

$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

41zrol4v

41zrol4v7#

<?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/>";
?>

或者对于更多细节,read on

imzjd6km

imzjd6km8#

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

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

然后,即使是最低级的mail()函数也可以与SMTP一起工作,如果你试图在不修改应用程序的情况下将现有的应用程序连接到sendgrid或mandrill这样的邮件服务,它会非常有用。

fv2wmkja

fv2wmkja9#

问题是PHP mail()函数的功能非常有限,从PHP发送邮件有几种方法。
1.**mail()使用系统上的SMTP服务器。在Windows上至少可以使用两个服务器:hMailServerxmail。我花了几个小时来配置和启动它们。在我看来,第一个更简单。目前,hMailServer正在Windows 7 x64上工作。
1.
mail()在远程或虚拟机上使用SMTP服务器。**当然,像Gmail这样的真实的邮件服务不允许没有任何凭据或密钥的直接连接。您可以设置虚拟机或使用位于您局域网中的虚拟机。大多数Linux发行版都有现成的邮件服务器。配置它并享受乐趣。我在Debian 7上使用默认的exim4来监听其局域网接口。
1.**邮件库使用直接连接。**库更容易设置。我使用了SwiftMailer,它可以完美地从Gmail帐户发送邮件。我认为PHPMailer也很不错。
不管你有什么选择,我建议你使用一些抽象层。你可以在运行Windows的开发机器上使用PHP库,在运行Linux的生产机器上使用mail()函数。抽象层允许你根据应用程序运行的系统交换邮件驱动程序。创建抽象MyMailer类或接口与抽象send()方法。继承MyPhpMailerMySwiftMailer两个类,用适当的方式实现send()方法。

相关问题