使用phpmailer通过带有图像的html文件发送电子邮件

Posted

技术标签:

【中文标题】使用phpmailer通过带有图像的html文件发送电子邮件【英文标题】:Sending email through html file with images using phpmailer 【发布时间】:2018-09-26 23:35:01 【问题描述】:

我正在使用 phpmailer 向我的订阅者发送电子邮件。我有一个包含文本和图像的 html 文件。电子邮件发送成功,但奇怪的是我的图像没有显示。我的图像位于我的 HTML 文件的根目录中。有没有办法通过 HTML 文件发送电子邮件,图像位于我的本地目录中?我把我的图片放在我的 HTML 文件中,比如 <img src="images/log.png">

我不想在我的 HTML 文件中提供我的图片网址,例如

<img src="www.mydomain.com/images/log.png">

这是我的代码:

$db_host = "localhost";
$db_username = "root";
$db_pass = "";
$link= mysqli_connect("$db_host","$db_username","$db_pass", "db") or die ("could not connect to mysql"); 
//if($link)echo "connect";
// Import PHPMailer classes into the global namespace
// These must be at the top of your script, not inside a function
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

//Load Composer's autoloader
require 'vendor/autoload.php';


$mail = new PHPMailer(true);                              // Passing `true` enables exceptions
try 
     $query = "select customer_email from subscribers";
     $result = mysqli_query($link, $query) or die("No customer in the table");;

     while($values = mysqli_fetch_array($result))

         $toemail = $values['customer_email'];


    //Server settings
    $mail->SMTPDebug = 1;                                 // Enable verbose debug output
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = '(myhost)';  // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = '(my email)';                 // SMTP username
    $mail->Password = '(my password)';                           // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to

    //Recipients
    $mail->setFrom('haris.khan@premier.com.pk', 'Premier');
    $mail->addAddress(''.$toemail.'', ''.$name.'');     // Add a recipient
    $mail->addReplyTo('haris.khan@premier.com.pk', 'Information');

    //Content
    $mail->isHTML(true);                                  // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    ob_start();
include "file.html";
$contents = ob_get_clean();
$mail->msgHTML($contents);

    $mail->send();
   echo 'Message has been sent';

 catch (Exception $e) 
    echo 'Message could not be sent. Mailer Error: ', $mail->ErrorInfo;

这是我的 html 文件

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>

<body>
<img src="images/logo.png">
<h1> Hello World ..!!! </h1>
<p> This is the <b> auto generated email from HTML Fie </b> for testing purpose. </p>
</body>
</html>

任何帮助都会非常感激。

【问题讨论】:

使用图片的完整路径,例如&lt;img src="http://example.com/images/logo.png"&gt; 如果您不想通过 HTTP(S) URL 提供您的图像,那么您的另一个选择是将它们直接嵌入到电子邮件中 ​​- 请参阅***.com/questions/3708153/…(当然这会增加您的服务器必须为每封电子邮件发送的数据量。) @CBroe 请再次查看我的问题。我编辑它。我在 https url 上有我的图像,但在图像标签中我不想将图像 src 提供为 https:domain.com/img。我将图像源作为 src="img/logo.png" Send email with PHPMailer - embed image in body的可能重复 “但在图像标签中我不想将图像 src 作为 https:domain.com/img。我将图像源提供为 src="img/logo.png"" - 这显然行不通,因为电子邮件本身并未作为“来自您的域”的文档加载。它可以是完整的绝对路径,也可以是嵌入的图像。 【参考方案1】:

我不想在我的 HTML 文件中提供我的图片网址,例如...

嗯,你运气不好。电子邮件没有根 URL,因此相对 URL 不起作用;如果您想使用链接图像,必须包含主机名。

您唯一的选择是使用嵌入的图像,其中图像数据包含在消息中,但对于大量数据,您不应该这样做,因为它非常低效。您可以在 PHPMailer 中使用addEmbeddedImage() 方法执行此操作,然后使用它们的cid 值从您的HTML 中引用图像。例如:

$mail->addEmbeddedImage('images/logo.png', 'logo');

然后在你的 HTML 中:

<img src="cid:logo">

msgHTML() 方法会为您完成这项工作。

【讨论】:

以上是关于使用phpmailer通过带有图像的html文件发送电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

使用PHPMAILER实现PHP发邮件功能

phpmailer 自动包含本地图片

PHPMailer 不发送带有附加 zip 文件的邮件

conposer phpmailer 发邮件

带有 mandrill smtp 的 PHPMailer 给出连接错误

通过电子邮件发送带有图像的 html 文件