Как встроить изображения в электронную почту HTML

Можно также использовать выбор (2), если Вы хотите точность микросекунды (это работает над платформой, которые не имеют usleep (3))

, следующий код будет ожидать в течение 1,5 секунд:

#include <sys/select.h>
#include <sys/time.h>
#include <unistd.h>`

int main() {
    struct timeval t;
    t.tv_sec = 1;
    t.tv_usec = 500000;
    select(0, NULL, NULL, NULL, &t);
}

'

41
задан vhu 12 November 2015 в 06:22
поделиться

4 ответа

I'm using this function that find all images in my letter and attaches it to the message.

Parameters: Takes your HTML (which you want to send);
Return: The necessary HTML and headers, which you can use in mail();

Example usage:

define("DEFCALLBACKMAIL", "yourmail@yourdomain.com"); // WIll be shown as "from".
$final_msg = preparehtmlmail($html); // give a function your html*

mail('your@mail.com', 'your subject', $final_msg['multipart'], $final_msg['headers']); 
// send email with all images from html attached to letter


function preparehtmlmail($html) {

  preg_match_all('~<img.*?src=.([\/.a-z0-9:_-]+).*?>~si',$html,$matches);
  $i = 0;
  $paths = array();

  foreach ($matches[1] as $img) {
    $img_old = $img;

    if(strpos($img, "http://") == false) {
      $uri = parse_url($img);
      $paths[$i]['path'] = $_SERVER['DOCUMENT_ROOT'].$uri['path'];
      $content_id = md5($img);
      $html = str_replace($img_old,'cid:'.$content_id,$html);
      $paths[$i++]['cid'] = $content_id;
    }
  }

  $boundary = "--".md5(uniqid(time()));
  $headers .= "MIME-Version: 1.0\n";
  $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
  $headers .= "From: ".DEFCALLBACKMAIL."\r\n";
  $multipart = '';
  $multipart .= "--$boundary\n";
  $kod = 'utf-8';
  $multipart .= "Content-Type: text/html; charset=$kod\n";
  $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
  $multipart .= "$html\n\n";

  foreach ($paths as $path) {
    if(file_exists($path['path']))
      $fp = fopen($path['path'],"r");
      if (!$fp)  {
        return false;
      }

    $imagetype = substr(strrchr($path['path'], '.' ),1);
    $file = fread($fp, filesize($path['path']));
    fclose($fp);

    $message_part = "";

    switch ($imagetype) {
      case 'png':
      case 'PNG':
            $message_part .= "Content-Type: image/png";
            break;
      case 'jpg':
      case 'jpeg':
      case 'JPG':
      case 'JPEG':
            $message_part .= "Content-Type: image/jpeg";
            break;
      case 'gif':
      case 'GIF':
            $message_part .= "Content-Type: image/gif";
            break;
    }

    $message_part .= "; file_name = \"$path\"\n";
    $message_part .= 'Content-ID: <'.$path['cid'].">\n";
    $message_part .= "Content-Transfer-Encoding: base64\n";
    $message_part .= "Content-Disposition: inline; filename = \"".basename($path['path'])."\"\n\n";
    $message_part .= chunk_split(base64_encode($file))."\n";
    $multipart .= "--$boundary\n".$message_part."\n";

  }

  $multipart .= "--$boundary--\n";
  return array('multipart' => $multipart, 'headers' => $headers);  
}
30
ответ дан 27 November 2019 в 00:12
поделиться

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

Что касается отображения встроенных (встроенных) изображений, вот что содержится в их документации :

Встроенные вложения

Есть дополнительный способ добавить ан привязанность. Если вы хотите сделать HTML электронное письмо с изображениями, включенными в стол, необходимо прикрепить изображение, а затем свяжите с ним тег. За Например, если вы добавляете изображение как встроенный приложение с CID my-photo, вы получит доступ к нему в электронном письме в формате HTML с my-photo.

Подробно, вот функция для добавления встроенное вложение:

$mail->AddEmbeddedImage(filename, cid, name);
//By using this function with this example's value above, results in this code:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg ');

Чтобы дать вам более полный пример того, как это будет работать:

<?php
require_once('../class.phpmailer.php');
$mail = new PHPMailer(true); // the true param means it will throw exceptions on     errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "mail.yourdomain.com"; // SMTP server
  $mail->Port       = 25;                    // set the SMTP port
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->Subject = 'PHPMailer Test';

  $mail->AddEmbeddedImage("rocks.png", "my-attach", "rocks.png");
  $mail->Body = 'Your <b>HTML</b> with an embedded Image: <img src="cid:my-attach"> Here is an image!';

  $mail->AddAttachment('something.zip'); // this is a regular attachment (Not inline)
  $mail->Send();
  echo "Message Sent OK<p></p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>

Изменить:

Что касается вашего комментария, вы спросили, как отправить электронное письмо в формате HTML со встроенными изображениями, поэтому Я привел вам пример того, как это сделать.
Библиотека, о которой я вам рассказывал, может отправлять электронные письма, используя множество других методов, кроме SMTP.
Взгляните на страницу примера PHPMailer для других примеров.

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

Например:

Вы можете заменить строку, отправляющую электронное письмо:

$mail->Send();

На это:

$mime_message = $mail->CreateBody(); //Retrieve the message content
echo $mime_message; // Echo it to the screen or send it using whatever method you want

Надеюсь, что это поможет. Сообщите мне, если у вас возникнут проблемы с его использованием.

73
ответ дан 27 November 2019 в 00:12
поделиться

PHPMailer имеет возможность автоматически вставлять изображения из вашего электронного письма в формате HTML. При написании HTML-кода вы должны указать полный путь в файловой системе:

<img src="/var/www/host/images/photo.png" alt="my photo" />

Он автоматически преобразуется в:

<img src="cid:photo.png" alt="my photo" />
15
ответ дан 27 November 2019 в 00:12
поделиться

Вам нужно закодировать свою электронную почту как многостраничную mime, а затем вы можете прикреплять электронные письма в основном как вложения. Вы ссылаетесь на них с помощью cid в электронном письме.

В качестве альтернативы вы не могли прикрепить их к электронному письму и использовать URL-адреса напрямую, но большинство почтовых программ блокируют это, поскольку спамеры используют уловку для определения активности адресов электронной почты.

Не говорю на каком языке, но вот один пример .

1
ответ дан 27 November 2019 в 00:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: