Регистрация  |  Вход

Как использовать attach image в теле email?

Проблема в следующем. Я отправляю на ящик письмо с прикрепленным документом(image). Как мне использовать его в теле письма, я так полагаю что нужно как то через content-id т.е. src = "cid:....." только никак не могу понять как формируется этот content id. Может кто знает,или подскажет другой способ, как использовать attach image в письме.

String idWwLogo;
Document doc = [select id, name, body, contenttype, developername, type from Document where Name = 'image002'];
Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();
attach.setContentType(doc.contentType);
attach.setFileName(doc.developerName+'.'+doc.type);
attach.setInline(false);
attach.Body = doc.Body;
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {'my@email.com'};
mail.setUseSignature(false);
mail.setToAddresses(toAddresses);
mail.setSubject('Subject');
mail.setHtmlBody('Image: <img src="cid:....">');
mail.setFileAttachments(new Messaging.EmailFileAttachment[] { attach });
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });

Проблема в следующем. Я отправляю на ящик письмо с прикрепленным документом(image). Как мне использовать его в теле письма, я так полагаю что нужно как то через content-id т.е. src = "cid:....." только никак не могу понять как формируется этот content id. Может кто знает,или подскажет другой способ, как использовать attach image в письме.
 
String idWwLogo;
Document doc = [select id, name, body, contenttype, developername, type from Document where Name = 'image002'];
Messaging.EmailFileAttachment attach = new Messaging.EmailFileAttachment();
attach.setContentType(doc.contentType);
attach.setFileName(doc.developerName+'.'+doc.type);
attach.setInline(false);
attach.Body = doc.Body;  
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {'my@email.com'};
mail.setUseSignature(false);
mail.setToAddresses(toAddresses);
mail.setSubject('Subject');  
mail.setHtmlBody('Image: <img src="cid:....">');
mail.setFileAttachments(new Messaging.EmailFileAttachment[] { attach }); 
Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
Посмотри может это?
[url=https://help.salesforce.com/apex/HTViewSolution?id=000005050&language=en_US]How do I reference a public image stored in salesforce.com in my HTML?[/url]

Хотя наверное cid:
Ты имеешь в виду вот эту штуку
How to embed images in email
тогда мне самому интересно, как это в Salesforce замутить.

Хотя наверное [b]cid:[/b]
Ты имеешь в виду вот эту штуку
[url=http://stackoverflow.com/questions/4312687/how-to-embed-images-in-email]How to embed images in email[/url]
тогда мне самому интересно, как это в Salesforce замутить.

Посмотри, может вот здесь есть ответ на твой вопрос
Handling Inline Images in Salesforce Inbound Email

Посмотри, может вот здесь есть ответ на твой вопрос
[url=http://simplyforce.blogspot.com/2014/08/handling-inline-images-in-salesforce.html]Handling Inline Images in Salesforce Inbound Email[/url]

Вопрос по получению или установке cid остается все еще актуальным.
Могу предложить другие способы решения проблемы, которые работают в большинстве почтовых клиентах.
1)
Необходимо создать Document с прикрепленным изображением на орге,, советую использовать jpg формат т.к. с png возникают проблемы с отображением в outlook. При создании documenta необходимо поставить галочку в Externally Available Image и в Folder выбрать public.
Далее в коде получаем id этого документа:
Id idLogo = [SELECT id FROM Document WHERE Name = 'EmailLogo' LIMIT 1].id;
Так же понадобится id орга:
orgId = UserInfo.getOrganizationId();
Потом формируем url которое будем использовать в src тега image
String image = 'http://' + System.URL.getSalesforceBaseUrl().getHost() + '/servlet/servlet.ImageServer?id='+idLogo+'&oid='+orgId;
В общем то и все дальше и так понятно:
mail.setHtmlbody('<img style="border:none" alt="Twitter" src=' + image + '></img>');
2)
Второй способ очень простой и эффективный, он основан на кодирование в base64, но я где то встречал что outlook игнорирует base64, поэтому там картинки закодированные таким способом не отображаются.
Есть online кодирование, просто подгружаете image и вам выдается его закодированное представление в base64, потом просто копируете и вставляете огромной код этот в src.
Имеется такой класс EncodingUtil в котором есть метод base64Encode(Blob). вместо Blob нужно вставлять body документа т.е.
Создаем как в 1ом случае документ и далее в коде:
Document doc = [select id, name, body, contenttype, developername, type from Document where Name = 'DocName'];
Дальше просто нужно в src сделать следующее:
mail.setHtmlbody('<img style="border:none" alt="Twitter" src=data:image/jpeg;base64,' + EncodingUtil.base64Encode(doc.Body) + '></img>');
Обратите внимание что в src в начале необходимо дописать "data:image/jpeg;base64,".
3)
Способ не доработанный я бы сказал, в outlook работает хорошо и не нужно руками подгружать изображения т.к. они берутся из прикрепленных к письму, но в других почтовых клиентах этот способ не работает.
Суть в следующем. Все что я писал в первоначальном вопросе, где я не знал как получить cid, я попробовал в src указать просто имя прикрепленного изображения и в outlooke все отобразилось верно т.е. src="cid:picture.jpg". Но как получить или установить cid чтобы во всех клиентах бралось изображение из прикрепленных я не нашел.

