Para inserir uma mensagem no Chatter, com um arquivo anexo, via Apex (em uma trigger ou classe), é necessário usar o objeto FeedItem. Sem mais delongas, vamos fazer um exemplo que permita inserir um texto no Chatter e um arquivo TXT anexo, com os dados de algumas Contas (Account).
String conteudoArquivoTxt = 'Segue a relação de Contas: \r\n';
List<Account> listaDeContas = [SELECT id, name, website FROM Account Limit 10];
for (Account conta : listaDeContas){
conteudoArquivoTxt += 'Nome: ' + conta.name + ' | Website: ' + conta.Website + '\r\n';
}
FeedItem post = new FeedItem();
post.ParentId = UserInfo.getUserId();
post.Body = 'Lista de Contas. Favor conferir!';
post.Type = 'ContentPost';
post.ContentData = Blob.valueOf(conteudoArquivoTxt);
post.ContentFileName = 'RelacaoContas.txt';
insert post;
A primeira coisa que é importante ressaltar nesse código é: Você não conseguirá rodá-lo na versão de API 36.0 ou superior. Esse código é válido até a versão 35.0. Isto é, se tentar no console do desenvolvedor, na parte de "Open Execute Anonymous Window", ele não funcionará, pois este usa a API mais recente. Então, para inciar os testes, use esse código em uma acionador (trigger) ou classe. No entando, quando for salvar esse código em uma classe ou trigger, altere a API de execução da trigger ou classe para 35 ou inferior:
Veja que, na classe ou trigger, basta acessar a guia Version Settings. E na API do Salesforce, marcar a versão 35 ou inferior.
Bem, agora que nosso código já funciona, vamos passar alguns itens importantes do código:
String conteudoArquivoTxt = 'Segue a relação de Contas: \r\n';
List<Account> listaDeContas = [SELECT id, name, website FROM Account Limit 10];
for (Account conta : listaDeContas){
conteudoArquivoTxt += 'Nome: ' + conta.name + ' | Website: ' + conta.Website + '\r\n';
}
Inicialmente eu salvo na variável "conteudoArquivoTxt" o conteúdo que desejo exibir no meu arquivo TXT que será salvo junto com a postagem no Chatter. Posteriormente coloco mais conteúdo nessa variável, iterando em uma lista de contas.
Em seguida, instancio um objeto do tipo "FeedItem", que será responsável pela postagem no Chatter:
FeedItem post = new FeedItem();
Logo após, através da propriedade "ParentId", eu digo aonde irá ser publicado a postagem. Nesse caso, estou indicando que será publicada na linha do tempo do usuário que está executando o código:
post.ParentId = UserInfo.getUserId();
Nas propriedade Body e Type, eu informo o conteúdo da postagem e o tipo de conteúdo, respectivamente. No caso do Type, há uma lista de opções para se usar. Usamos o ContentPost, pois significa que estamos postando texto com um arquivo anexo.
post.Body = 'Lista de Contas. Favor conferir!';
post.Type = 'ContentPost';
Para conhecer os outros tipos (Type) de conteúdo disponíveis para esse campo, veja a documentação oficial do Salesforce, relacionado ao FeedItem:
https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_feeditem.htm
Nos campos ContentData e ContentFileName, eu informo o corpo do arquivo texto que será anexado e o nome do arquivo txt, respectivamente. Repare que foi necessário converter a String da minha variável conteudoArquivoTxt para o tipo Blob.
post.ContentData = Blob.valueOf(conteudoArquivoTxt);
post.ContentFileName = 'RelacaoContas.txt';
E para concluir o código, dou o Insert no objeto post (tipo FeedItem) para realizar a postagem no Chatter, de fato:
insert post;
Veja o resultado da postagem no Chatter: