如何在 PHP 中使用 SMTP 发送 HTML 电子邮件
Posted
技术标签:
【中文标题】如何在 PHP 中使用 SMTP 发送 HTML 电子邮件【英文标题】:How to send an HTML email using SMTP in PHP 【发布时间】:2011-12-10 12:34:09 【问题描述】:我已经能够在 php 中使用 SMTP 发送电子邮件,但是当我尝试将内容类型更改为 html 时,电子邮件没有送达。这是我正在尝试使用的代码:
require_once "Mail.php";
$from = "FPM <forms@fpmofames.com>";
$from_name = "FPM";
$host = "localhost";
$username = "username";
$password = "password";
$subject = "Subject";
$message = "Message";
$to = "<example@example.com>";
$headers = array ('From' => $from,
'To' => $to,
'Subject' => $subject,
'MIME-Version' => '1.0',
'Content-Type' => "text/html; charset=ISO-8859-1"
);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'auth' => true,
'username' => $username,
'password' => $password));
$mail = $smtp->send($to, $headers, $message);
如果我从标头中取出“Content-Type”参数,它会很好地发送消息。我不知道为什么添加它会导致问题。
【问题讨论】:
【参考方案1】:问题很可能出在 Mail 类上,但由于我们不知道您使用的是什么 Mail 类,所以很难回答。如果您还没有这样做,我真的会考虑使用 PHPMailer:https://github.com/PHPMailer/PHPMailer
【讨论】:
【参考方案2】:我做了一些研究,然后我编写了自己的代码来使用 SMTP 身份验证发送带有 HTML 格式的邮件。见这里:
<?php
require_once "Mail.php";
$url = $_GET['baseUrl']; // source url
$success = false;
$senderName = isset( $_GET['txtname'] ) ? preg_replace( "/[^\.\-\' a-zA-Z0-9]/", "", $_GET['txtname'] ) : "";
$senderEmail = isset( $_GET['txtemail'] ) ? preg_replace( "/[^\.\-\_\@a-zA-Z0-9]/", "", $_GET['txtemail'] ) : "";
$msg = isset( $_GET['txtDesc'] ) ? preg_replace( "/(From:|To:|BCC:|CC:|Subject:|Content-Type:)/", "", $_GET['txtDesc'] ) : "";
$body = '<table border="0">
<tr>
<th scope="col">Name:</th>
<th scope="col">'.$senderName.'</th>
</tr>
<tr>
<th scope="col">Company:</th>
<td scope="col">'.$_GET['txtCompany'].'</td>
</tr>
<tr>
<th scope="row">Phone:</th>
<td>'.$_GET['txtphone'].'</td>
</tr>
<tr>
<th scope="row">E-mail:</th>
<td>'.$senderEmail.'</td>
</tr>
<tr>
<th scope="row">URL:</th>
<td>'.$url.'</td>
</tr>
<tr>
<th scope="row">Massage:</th>
<td>'.$msg.'</td>
</tr>
</table>';
$from = $senderName."<".$senderEmail.">";
$to = "Contact ManagerHR<info@aequitas-infotech.com>";
$subject = "Hi!";
$host = "XXX.host.com";
$username = "username@host.com";
$password = "*****";
/* MIME-Version should be "1.0rn" and Content-Type should be "text/html; charset=ISO-8859-1rn" to send an HTML Email */
$headers = array ('MIME-Version' => '1.0rn',
'Content-Type' => "text/html; charset=ISO-8859-1rn",
'From' => $from,
'To' => $to,
'Subject' => $subject
);
$smtp = Mail::factory('smtp',
array ('host' => $host,
'auth' => true,
'username' => $username,
'password' => $password));
$mail = $smtp->send($to, $headers, $body);
if (PEAR::isError($mail))
echo("<p>" . $mail->getMessage() . "</p>");
else
header('Location: '.$url); // redirect to url where from inquiry made
//echo("<p>Message successfully sent!</p>");
?>
【讨论】:
【参考方案3】:您应该通过 mime 对象创建邮件正文。梨会从那里处理它。 例如:
$crlf = "\n";
// Creating the Mime message
$mime = new Mail_mime($crlf);
// Setting the body of the email
$mime->setTXTBody($text);
$mime->setHTMLBody($html);
...
$body = $mime->get();
【讨论】:
【参考方案4】:您可以分两步完成。
第 1 步:将代码放入文件中:
<?php
require 'PHPMailerAutoload.php';
$mail = new PHPMailer;
//$mail->SMTPDebug = 3; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = 'smtp.gmail.com'; // Specify main and backup SMTP servers
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = 'user@example.com'; // SMTP username
$mail->Password = 'secret'; // SMTP password
$mail->SMTPSecure = 'tls'; // Enable TLS encryption, `ssl` also accepted
$mail->Port = 587; // TCP port to connect to
$mail->setFrom('from@example.com', 'Mailer');
$mail->addAddress('joe@example.net', 'Joe User'); // Add a recipient
$mail->addAddress('ellen@example.com'); // Name is optional
$mail->addReplyTo('info@example.com', 'Information');
$mail->addCC('cc@example.com');
$mail->addBCC('bcc@example.com');
$mail->addAttachment('/var/tmp/file.tar.gz'); // Add attachments
$mail->addAttachment('/tmp/image.jpg', 'new.jpg'); // Optional name
$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';
if(!$mail->send())
echo 'Message could not be sent.';
echo 'Mailer Error: ' . $mail->ErrorInfo;
else
echo 'Message has been sent';
步骤:2 在给定的 URL 中下载此包含的文件。 网址:https://github.com/PHPMailer/PHPMailer.git
然后点击克隆或下载按钮 并设置文件夹您的系统。
【讨论】:
【参考方案5】:使用 PHP 中的 SMTP 将您的 HTML 电子邮件发送到 2 或 3 封不同的电子邮件 工作 100%
<?php
require_once "Mail.php";
$host = "ssl://smtp.gmail.com";
$username = "example@gmail.com";
$password = "password";
$port = "465";
$to = '1-to-example@example.com' . ', ';
$to = '2-to-example@example.com' . ', ';
$to = '3-to-example@example.com' . ', ';
$email_from = "from-example@example.com";
$email_subject = "Your Subject";
$email_body = "**<html> <body>**";
$email_body .= "<strong> Your HTML code </strong>";
$email_body .= "**</body></html>**";
$headers = array ('From' => $email_from, 'To' => $to, 'Subject' =>
$email_subject, 'Reply-To' => $email_address , 'MIME-Version' => '1.0', 'Content-Type' => "text/html; charset=ISO-8859-1");
$smtp = Mail::factory('smtp', array ('host' => $host, 'port' => $port, 'auth' => true, 'username' => $username, 'password' => $password));
$mail = $smtp->send($to, $headers, $email_body);
?>
【讨论】:
这如何回答有关Content-Type
的问题?此外,您应该使用.=
连接电子邮件地址。【参考方案6】:
像这样在标题的第一行写内容类型
$to = "<example@example.com>"; $headers = array ('Content-Type' => "text/html; charset=ISO-8859-1", 'From' => $from, 'To' => $to, 'Subject' => $subject, 'MIME-Version' => '1.0' );
这对我有用..
【讨论】:
以上是关于如何在 PHP 中使用 SMTP 发送 HTML 电子邮件的主要内容,如果未能解决你的问题,请参考以下文章