Reputation: 41
Good day! I'm just started with Amazon SES. I want use this in my asp.net mvc (C#) website.
I download and install AWS Toolkit for Visual Studio, create AWS simple console application. So, I have sample code that can send email, using AmazonSimpleEmailService client.
PART 1:
using (AmazonSimpleEmailService client = AWSClientFactory.CreateAmazonSimpleEmailServiceClient(RegionEndpoint.USEast1))
{
var sendRequest = new SendEmailRequest
{
Source = senderAddress,
Destination = new Destination { ToAddresses = new List<string> { receiverAddress } },
Message = new Message
{
Subject = new Content("Sample Mail using SES"),
Body = new Body { Text = new Content("Sample message content.") }
}
};
Console.WriteLine("Sending email using AWS SES...");
SendEmailResponse response = client.SendEmail(sendRequest);
Console.WriteLine("The email was sent successfully.");
}
Further, I must configuring Amazon SES Feedback Notifications via Amazon SNS. I find nice topic with sample code:
PART 3: http://sesblog.amazon.com/post/TxJE1JNZ6T9JXK/Handling-Bounces-and-Complaints
So, I need make PART 2 where I'll get ReceiveMessageResponse response and send it into PART 3.
I need implement in C# this steps: Set up the following AWS components to handle bounce notifications:
1. Create an Amazon SQS queue named ses-bounces-queue.
2. Create an Amazon SNS topic named ses-bounces-topic.
3. Configure the Amazon SNS topic to publish to the SQS queue.
4. Configure Amazon SES to publish bounce notifications using ses-bounces-topic to ses-bounces-queue.
I try write it:
// 1. Create an Amazon SQS queue named ses-bounces-queue.
AmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient(RegionEndpoint.USWest2);
CreateQueueRequest sqsRequest = new CreateQueueRequest();
sqsRequest.QueueName = "ses-bounces-queue";
CreateQueueResponse createQueueResponse = sqs.CreateQueue(sqsRequest);
String myQueueUrl;
myQueueUrl = createQueueResponse.CreateQueueResult.QueueUrl;
// 2. Create an Amazon SNS topic named ses-bounces-topic
AmazonSimpleNotificationService sns = new AmazonSimpleNotificationServiceClient(RegionEndpoint.USWest2);
string topicArn = sns.CreateTopic(new CreateTopicRequest
{
Name = "ses-bounces-topic"
}).CreateTopicResult.TopicArn;
// 3. Configure the Amazon SNS topic to publish to the SQS queue
sns.Subscribe(new SubscribeRequest
{
TopicArn = topicArn,
Protocol = "https",
Endpoint = "ses-bounces-queue"
});
// 4. Configure Amazon SES to publish bounce notifications using ses-bounces-topic to ses-bounces-queue
clientSES.SetIdentityNotificationTopic(XObject);
I'm on the right track?
How I can implement 4 part? How receive XObject?
Thanks!
Upvotes: 4
Views: 5409
Reputation: 1079
I have the same problem today. I solved the problem by configuring a WebHook (https) in the SNS configuration. On the webserver i process now the events. I have create a nuget package with the logic.
My Code - Nager.AmazonSesNotification
[Route("SesNotification")]
[HttpPost]
public async Task<IActionResult> SesNotificationAsync()
{
var body = string.Empty;
using (var reader = new StreamReader(Request.Body))
{
body = await reader.ReadToEndAsync();
}
var notificationProcessor = new NotificationProcessor();
var result = await notificationProcessor.ProcessNotificationAsync(body);
//Your processing logic...
return StatusCode(StatusCodes.Status200OK);
}
Upvotes: 0
Reputation: 5679
I've recently had to tackle this problem and I couldn't find a good code example on how to handle the SNS bounce notification (as well as topic subscription request) from a .Net website. Here's the Web API method I came up with to handle SNS bounce notifications from Amazon SES.
The code is in VB but any online VB to C# converter should be able to easily get it converted for you.
Imports System.Web.Http
Imports Amazon.SimpleNotificationService
Namespace Controllers
Public Class AmazonController
Inherits ApiController
<HttpPost>
<Route("amazon/bounce-handler")>
Public Function HandleBounce() As IHttpActionResult
Try
Dim msg = Util.Message.ParseMessage(Request.Content.ReadAsStringAsync().Result)
If Not msg.IsMessageSignatureValid Then
Return BadRequest("Invalid Signature!")
End If
If msg.IsSubscriptionType Then
msg.SubscribeToTopic()
Return Ok("Subscribed!")
End If
If msg.IsNotificationType Then
Dim bmsg = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Message)(msg.MessageText)
If bmsg.notificationType = "Bounce" Then
Dim emails = (From e In bmsg.bounce.bouncedRecipients
Select e.emailAddress).Distinct()
If bmsg.bounce.bounceType = "Permanent" Then
For Each e In emails
'this email address is permanantly bounced. don't ever send any mails to this address. remove from list.
Next
Else
For Each e In emails
'this email address is temporarily bounced. don't send any more emails to this for a while. mark in db as temp bounce.
Next
End If
End If
End If
Catch ex As Exception
'log or notify of this error to admin for further investigation
End Try
Return Ok("done...")
End Function
Private Class BouncedRecipient
Public Property emailAddress As String
Public Property status As String
Public Property diagnosticCode As String
Public Property action As String
End Class
Private Class Bounce
Public Property bounceSubType As String
Public Property bounceType As String
Public Property reportingMTA As String
Public Property bouncedRecipients As BouncedRecipient()
Public Property timestamp As DateTime
Public Property feedbackId As String
End Class
Private Class Mail
Public Property timestamp As DateTime
Public Property source As String
Public Property sendingAccountId As String
Public Property messageId As String
Public Property destination As String()
Public Property sourceArn As String
End Class
Private Class Message
Public Property notificationType As String
Public Property bounce As Bounce
Public Property mail As Mail
End Class
End Class
End Namespace
Upvotes: 1
Reputation: 64741
You are on the right track - for the missing part 4 you need to implement receiving of a message from the Amazon SQS message queue you created in step 1. See my answer to Example of .net application using Amazon SQS for where to find a respective example - it boils down to the following code:
// receive a message
ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest();
receiveMessageRequest.QueueUrl = myQueueUrl;
ReceiveMessageResponse receiveMessageResponse = sqs.
ReceiveMessage(receiveMessageRequest);
if (receiveMessageResponse.IsSetReceiveMessageResult())
{
Console.WriteLine("Printing received message.\n");
ReceiveMessageResult receiveMessageResult = receiveMessageResponse.
ReceiveMessageResult;
foreach (Message message in receiveMessageResult.Message)
{
// process the message (see below)
}
}
Within the loop you need to call either ProcessQueuedBounce()
or ProcessQueuedComplaint()
as illustrated in Handling Bounces and Complaints.
Upvotes: 3