PHP将图片附加到电子邮件

6

有没有办法在PHP创建的HTML格式电子邮件消息中附加图像?

我们需要确保公司徽标出现在发送给客户的电子邮件上,这些客户可能在阅读电子邮件时没有互联网访问(他们显然可以下载文件)。

6个回答

11
尝试使用PEAR Mail_Mime包,它可以为您嵌入图片
您需要使用addHTMLImage()方法并传递一个内容id(cid),这是一个唯一的文本字符串,您还将在img的src属性中使用它作为cid: URL。例如:
include('Mail.php');
include "Mail/mime.php";


$crlf = "\r\n";
$hdrs = array( 
        'From' => 'foo@bar.org', 
        'Subject' => 'Mail_mime test message' 
        ); 

$mime = new Mail_mime($crlf); 

//attach our image with a unique content id
$cid="mycidstring";
$mime->addHTMLImage("/path/to/myimage.gif", "image/gif", "", true, $cid);

//now we can use the content id in our message
$html = '<html><body><img src="cid:'.$cid.'"></body></html>';
$text = 'Plain text version of email';

$mime->setTXTBody($text);
$mime->setHTMLBody($html); 

$body = $mime->get();
$hdrs = $mime->headers($hdrs);

$mail =& Mail::factory('mail');
$mail->send('person@somewhere.org', $hdrs, $body);

1
你太厉害了,比我快了20秒 ;-) - Joonas Pulakka
我得到了两倍于“注意:在...中未定义属性:Mail_mime :: $ _html_images”的错误。这是您声明$ cid变量的行。它发送电子邮件,但不显示图像。您能否更新您的答案? - Logan Wayne
这个回答已经有7年的历史了!如果你查看Mail_Mime的源代码,你会发现我访问的$_html_images成员被重命名为$html_images并且是受保护的。https://github.com/pear/Mail_Mime/blob/1.10.0/Mail/mime.php#L111不过从Mail_mime派生一个新类并添加一个方法来获取cid值也不难。 - Paul Dixon
1
尝试编辑此答案,但被拒绝了... Mail_Mime模块允许您使用addHTMLImage()[1]指定content-id。因此,无需去寻找它,只需执行以下操作:$mime->addHTMLImage("/path/to/myimage.gif", "image/gif", "", true, "mycidstring");$html = '<html><body><img src="cid:mycidstring"></body></html>';[1]https://pear.php.net/manual/en/package.mail.mail-mime.addhtmlimage.php - Matt
我没有拒绝它 :( 编辑对我来说看起来很好,所以我改变了答案。非常感谢。 - Paul Dixon

2

最简单的方法是使用一些可以处理电子邮件附件的库。例如,PEAR的Mail_Mime


1

PEAR的Mail_Mime包是您在这里需要的。

一旦设置好您的消息,添加附件就像这样简单:

$mime = new Mail_mime("\n");

$mime->setTXTBody($msg_text);
$mime->setHTMLbody($msg_html);

// Add gif as attachment to mail
$mime->addAttachment("/path/to/image/smile.gif", "image/gif");

$body = $mime->get();
$headers = $mime->headers($headers);
$mail->send("joe@bloggs.com", $headers, $body);

如果您想让您的徽标在电子邮件中显示在特定的位置,而不仅仅作为附件,您可以执行以下操作:

// In your message html:
<img src='logo.gif' alt='Our logo' />

// PHP:
$mime->addHTMLImage('/path/to/image/logo.gif');

这种方法的效果可能因用户的邮件客户端而异,因此在发送之前,请尝试在虚拟的 Gmail、Yahoo 和 Hotmail 帐户上测试您的格式。


0

0
你是在自己编写代码,还是使用现成的类库?我个人推荐 PHPMailer[0],此外,还有PEAR::Mail_Mime[1] 等等其他工具可以通过谷歌搜索找到。我多年来一直使用PHPMailer发送带嵌入图片[2]的邮件,从未出过任何问题。但要注意每张图片都会大幅增加邮件的带宽负担,因此通常不适用于批量邮件发送。另外,我要echo Bill所说的话,在发送邮件时也请务必提供纯文本格式的备选方案。

[0] http://phpmailer.sourceforge.net/

[1] http://pear.php.net/manual/en/package.mail.mail-mime.php

[2] http://phpmailer.sourceforge.net/docs/PHPMailer/PHPMailer.html#AddEmbeddedImage

摘自http://lists.evolt.org/archive/Week-of-Mon-20060612/183029.html


0

这里有足够多的答案可以帮助解决您特定的问题,但我认为值得指出的是,您可能有一个更大的问题没有考虑到。

具体来说,通过PHP编写邮件发送程序充满了潜在的陷阱,只有当您非常清楚可能出现的问题时才应该这样做。

如果您计划频繁发送电子邮件,我强烈建议您通过专用的电子邮件营销客户端或实施其中许多电子邮件营销API之一来发送它们。(mailchimp 显然是一个不错的选择)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接