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


131
$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服务器,还是我必须自己设置服务器?

Answers:


168

当通过需要SMTP身份验证的服务器发送电子邮件时,您确实需要指定它,并设置主机,用户名和密码(如果不是默认端口,则设置端口号-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


21
phpMailer +1 —它是PHP内置mail()函数的明智选择。
SDC

8
值得注意的是,PHPMailer也内置在WordPress中,并且可以使用'phpmailer_init'动作挂钩对其进行配置,因此对此答案感到困惑。这是为SMTP邮件或Amazon SES(支持SMTP连接)设置WordPress的便捷方法。
马特·范·安德尔

1
是否可以在付费脚本中使用PHP Mailer?
卢卡

2
@Luka是的。根据他们的许可证文件, PHPMailer使用LGPL 2.1许可证,该许可证允许商业用途。
亚历杭德罗(Alejandro)

我需要做一些特殊的事情来使用此代码吗?我该放在哪里?我可以使用带有POST请求的HTML5表单来调用它吗?创建此PHPMailer对象后,如何发送电子邮件?
亚伦·弗兰克

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

或者,有关更多详细信息,请继续阅读


您用于发送邮件的IP未经550-5.7.1授权,无法直接将电子邮件发送到我们的服务器。我得到这个错误。我想要的只是一个开放的邮件中继。
Borut Flis 2013年

我没有静态IP。您是否知道任何Open Mail中继。
Borut Flis 2013年

1
另外,请参阅support.google.com/a/answer/176600?hl=zh_CN,以获取Google SMTP中继。
fyrye

5
这是解决戈达迪php mail()函数问题的最佳答案-2017年-不必下载PHPMailer或其他第三方资源-谢谢
soulshined

4
“继续阅读”链接已损坏
vladkras

46

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

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

这样,即使是最低的mail()函数也可以使用SMTP优点。如果您尝试将现有应用程序连接到诸如sendgrid或mandrill之类的邮件服务而不修改该应用程序,则它非常有用。


1
很棒的解决方案,现在可以在多台服务器上使用它!
raice

3
在不使用邮件库的应用程序的Docker容器上实现此功能。
Batandwa

从原始版本mail()到支持SMTP的出色迁移路径。谢谢!
rinogo '18

MSMTP也可用于Windows。明显的下载版本为1.4。我在某处找到的版本是1.6.2。不知道Windows是否有1.8.6。
Bilbo

作者于2016年2月之前停止提供Windows二进制文件。
Bilbo

17

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

  1. mail()在系统上使用SMTP服务器。在Windows上至少可以使用两个服务器:hMailServerxmail。我花了几个小时来配置和启动它们。我认为第一个比较简单。目前,hMailServer在Windows 7 x64上运行。
  2. mail() 在装有Linux的远程或虚拟机上使用SMTP服务器。当然,像Gmail这样的真实邮件服务不允许没有任何凭据或密钥的直接连接。您可以设置虚拟机或使用位于局域网中的虚拟机。大多数Linux发行版都有开箱即用的邮件服务器。配置它,玩得开心。我在监听其LAN接口的Debian 7上使用默认的exim4。
  3. 邮件库使用直接连接。库更易于设置。我使用了SwiftMailer,它完美地从Gmail帐户发送邮件。我认为PHPMailer也相当不错。

无论您选择什么,我都建议您使用一些抽象层。您可以在运行Windows的开发计算机上使用PHP库,而仅mail()在Linux的生产计算机上运行即可。抽象层使您可以根据运行应用程序的系统交换邮件驱动程序。MyMailer使用抽象send()方法创建抽象类或接口。继承两个类MyPhpMailerMySwiftMailersend()以适当的方式实施方法。


17

这是使用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);

//check mail sent or not
if (PEAR::isError($mail)) {
    echo '<p>'.$mail->getMessage().'</p>';
} else {
    echo '<p>Message successfully sent!</p>';
}

如果您使用Gmail SMTP,请记住在“设置”下的Gmail帐户中启用SMTP

编辑: 如果在debian / ubuntu上找不到Mail.php,则可以使用以下方式安装php-pear

sudo apt install php-pear

然后安装邮件扩展:

sudo pear install mail
sudo pear install Net_SMTP
sudo pear install Auth_SASL
sudo pear install mail_mime

然后,您应该可以通过require_once "Mail.php" 位于此处的其他方式简单地加载它:/usr/share/php/Mail.php


1
require_once('/usr/share/somewhere/Mail.php');

10

有些SMTP服务器无需身份验证即可工作,但是如果服务器要求身份验证,则无法绕开它。

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

如果要将电子邮件发送到网络上的任意SMTP服务器,请考虑使用类似SwiftMailer的库。这样一来,您便可以使用Google Mail的传出服务器。


2

如果您在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/


ssmtp中也是一个解决方案见(法语导游):elliptips.info/guide-debian-7-envoi-de-mails-ligne-de-commande
ıɾuǝʞ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.