【问题标题】:Send Email From Amazon SES in ASP.NET MVC App在 ASP.NET MVC 应用程序中从 Amazon SES 发送电子邮件
【发布时间】:2011-06-17 11:34:44
【问题描述】:

我在亚马逊 ec2 上托管我用 .net mvc2 编写的网络应用程序。当前使用 gmail smtp 发送电子邮件。因为谷歌的启动电子邮件配额每天不能发送超过 500 封电子邮件。所以决定搬亚马逊。如何将亚马逊 ses 与 asp.net mvc2 一起使用?配置之类的呢?电子邮件会通过gmail发送吗?因为我们的电子邮件提供商是 gmail。等等

【问题讨论】:

    标签: asp.net sendmail amazon-ses


    【解决方案1】:

    通过亚马逊发送电子邮件是一个正确的决定。因为当您搬到亚马逊时,您将立即免费获得每天 2000 封电子邮件,这超过了 googla 应用程序每天 500 封电子邮件的配额。

    一步一步:

    1. 转到http://aws.amazon.com/ses 并单击注册 Amazon SES。
    2. 获取您的 AWS 访问标识符
    3. 验证您的电子邮件地址 - 电子邮件 您将通过它发送电子邮件。你 需要安装 perl 包 您的计算机来测试电子邮件 功能。
    4. include:amazonses.com 到您的 dns 记录中。

    分步文档。 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/getting-started.html

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

    Amazon SES C# Wrapper

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      @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】:
        1. 从 Internet 下载 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 .向您的项目添加一个 AWSEmailService 类,该类将允许通过 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() { 字符串 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 ;    }
        

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-06-22
            • 2016-08-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多