Проблема в следующем. Я отправляю на ящик письмо с прикрепленным документом(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 });
Посмотри может это?
How do I reference a public image stored in salesforce.com in my HTML?
Хотя наверное cid:
Ты имеешь в виду вот эту штуку
How to embed images in email
тогда мне самому интересно, как это в Salesforce замутить.
Посмотри, может вот здесь есть ответ на твой вопрос
Handling Inline Images in Salesforce Inbound Email
Вопрос по получению или установке 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 чтобы во всех клиентах бралось изображение из прикрепленных я не нашел.