在ASP.NET MVC App中从Amazon SES发送电子邮件

时间:2011-06-17 11:34:45

标签: asp.net sendmail amazon-ses

我托管我的网络应用程序,它是用.net mvc2在亚马逊ec2上编写的。 currrently使用gmail smtp发送电子邮件。因为谷歌启动电子邮件配额不能每天发送超过500封电子邮件。所以决定移动亚马逊ses。如何使用asp.net mvc2的amazon ses?配置等怎么样?电子邮件是通过Gmail发送的吗?因为我们的电子邮件提供商是gmail。等

5 个答案:

答案 0 :(得分:7)

通过亚马逊发送电子邮件是一个正确的决定。因为当你搬到亚马逊时,你每天会立即免费获得2000封电子邮件,这比googla apps每天500封电子邮件配额要多。

一步一步:

  1. 转到http://aws.amazon.com/ses 并单击注册Amazon SES。
  2. 获取您的AWS访问标识符
  3. 验证您的电子邮件地址 - 电子邮件 您将通过电子邮件发送。您 需要安装perl软件包 你的电脑测试电子邮件 特征
  4. 包括:amazonses.com到您的dns记录。
  5. 一步一步的文档。 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/getting-started.html

    在codeplex上有一个Amazon SES(简单电子邮件服务)C#Wrapper,您可以使用此包装器发送电子邮件。

    Amazon SES C# Wrapper

答案 1 :(得分:5)

最简单的方法是通过Nuget下载SDK(包名为AWSSDK)或从亚马逊网站下载SDK。从他们的网站下载的sdk有一个示例项目,向您展示如何调用他们的API来发送电子邮件。唯一的配置是插入api密钥。最棘手的部分是验证您的发送地址(以及任何测试接收者),但它们也是API调用以发送测试消息。然后,您需要登录并验证这些电子邮件地址。电子邮件将通过亚马逊发送(这就是重点),但是来自电子邮件的地址可以是您的Gmail地址。

答案 2 :(得分:1)

  1. 从互联网下载AWSSDK.dll文件 使用以下名称空格
  2. 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. 使用上面的类发送任何带有附件和模板varibales替换的邮件(它是可选的) //调用此方法发送电子邮件
    2.   

      public string SendEmailViaAWS()         {             string emailStatus =&#34;&#34 ;;

            //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 ;    }
      

答案 3 :(得分:1)

@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

答案 4 :(得分:0)

以下是我发送带有附件的电子邮件的方式

  public static void SendMailSynch(string file1, string sentFrom, List<string> recipientsList, string subject, string body)
    {

        string smtpClient = "email-smtp.us-east-1.amazonaws.com"; //Correct it
        string conSMTPUsername = "<USERNAME>";
        string conSMTPPassword = "<PWD>";

        string username = conSMTPUsername;
        string password = conSMTPPassword;

        // Configure the client:
        System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(smtpClient);
        client.Port = 25;
        client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
        client.UseDefaultCredentials = false;

        System.Net.NetworkCredential credentials = new System.Net.NetworkCredential(username, password);
        client.EnableSsl = true;
        client.Credentials = credentials;

        // Create the message:
        var mail = new System.Net.Mail.MailMessage();
        mail.From = new MailAddress(sentFrom);
        foreach (string recipient in recipientsList)
        {
            mail.To.Add(recipient);
        }
        mail.Bcc.Add("test@test.com");
        mail.Subject = subject;
        mail.Body = body;
        mail.IsBodyHtml = true;


        Attachment attachment1 = new Attachment(file1, MediaTypeNames.Application.Octet);


        ContentDisposition disposition = attachment1.ContentDisposition;
        disposition.CreationDate = System.IO.File.GetCreationTime(file1);
        disposition.ModificationDate = System.IO.File.GetLastWriteTime(file1);
        disposition.ReadDate = System.IO.File.GetLastAccessTime(file1);

        mail.Attachments.Add(attachment1);

        client.Send(mail);
    }