Вставить изображения для использования в сообщении электронной почты, используя PHP? - PullRequest
1 голос
/ 23 июня 2010

Я знаю, как вставить изображение в электронное письмо в виде вложения, но это не совсем то, что я хочу сделать. Я хочу вставить изображение в сообщение и использовать его в теле сообщения электронной почты. Можно ли сделать это или, возможно, ссылаться на прикрепленный файл, чтобы использовать его в сообщении?

Должен ли я беспокоиться об этом? Разве выгоднее просто загрузить их через ссылку на изображение в моей сети? Я думал, что это займет некоторую нагрузку на мой сервер, поэтому его не нужно было загружать непосредственно с моего сайта в каждом открывшемся почтовом сообщении, что немного снижает пропускную способность.

Примечание: Я не ищу никаких почтовых фреймворков или библиотек и т. Д., Просто для простого способа решения этой задачи.

Ответы [ 3 ]

3 голосов
/ 23 июня 2010

Люди сообщат вам, чтобы вы использовали SwiftMailer или другую библиотеку. Но это не так сложно. Это действительно привередливо, но не сложно. Ниже приведена функция, которую я использую. Я немного анонимизировал и, надеюсь, ничего не сломал. В HTML-сообщении (которое я получаю из другой функции), ссылка на ваше прикрепленное изображение выглядит следующим образом:

$output .= '<p><img src="cid:' . $linkID . '" alt="graph" /></p>';

Где $linkID - это то же значение, которое используется в приведенной ниже функции.

public function sendEmail($emailAddress)
{
    $random_hash = md5(date('r', time()));

    $htmlString = $this->getHTML($random_hash);

    $message = "--mixed-$random_hash\n";
    $message .= 'Content-Type: multipart/alternative; boundary="alt-' . $random_hash . '"' . "\n\n";
    $message .= 'MIME-Version: 1.0' . "\n";
    $message .= '--alt-' . $random_hash . "\n";
    $message .= 'Content-Type: text/plain; charset="iso-8859-1"' . "\n";
    $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n";

    // text message
    $message .= strip_tags($htmlString) . "\n\n";

    $message .= '--alt-' . $random_hash . "\n";
    $message .= 'Content-Type: text/html; charset="iso-8859-1"' . "\n";
    // $message .= 'MIME-Version: 1.0' . "\n";
    $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n";

    // html message
    $message .= $htmlString . "\n\n";

    $message .= '--alt-' . $random_hash . '--' . "\n";

    // graph image
    if($this->selectedGraph != 0)
    {
        $graphString = $this->getGraph();
        $graphString = chunk_split(base64_encode($graphString));

        $linkID = 'graph-' . $random_hash . '-image';

        $message .= '--mixed-' . $random_hash . "\n";
        $message .= 'MIME-Version: 1.0' . "\n";
        $message .= 'Content-Transfer-Encoding: base64' . "\n";
        $message .= 'Content-ID: ' . $linkID . "\n";
        $message .= 'Content-Type: image/gif; name="graph.gif"' . "\n";
        $message .= 'Content-Disposition: attachment' . "\n\n";

        $message .= $graphString;
        $message .= '--mixed-' . $random_hash . '--' . "\n";

    }
    else
    {
        $message .= '--mixed-' . $random_hash . '--' . "\n";
    }


    $headers = 'From: ' . $this->from. "\r\nReply-To: " . $this->replyto;
    $headers .= "\r\nContent-Type: multipart/related; boundary=\"mixed-" . $random_hash . "\"\r\nMIME-Version: 1.0";

    $flags = '-f ' . BOUNCED_EMAIL_ADDRESS;

    return mail($emailAddress, $this->subject, $message, $headers, $flags);

}

Стоит ли это делать - это другой вопрос. Если вы прикрепите изображение, вы используете пропускную способность для отправки сообщения. Может быть, вам лучше использовать пропускную способность сразу, а не распределяться? Возможно нет.

Я не использовал прикрепленные изображения, пока мне не пришлось отправлять разные изображения каждому получателю. Я не собирался хранить и управлять всеми этими изображениями на нашем сервере (и пытаться однозначно назвать их).

2 голосов
/ 23 июня 2010
Content-Type: multipart/related;
  type="text/html";
  boundary="Boundary1"


--Boundary1
Content-Type: multipart/alternative;
boundary="Boundary2"

--Boundary2
Content-Type: text/html; charset = "utf-8"
Content-Transfer-Encoding: 8bit

<img src="cid:content_id_from_attachment">

--Boundary2--

--Boundary1
Content-Type: image/jpeg; name="somefilename.jpg"
Content-Transfer-Encoding: base64
Content-ID: <content_id_from_attachment>
Content-Disposition: inline; filename="somefilename.jpg"

//binary data

--Boundary1--

Граница, кодировка, Content-Transfer-Encoding, конечно, все по выбору.Пакет PHPMailer может сделать это автоматически для вас: http://www.ustrem.org/en/article-send-mail-using-phpmailer-en/

См. Также изображения на: http://mailformat.dan.info/body/html.html

0 голосов
/ 23 июня 2010

Я думаю, что единственный способ сделать это - сослаться на изображение по URL:

<img src="http://www.youwebsite.com/yourimage.jpg" alt="This is a description" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...