简体   繁体   English

在 ASP.NET MVC 应用程序中从 Amazon SES 发送电子邮件

[英]Send Email From Amazon SES in ASP.NET MVC App

I host my web app which is written in .net mvc2 on amazon ec2.我在亚马逊 ec2 上托管我的网络应用程序,该应用程序是用 .net mvc2 编写的。 currrently use gmail smtp to send email.目前使用 gmail smtp 发送电子邮件。 beacuse of google for startup email quota cant send more than 500 email a day.由于谷歌启动电子邮件配额不能每天发送超过 500 封电子邮件。 So decide to move amazon ses.所以决定搬家amazon ses。 How can use amazon ses with asp.net mvc2?如何将 amazon ses 与 asp.net mvc2 一起使用? How about configuration etc?配置等怎么样? Is email will send via gmail?电子邮件会通过 gmail 发送吗? because our email provider is gmail.因为我们的电子邮件提供商是 gmail。 etc.等等。

Send Email via Amazon is a right decision.通过亚马逊发送电子邮件是一个正确的决定。 Because when you move to amazon you will immediately get 2000 email free per day which is greater than googla apps 500 emails quota a day.因为当您搬到亚马逊时,您将立即获得每天 2000 封免费电子邮件,这比 googla 应用程序每天 500 封电子邮件配额还要多。

Step by Step:一步步:

  1. Go to http://aws.amazon.com/ses and click Sign Up for Amazon SES.转至http://aws.amazon.com/ses ,然后单击注册 Amazon SES。
  2. To get your AWS access identifiers获取您的 AWS 访问标识符
  3. verify your email address - email which you will send email via.验证您的电子邮件地址 - 您将通过其发送电子邮件的电子邮件。 You need perl packages installled on your computer to test email features.您需要在计算机上安装 perl 包来测试电子邮件功能。
  4. include:amazonses.com to your dns record.包括:amazonses.com 到您的 dns 记录。

Step by step documentation.一步一步的文档。 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/getting-started.html http://docs.aws.amazon.com/ses/latest/DeveloperGuide/getting-started.html

There is a Amazon SES (Simple Email Service) C# Wrapper on codeplex you can use this wrapper to send emails. Codeplex 上有一个 Amazon SES(简单电子邮件服务)C# 包装器,您可以使用此包装器发送电子邮件。

Amazon SES C# Wrapper亚马逊 SES C# 包装器

Easiest way is to download the SDK via Nuget (package is called AWSSDK) or download the SDK from Amazon's site.最简单的方法是通过 Nuget(包称为 AWSSDK)下载开发工具包或从亚马逊网站下载开发工具包。 The sdk download from their site has an example project that shows you how to call their API to send email.从他们的站点下载的 sdk 有一个示例项目,向您展示如何调用他们的 API 来发送电子邮件。 The only configuration is plugging in your api keys.唯一的配置是插入您的 api 密钥。 The trickiest part is verifying your send address (and any test receipients) but their is an API call there too to send the test message.最棘手的部分是验证您的发送地址(以及任何测试接收者),但它们也是发送测试消息的 API 调用。 You will then need to log in and verify those email addresses.然后,您需要登录并验证这些电子邮件地址。 The email will be sent through Amazon (that is the whole point) but the from email address can be your gmail address.电子邮件将通过亚马逊发送(这就是重点),但发件人电子邮件地址可以是您的 gmail 地址。

@gandil I created this very simple code to send emails @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);
        }
     }
  }
}

You can find the code in here https://github.com/gianluis90/amazon-send-email你可以在这里找到代码https://github.com/gianluis90/amazon-send-email

  1. Download AWSSDK.dll file from internet use following name-spaces使用以下命名空间从互联网下载 AWSSDK.dll 文件
using Amazon; using Amazon.SimpleEmail; using Amazon.SimpleEmail.Model; using System.Net.Mail;

2 . 2 . Add to web config...添加到网络配置...

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

3 . 3 . Add a AWSEmailSevice class to your project that will allow to send mail via AWS ses...将 AWSEmailSevice 类添加到您的项目中,该类将允许通过 AWS 服务发送邮件...

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. Use above class to send mail anyone with attachment and template varibales replacement (it's optional) // Call this method to send your email使用上面的类向任何人发送带有附件和模板变量替换的邮件(它是可选的) // 调用此方法发送您的电子邮件

public string SendEmailViaAWS() { string emailStatus = ""; public string 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 ; }

Following is how I sent email with attachment以下是我如何发送带附件的电子邮件

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM