Aaron
Aaron

Reputation: 1489

set reply-to address in outgoing email EWS

Running Exchange 2013

I am using EWS in a c# service that sends emails from a service account.

I want to have the emails have a reply-to address different than the sending account, a distribution list address.

How can I do this? The EmailMessage.ReplyTo field is read only.

Code:

ExchangeService service = new ExchangeService();
service.Credentials = EWScredentials;
service.Url = new Uri(string.Format("https://{0}/EWS/Exchange.asmx", ExchangePath));

EmailMessage message = new EmailMessage(service);
message.ToRecipients.AddRange(receipients);

//This didn't work
message.ReplyTo.Clear();
message.ReplyTo.Add(replyToAddress);

message.Subject = subject;
message.Body = html;
message.SendAndSaveCopy();

Only other thread that seemed related, though I'm not using powershell: How do you set a message Reply-To address using EWS Managed API?

Upvotes: 3

Views: 3621

Answers (5)

InbetweenWeekends
InbetweenWeekends

Reputation: 1414

I'm sure it's due to this question being 6 years old, and the library has been updated since.

The ReplyTo property is a readonly EmailAddressCollection that can be cleared, and added to.

var emailSend = new EmailMessage(service)
emailSend.ToRecipients.Add("[email protected]");

// change the reply-to
if(email.FromAddress.ToLower() != "[email protected]"){
    emailSend.ReplyTo.Clear();
    emailSend.ReplyTo.Add(new EmailAddress() { Address = "[email protected]" });
}
                                
emailSend.Save();
emailSend.Send(); 

Upvotes: 0

blaiz128
blaiz128

Reputation: 115

There is a simpler solution: use ResponseMessage:

ResponseMessage responseMessage = originalEmail.createReply(isReplyAll);
responseMessage.getToRecipients().addEmailRange(...email address...);
responseMessage.sendAndSaveCopy();

Upvotes: 0

George D
George D

Reputation: 41

I solved this by loading the ToRecipients and CcRecipients properties on the EmailMessage replyMessage object.

C# code is something like this:

// somehow get a hold of an ExchangeService object
var message = service.Bind(service, mail.Id);
var replyMessage = message.CreateReply(replyToAll: true);

replyMessage.Load(new PropertySet() { EmailMessageSchema.ToRecipients, EmailMessageSchema.CcRecipients });

replyMessage.ToRecipients.Add("[email protected]");
replyMessage.CcRecipients.Add("[email protected]");

replyMessage.Send();

Of course, if you don't plan on working with Cc, you don't have to load it. This allows you to append new addresses, or clear the recipients and add whatever you want.

Upvotes: 0

Lion3000
Lion3000

Reputation: 1

that work for me :

EmailAddressCollection emailAddressCollection = new EmailAddressCollection();
emailAddressCollection.add(new EmailAddress("[email protected]"));
emailMessage.getPropertyBag().setObjectFromPropertyDefinition(EmailMessageSchema.ReplyTo, emailAddressCollection);

Upvotes: 0

Glen Scales
Glen Scales

Reputation: 22032

You can use the PidTagReplyRecipientEntries extended property https://msdn.microsoft.com/en-us/library/office/cc815710.aspx to do that eg

        EmailMessage DifferentReplyTo = new EmailMessage(service);
        DifferentReplyTo.Subject = "test";
        DifferentReplyTo.ToRecipients.Add("[email protected]");
        DifferentReplyTo.Body = new MessageBody("test");           
        ExtendedPropertyDefinition PidTagReplyRecipientEntries = new ExtendedPropertyDefinition(0x004F, MapiPropertyType.Binary);
        ExtendedPropertyDefinition PidTagReplyRecipientNames = new ExtendedPropertyDefinition(0x0050, MapiPropertyType.String);
        DifferentReplyTo.SetExtendedProperty(PidTagReplyRecipientEntries, ConvertHexStringToByteArray(GenerateFlatList("[email protected]", "jc")));
        DifferentReplyTo.SetExtendedProperty(PidTagReplyRecipientNames, "jc");
        DifferentReplyTo.SendAndSaveCopy();

    internal static String GenerateFlatList(String SMTPAddress, String DisplayName)
    {
        String abCount = "01000000";
        String AddressId = GenerateOneOff(SMTPAddress, DisplayName);
        return abCount + BitConverter.ToString(INT2LE((AddressId.Length / 2) + 4)).Replace("-", "") + BitConverter.ToString(INT2LE(AddressId.Length / 2)).Replace("-", "") + AddressId;
    }

    internal static String GenerateOneOff(String SMTPAddress,String DisplayName)
    {
        String Flags = "00000000";
        String ProviderUid = "812B1FA4BEA310199D6E00DD010F5402";
        String Version = "0000";
        String xFlags = "0190";
        String DisplayNameHex = BitConverter.ToString(UnicodeEncoding.Unicode.GetBytes(DisplayName + "\0")).Replace("-","");
        String SMTPAddressHex = BitConverter.ToString(UnicodeEncoding.Unicode.GetBytes(SMTPAddress + "\0")).Replace("-", "");
        String AddressType = BitConverter.ToString(UnicodeEncoding.Unicode.GetBytes("SMTP" + "\0")).Replace("-", "");
        return Flags + ProviderUid + Version + xFlags + DisplayNameHex + AddressType + SMTPAddressHex;
    }
    internal static byte[] INT2LE(int data)
    {
        byte[] b = new byte[4];
        b[0] = (byte)data;
        b[1] = (byte)(((uint)data >> 8) & 0xFF);
        b[2] = (byte)(((uint)data >> 16) & 0xFF);
        b[3] = (byte)(((uint)data >> 24) & 0xFF);
        return b;
    }
    internal static byte[] ConvertHexStringToByteArray(string hexString)
    {
        if (hexString.Length % 2 != 0)
        {
            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
        }

        byte[] HexAsBytes = new byte[hexString.Length / 2];
        for (int index = 0; index < HexAsBytes.Length; index++)
        {
            string byteValue = hexString.Substring(index * 2, 2);
            HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
        }

        return HexAsBytes;
    }

Cheers Glen

Upvotes: 4

Related Questions