2013-03-26 2 views
2

У меня проблема.Отображать встроенные вложения изображений с помощью wp_mail

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

Мое решение было кодировать изображения в base64 и поместить их встраивать в HTML так:

<img alt="The Alt" src="data:image/png;base64,*etc*etc*etc" /> 

Но проблема заключается в том, что Gmail/Outlook удалить данные в исходные тексты из образа. Так что земли, как

<img alt="The Alt" /> 

Любые подсказки, что модифицируют (заголовки для работы с base64) или как использовать вложение, чтобы встроить их в линию?

Thanks, Radu.

ответ

11

wp_mail использует класс PHPMailer. Этот класс обладает всеми функциями, необходимыми для встроенных вложений. Чтобы изменить объект phpmailer до того, как wp_mail() отправит электронное письмо, вы можете использовать фильтр phpmailer_init.

$body = ' 
Hello John, 
checkout my new cool picture. 
<img src="cid:my-cool-picture-uid" width="300" height="400"> 

Thanks, hope you like it ;)'; 

Это был пример того, как вставить изображение в тело электронной почты.

$file = '/path/to/file.jpg'; //phpmailer will load this file 
$uid = 'my-cool-picture-uid'; //will map it to this UID 
$name = 'file.jpg'; //this will be the file name for the attachment 

global $phpmailer; 
add_action('phpmailer_init', function(&$phpmailer)use($file,$uid,$name){ 
    $phpmailer->SMTPKeepAlive = true; 
    $phpmailer->AddEmbeddedImage($file, $uid, $name); 
}); 

//now just call wp_mail() 
wp_mail('[email protected]','Hi John',$body); 

Это все.

+1

Помните точку с запятой в конце строки после «file.jpg» – janlindso

3

Если вы получили непредвиденную ошибку T_FUNCTION, это связано с версией PHP < 5.3. В этом случае, создать функцию, чтобы сделать это в более традиционным способом:

function attachInlineImage() { 
    global $phpmailer; 
    $file = '/path/to/file.jpg'; //phpmailer will load this file 
    $uid = 'my-cool-picture-uid'; //will map it to this UID 
    $name = 'file.jpg'; //this will be the file name for the attachment 
    if (is_file($file)) { 
    $phpmailer->AddEmbeddedImage($file, $uid, $name); 
    } 
} 

add_action('phpmailer_init','attachInlineImage'); 
1

мне нужно было это в небольшой лучший способ, потому что я посылаю несколько писем в один шаг и не все письма должны иметь тот же встроенный изображений. Поэтому я использую это решение от Constantin, но с моими ИЗМЕНЕНИЙ :-)

wp_mail('[email protected]', 'First mail without attachments', 'Test 1'); 

$phpmailerInitAction = function(&$phpmailer) { 
    $phpmailer->AddEmbeddedImage(__DIR__ . '/img/header.jpg', 'header'); 
    $phpmailer->AddEmbeddedImage(__DIR__ . '/img/footer.png', 'footer'); 
}; 
add_action('phpmailer_init', $phpmailerInitAction); 
wp_mail('[email protected]', 'Mail with embedded images', 'Example <img src="cid:header" /><br /><img src="cid:footer" />', [ 
    'Content-Type: text/html; charset=UTF-8' 
], [ 
    __DIR__ . '/files/terms.pdf' 
]); 
remove_action('phpmailer_init', $phpmailerInitAction); 

wp_mail('[email protected]', 'Second mail without attachments', 'Test 2'); 

Первый wp_mail будет без вложений. Второй wp_mail будет содержать встроенные изображения. Третий wp_mail будет без вложений.

Это работает хорошо сейчас

0

AddEmbeddedImage принимает только два параметра, поэтому убедитесь, что не включить параметр $ имя, как в примере.

+1

Это также поможет предоставить ссылку на документы, чтобы поддержать ваши претензии и дальнейшие исследования. – sjaustirni