Отправить письмо с Amazon SES в приложении ASP.NET MVC - PullRequest
10 голосов
/ 17 июня 2011

Я размещаю свое веб-приложение, написанное на .net mvc2 на amazon ec2.В настоящее время используйте Gmail SMTP для отправки электронной почты.из-за Google для запуска электронной почты квота не может отправлять более 500 писем в день.Поэтому решите переехать в Амазонку.Как можно использовать amazon ses с asp.net mvc2?Как насчет конфигурации и т. Д.?Будет ли электронная почта отправляться через Gmail?потому что наш провайдер электронной почты - Gmail.и т.д.

Ответы [ 4 ]

7 голосов
/ 07 июля 2011

Отправить письмо через Amazon - это правильное решение.Потому что, когда вы переедете в Amazon, вы сразу получите 2000 электронных писем в день, что больше, чем у приложений googla. 500 квот в день.

Шаг за шагом:

  1. Перейдите на http://aws.amazon.com/ses и нажмите «Зарегистрироваться в Amazon SES».
  2. Чтобы получить идентификаторы доступа AWS
  3. , проверьте свой адрес электронной почты - адрес электронной почты, по которому вы будете отправлять электронную почту.Для тестирования функций электронной почты на вашем компьютере должны быть установлены пакеты Perl.
  4. включает: amazonses.com к вашей записи DNS.

Пошаговая документация.http://docs.aws.amazon.com/ses/latest/DeveloperGuide/getting-started.html

Существует обертка C # Amazon SES (Simple Email Service) в кодплексе, которую вы можете использовать для отправки электронных писем.

Оболочка Amazon SES C #

5 голосов
/ 22 июня 2011

Самый простой способ - загрузить SDK через Nuget (пакет называется AWSSDK) или загрузить SDK с сайта Amazon. Загрузка SDK с их сайта имеет пример проекта, который показывает вам, как вызвать их API для отправки электронной почты. Единственная конфигурация - это подключение ваших ключей API. Самая сложная часть - это проверка вашего адреса отправки (и любых тестовых получателей), но это тоже вызов API для отправки тестового сообщения. Затем вам нужно будет войти в систему и проверить эти адреса электронной почты. Письмо будет отправлено через Amazon (в этом весь смысл), но адрес электронной почты от может быть вашим адресом электронной почты.

1 голос
/ 23 июня 2017

@ gandil Я создал этот очень простой код для отправки писем

using Amazon;
using Amazon.SimpleEmail;
using Amazon.SimpleEmail.Model;
using System.IO;

namespace SendEmail
{
 class Program
 {
    static void Main(string[] args)
    {
        //Remember to enter your (AWSAccessKeyID, AWSSecretAccessKey) if not using and IAM User with credentials assigned to your instance and your RegionEndpoint
        using (var client = new AmazonSimpleEmailServiceClient("YourAWSAccessKeyID", "YourAWSSecretAccessKey", RegionEndpoint.USEast1))
        {
            var emailRequest =  new SendEmailRequest()
            {
                Source = "FROMADDRESS@TEST.COM",
                Destination = new Destination(),
                Message = new Message()
            };

            emailRequest.Destination.ToAddresses.Add("TOADDRESS@TEST.COM");
            emailRequest.Message.Subject = new Content("Hello World");
            emailRequest.Message.Body = new Body(new Content("Hello World"));
            client.SendEmail(emailRequest);
        }
     }
  }
}

Вы можете найти код здесь https://github.com/gianluis90/amazon-send-email

1 голос
/ 15 мая 2015
  1. Загрузите файл AWSSDK.dll из Интернета. используйте следующие пространства имен
using Amazon;
using Amazon.SimpleEmail;
using Amazon.SimpleEmail.Model;

using System.Net.Mail;

2. Добавить в веб-конфигурацию ...

 <appSettings>
     <add key="AWSAccessKey" value="Your AWS Access Key" />
     <add key="AWSSecretKey" value="Your AWS secret Key" />
 </appSettings>

3. Добавьте в проект класс AWSEmailSevice, который позволит отправлять почту через AWS ses ...