Вопрос по получению или установке cid остается все еще актуальным.
Могу предложить другие способы решения проблемы, которые работают в большинстве почтовых клиентах.
1) 
Необходимо создать Document с прикрепленным изображением на орге,, советую использовать jpg формат т.к. с png возникают проблемы с отображением в outlook. При создании documenta необходимо поставить галочку в Externally Available Image и в Folder выбрать public.
Далее в коде получаем id этого документа:
Id idLogo = [SELECT id FROM Document WHERE Name = 'EmailLogo' LIMIT 1].id;
Так же понадобится id орга:
orgId = UserInfo.getOrganizationId();
Потом формируем url которое будем использовать в src тега image 
String image = 'http://' + System.URL.getSalesforceBaseUrl().getHost() + '/servlet/servlet.ImageServer?id='+idLogo+'&oid='+orgId;
В общем то и все дальше и так понятно:
mail.setHtmlbody('<img style="border:none" alt="Twitter" src=' + image + '></img>');
2)
Второй способ очень простой и эффективный, он основан на кодирование в base64, но я где то встречал что outlook игнорирует base64, поэтому там картинки закодированные таким способом не отображаются.
Есть online кодирование, просто подгружаете image и вам выдается его закодированное представление в base64, потом просто копируете и вставляете огромной код этот в src.
Имеется такой класс EncodingUtil в котором есть метод base64Encode(Blob). вместо Blob нужно вставлять body документа т.е. 
Создаем как в 1ом случае документ и далее в коде:
Document doc = [select id, name, body, contenttype, developername, type from Document where Name = 'DocName'];
Дальше просто нужно в src сделать следующее:
mail.setHtmlbody('<img style="border:none" alt="Twitter" src=data:image/jpeg;base64,' + EncodingUtil.base64Encode(doc.Body) + '></img>');
Обратите внимание что в src в начале необходимо дописать "data:image/jpeg;base64,".
3)
Способ не доработанный я бы сказал, в outlook работает хорошо и не нужно руками подгружать изображения т.к. они берутся из прикрепленных к письму, но в других почтовых клиентах этот способ не работает.
Суть в следующем. Все что я писал в первоначальном вопросе, где я не знал как получить cid, я попробовал в src указать просто имя прикрепленного изображения и в outlooke все отобразилось верно т.е. src="cid:picture.jpg". Но как получить или установить cid чтобы во всех клиентах бралось изображение из прикрепленных я не нашел.

ZhdanovEvgeny
Могу предложить другие способы решения проблемы, которые работают в большинстве почтовых клиентах.

Спасибо что поделился результатами своего исследования. Я думаю многим будет полезно.

[quote="ZhdanovEvgeny"]Могу предложить другие способы решения проблемы, которые работают в большинстве почтовых клиентах. [/quote]
Спасибо что поделился результатами своего исследования. Я думаю многим будет полезно.