You need to sign in to do that
Don't have an account?
DM 13
SendEmail failed. First exception on row 0; first error: UNKNOWN_EXCEPTION
Hi,
I have below Apex code to send notification to case owner when an Email is transferred from one case to another. This was working fine before enabling Enhanced Email feature. But once its enbled it's throwing below error -
EXCEPTION - SendEmail failed. First exception on row 0; first error: UNKNOWN_EXCEPTION, EmailMessageTrigger: execution of AfterInsert
caused by: System.NullPointerException: Attempt to de-reference a null object
public static String transferEmailsToTargetCase(Id originCaseId, Id targetCaseId, Set<Id> emailIds) {
System.debug('** transferEmailsToTargetCase start **');
Map<Id, EmailMessage> oldEmailId2newEmail = new Map<Id, EmailMessage>();
Case originCase = [
SELECT Id, CaseNumber, Subject,
(SELECT Id, FromAddress, Incoming, ToAddress, Subject, TextBody, ParentId, BccAddress,
CcAddress, FromName, Headers, HtmlBody, MessageDate, ReplyToEmailMessageId,
Source_Case__c, Status
FROM EmailMessages
WHERE Id IN :emailIds)
FROM Case
WHERE Id = :originCaseId
];
Case targetCase = new case();
if(targetCaseId!=null){
targetCase = [
SELECT Id, ownerId, owner.email, owner.name, CaseNumber, Subject
FROM Case
WHERE Id = :targetCaseId
];
}
if(originCase.EmailMessages.isEmpty()) {
return Label.No_emails_under_source_Case;
}
for(EmailMessage em : originCase.EmailMessages) {
EmailMessage emCloned = em.clone();
emCloned.ParentId = targetCaseId;
if(String.isBlank(em.Source_Case__c)) {
emCloned.Source_Case__c = originCaseId;
}
oldEmailId2newEmail.put(em.Id, emCloned);
}
try {
EmailMessageTriggerHelper.CHECK_EDIT_RIGHTS_ON_CASE = false;
insert oldEmailId2newEmail.values();
copyOverAttachmentsToNewEmail(oldEmailId2newEmail);
EmailMessageTriggerHelper.ALLOW_DELETION = true;
delete originCase.EmailMessages;
//send email to new case owner to confirm emails moved
if(targetCaseId!=null){
//update URL for live
string cssProdOrgURL = Org_Settings__c.getOrgDefaults().ORG_URL__c+'/';
system.debug('cssProdOrgURL --'+ cssProdOrgURL);
string emailBodyConfirmMove = '<html><head><style> table {font-family: arial, sans-serif;border-collapse: collapse;}td, th {border: 1px solid #dddddd;text-align: left;padding: 8px;}tr:nth-child(even) {background-color: #F1F1F1;}</style></head><body><p>Hi ';
emailBodyConfirmMove+=targetCase.owner.name+',</p><br/><p>THIS IS A SYSTEM GENERATED EMAIL.</p><p>Please be advised that one or more emails have been moved to the ';
emailBodyConfirmMove+='<a href="'+cssProdOrgURL+targetCase.id+'">'+targetCase.CaseNumber+'</a> Case, and it requires your review.</p><br/><p>Number of Emails: ';
emailBodyConfirmMove+=originCase.EmailMessages.size()+'</p><p>Case Subject: ';
emailBodyConfirmMove+='<a href="'+cssProdOrgURL+targetCase.id+'">'+targetCase.Subject+'</a></p><br/><table ><tr ><th>Subject</th><th>From Name</th><th>From Address</th><th>Message Date</th></tr>';
for(EmailMessage emCloned :oldEmailId2newEmail.values()){
emailBodyConfirmMove+='<tr><td><a href="'+cssProdOrgURL+emCloned.id+'">'+emCloned.Subject+'</a></td>';
emailBodyConfirmMove+='<td>'+emCloned.FromName+'</td>';
emailBodyConfirmMove+='<td>'+emCloned.FromAddress+'</td>';
emailBodyConfirmMove+='<td>'+emCloned.MessageDate+'</td></tr>';
}
emailBodyConfirmMove+='</table>';
if(string.valueOf(targetCase.OwnerId).startsWith('005')){//owner is user not queue
List<Messaging.SingleEmailMessage> lstMsgs = new List<Messaging.SingleEmailMessage>();
Messaging.SingleEmailMessage msg = new Messaging.SingleEmailMessage();
user targetOwner = [SELECT Id, email FROM user WHERE id=:targetCase.OwnerId AND email != null];
msg.setToAddresses(new List<String>{targetOwner.email});
msg.setHTMLbody(emailBodyConfirmMove);
msg.setSubject('Emails transferred to CASE -'+targetCase.CaseNumber);
lstMsgs.add(msg);
Messaging.SendEmailResult[] r = Messaging.sendEmail(lstMsgs);
}
}
} catch(Exception e) {
system.debug('** EXCEPTION - '+e.getMessage());
return e.getMessage();
}
return Label.Success_msg;
}
I have below Apex code to send notification to case owner when an Email is transferred from one case to another. This was working fine before enabling Enhanced Email feature. But once its enbled it's throwing below error -
EXCEPTION - SendEmail failed. First exception on row 0; first error: UNKNOWN_EXCEPTION, EmailMessageTrigger: execution of AfterInsert
caused by: System.NullPointerException: Attempt to de-reference a null object
public static String transferEmailsToTargetCase(Id originCaseId, Id targetCaseId, Set<Id> emailIds) {
System.debug('** transferEmailsToTargetCase start **');
Map<Id, EmailMessage> oldEmailId2newEmail = new Map<Id, EmailMessage>();
Case originCase = [
SELECT Id, CaseNumber, Subject,
(SELECT Id, FromAddress, Incoming, ToAddress, Subject, TextBody, ParentId, BccAddress,
CcAddress, FromName, Headers, HtmlBody, MessageDate, ReplyToEmailMessageId,
Source_Case__c, Status
FROM EmailMessages
WHERE Id IN :emailIds)
FROM Case
WHERE Id = :originCaseId
];
Case targetCase = new case();
if(targetCaseId!=null){
targetCase = [
SELECT Id, ownerId, owner.email, owner.name, CaseNumber, Subject
FROM Case
WHERE Id = :targetCaseId
];
}
if(originCase.EmailMessages.isEmpty()) {
return Label.No_emails_under_source_Case;
}
for(EmailMessage em : originCase.EmailMessages) {
EmailMessage emCloned = em.clone();
emCloned.ParentId = targetCaseId;
if(String.isBlank(em.Source_Case__c)) {
emCloned.Source_Case__c = originCaseId;
}
oldEmailId2newEmail.put(em.Id, emCloned);
}
try {
EmailMessageTriggerHelper.CHECK_EDIT_RIGHTS_ON_CASE = false;
insert oldEmailId2newEmail.values();
copyOverAttachmentsToNewEmail(oldEmailId2newEmail);
EmailMessageTriggerHelper.ALLOW_DELETION = true;
delete originCase.EmailMessages;
//send email to new case owner to confirm emails moved
if(targetCaseId!=null){
//update URL for live
string cssProdOrgURL = Org_Settings__c.getOrgDefaults().ORG_URL__c+'/';
system.debug('cssProdOrgURL --'+ cssProdOrgURL);
string emailBodyConfirmMove = '<html><head><style> table {font-family: arial, sans-serif;border-collapse: collapse;}td, th {border: 1px solid #dddddd;text-align: left;padding: 8px;}tr:nth-child(even) {background-color: #F1F1F1;}</style></head><body><p>Hi ';
emailBodyConfirmMove+=targetCase.owner.name+',</p><br/><p>THIS IS A SYSTEM GENERATED EMAIL.</p><p>Please be advised that one or more emails have been moved to the ';
emailBodyConfirmMove+='<a href="'+cssProdOrgURL+targetCase.id+'">'+targetCase.CaseNumber+'</a> Case, and it requires your review.</p><br/><p>Number of Emails: ';
emailBodyConfirmMove+=originCase.EmailMessages.size()+'</p><p>Case Subject: ';
emailBodyConfirmMove+='<a href="'+cssProdOrgURL+targetCase.id+'">'+targetCase.Subject+'</a></p><br/><table ><tr ><th>Subject</th><th>From Name</th><th>From Address</th><th>Message Date</th></tr>';
for(EmailMessage emCloned :oldEmailId2newEmail.values()){
emailBodyConfirmMove+='<tr><td><a href="'+cssProdOrgURL+emCloned.id+'">'+emCloned.Subject+'</a></td>';
emailBodyConfirmMove+='<td>'+emCloned.FromName+'</td>';
emailBodyConfirmMove+='<td>'+emCloned.FromAddress+'</td>';
emailBodyConfirmMove+='<td>'+emCloned.MessageDate+'</td></tr>';
}
emailBodyConfirmMove+='</table>';
if(string.valueOf(targetCase.OwnerId).startsWith('005')){//owner is user not queue
List<Messaging.SingleEmailMessage> lstMsgs = new List<Messaging.SingleEmailMessage>();
Messaging.SingleEmailMessage msg = new Messaging.SingleEmailMessage();
user targetOwner = [SELECT Id, email FROM user WHERE id=:targetCase.OwnerId AND email != null];
msg.setToAddresses(new List<String>{targetOwner.email});
msg.setHTMLbody(emailBodyConfirmMove);
msg.setSubject('Emails transferred to CASE -'+targetCase.CaseNumber);
lstMsgs.add(msg);
Messaging.SendEmailResult[] r = Messaging.sendEmail(lstMsgs);
}
}
} catch(Exception e) {
system.debug('** EXCEPTION - '+e.getMessage());
return e.getMessage();
}
return Label.Success_msg;
}
try below code. I have modified your code and commented your code.I believe it will work as expact.
let me know by marking it as best answer.
Thank you
Don't forget to mark it as best answer.
I think you should try my code once and if you are satisifed then mark it as best answer.
you best mark give us motivation to help others.
Thank you
Thanks for your reply.
I tried to update the code as mentioned in above comment but it's not working still. It is throwing same error and not send email after it's been transferred.
Thank you
I have another helper class which has the a method called updateCaseEmailActivity(). And the error shows -
'EXCEPTION - SendEmail failed. First exception on row 0; first error: UNKNOWN_EXCEPTION, EmailMessageTrigger: execution of AfterInsert
caused by: System.NullPointerException: Attempt to de-reference a null object
Class.EmailMessageTriggerHelper.updateCaseEmailActivity: line 55, column 1
Class.EmailMessageTriggerHelper.onAfterInsert: line 43, column 1'
Below is the EmailMessage helper class -