public class AWSEmailSevice
    {

        //create smtp client instance...
        SmtpClient smtpClient = new SmtpClient();

        //for sent mail notification...
        bool _isMailSent = false;

        //Attached file path...
        public string AttachedFile = string.Empty;

        //HTML Template used in mail ...
        public string Template = string.Empty;

        //hold the final template data list of users...
        public string _finalTemplate = string.Empty;

        //Template replacements varibales dictionary....
        public Dictionary<string, string> Replacements = new Dictionary<string, string>();


        public bool SendMail(MailMessage mailMessage)
        {
            try
            {

                if (mailMessage != null)
                {
                    //code for fixed things
                    //from address...
                    mailMessage.From = new MailAddress("from@gmail.com");

                    //set priority high
                    mailMessage.Priority = System.Net.Mail.MailPriority.High;

                    //Allow html true..
                    mailMessage.IsBodyHtml = true;

                    //Set attachment data..
                    if (!string.IsNullOrEmpty(AttachedFile))
                    {
                        //clear old attachment..
                        mailMessage.Attachments.Clear();

                        Attachment atchFile = new Attachment(AttachedFile);
                        mailMessage.Attachments.Add(atchFile);
                    }

                    //Read email template data ...
                    if (!string.IsNullOrEmpty(Template))
                        _finalTemplate = File.ReadAllText(Template);

                    //check replacements ...
                    if (Replacements.Count > 0)
                    {
                        //exception attached template..
                        if (string.IsNullOrEmpty(_finalTemplate))
                        {
                            throw new Exception("Set Template field (i.e. file path) while using replacement field");
                        }

                        foreach (var item in Replacements)
                        {
                            //Replace Required Variables...
                            _finalTemplate = _finalTemplate.Replace("<%" + item.Key.ToString() + "%>", item.Value.ToString());
                        }
                    }

                    //Set template...
                    mailMessage.Body = _finalTemplate;


                    //Send Email Using AWS SES...
                    var message = mailMessage;
                    var stream = FromMailMessageToMemoryStream(message);
                    using (AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient(
                               ConfigurationManager.AppSettings["AWSAccessKey"].ToString(),
                               ConfigurationManager.AppSettings["AWSSecretKey"].ToString(), 
                               RegionEndpoint.USWest2))
                    {
                        var sendRequest = new SendRawEmailRequest { RawMessage = new RawMessage { Data = stream } };
                        var response = client.SendRawEmail(sendRequest);

                        //return true ...
                    _isMailSent = true;

                    }
                }
                else
                {
                    _isMailSent = false;
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return _isMailSent;
        }

        private MemoryStream FromMailMessageToMemoryStream(MailMessage message)
        {
            Assembly assembly = typeof(SmtpClient).Assembly;

            Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");

            MemoryStream stream = new MemoryStream();

            ConstructorInfo mailWriterContructor =
               mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
            object mailWriter = mailWriterContructor.Invoke(new object[] { stream });

            MethodInfo sendMethod =
               typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);

            if (sendMethod.GetParameters().Length == 3)
            {
                sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); // .NET 4.x
            }
            else
            {
                sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null); // .NET < 4.0 
            }

            MethodInfo closeMethod =
               mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
            closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);

            return stream;
        }
    }
  1. Используйте вышеприведенный класс для отправки почты любому, у кого есть замена вложений и шаблонов (это необязательно) // Вызовите этот метод для отправки вашего письма

публичная строка SendEmailViaAWS () { string emailStatus = "";

      //Create instance for send email...
      AWSEmailSevice emailContaint = new AWSEmailSevice();
      MailMessage emailStuff = new MailMessage();

       //email subject..
      emailStuff.Subject = "Your Email subject";

        //region  Optional email stuff

      //Templates to be used in email / Add your Html template path ..
      emailContaint.Template = @"\Templates\MyUserNotification.html";

      //add file attachment / add your file ...
      emailContaint.AttachedFile = "\ExcelReport\report.pdf";



        //Note :In case of template 
        //if youe want to replace variables in run time 
        //just add replacements like <%FirstName%>  ,  <%OrderNo%> , in HTML Template 


        //if you are using some varibales in template then add 
      // Hold first name..
      var FirstName = "User First Name";

      //  Hold email..
      var OrderNo = 1236;


      //firstname replacement..
      emailContaint.Replacements.Add("FirstName", FirstName.ToString());
      emailContaint.Replacements.Add("OrderNo", OrderNo.ToString());

        // endregion option email stuff


      //user OrderNo replacement...
      emailContaint.To.Add(new MailAddress("TOEmail@gmail.com"));

      //mail sent status
      bool isSent = emailContaint.SendMail(emailStuff);

      if(isSent)
      {
         emailStatus = "Success";
      }
      else
      {
      emailStatus = "Fail";
      }
         return emailStatus ;    }
...