使用Amazon AWS SMTP发送带附件的电子邮件

时间:2017-01-06 15:03:58

标签: c# amazon-web-services amazon-ses

我尝试使用亚马逊WS SMTP发送电子邮件,发送成功但我从未收到过该电子邮件。当我发送它没有附件时,我收到它成功。

这是我的代码

// Create an SMTP client with the specified host name and port.
        using (SmtpClient client = new SmtpClient(ssHost, ssPort))
        {
            // Create a network credential with your SMTP user name and password.
            client.Credentials = new System.Net.NetworkCredential(ssSMTP_Username, ssSMTP_Password);

            // Use SSL when accessing Amazon SES. The SMTP session will begin on an unencrypted connection, and then 
            // the client will issue a STARTTLS command to upgrade to an encrypted connection using SSL.
            client.EnableSsl = true;
            // Send the email. 

            MailMessage message = new MailMessage();
            try
            {
                //creates a messages with the all data
                message.From = new MailAddress(ssFrom, ssFromName);
                //message.To.Add(ssTo);
                //To
                List<String> toAddresses = ssTo.Split(',').ToList();
                foreach (String toAddress in toAddresses)
                {
                    message.To.Add(new MailAddress(toAddress));
                }
                //cc
                List<String> ccAddresses = ssCC.Split(',').Where(y => y != "").ToList();
                foreach (String ccAddress in ccAddresses)
                {
                    message.CC.Add(new MailAddress(ccAddress));
                }
                //bcc
                List<String> BccAddresses = ssBcc.Split(',').Where(y => y != "").ToList();
                foreach (String ccAddress in ccAddresses)
                {
                    message.Bcc.Add(new MailAddress(ccAddress));
                }

                //replyTo
                if (ssReplyTo != null)
                {
                    message.ReplyToList.Add(new MailAddress(ssReplyTo));
                }

                //email
                message.Subject = ssSubject;
                message.Body = ssBody;
                message.IsBodyHtml = true;


                //Attachment
                foreach (RCAttachmentRecord attchmentRec in ssAttachmenstList){
                    System.IO.MemoryStream ms = new System.IO.MemoryStream(attchmentRec.ssSTAttachment.ssBinary);
                    Attachment attach = new Attachment(ms, attchmentRec.ssSTAttachment.ssFilename);
                    message.Attachments.Add(attach);

                    ssErrorMessage = ssErrorMessage + "||" + attchmentRec.ssSTAttachment.ssFilename+"lenght:"+attchmentRec.ssSTAttachment.ssBinary.Length;
                }
                client.Send(message);

            }

来源:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-smtp-net.html

1 个答案:

答案 0 :(得分:1)

我认为您的问题可能是您没有正确地将附件添加到邮件中。

我成功发送带附件的单条消息。我开始使用直接从your source link above获取的代码。然后我添加了another SO article about the missing content type problem的代码。

附件是我的Documents文件夹中的Word文档Lebowski.docx。我建议您创建一个类似的简单Word文档并运行以下代码以验证您是否可以在一封电子邮件中发送简单的附件。

以下代码对我成功:

namespace SESTest
{
using System;
using System.Net.Mail;

namespace AmazonSESSample
{
    class Program
    {
        static void Main(string[] args)
        {
            const String FROM = "from-email";   // Replace with your "From" address. This address must be verified.
            const String TO = "to-email";  // Replace with a "To" address. If your account is still in the
                                                        // sandbox, this address must be verified.

            const String SUBJECT = "Amazon SES test (SMTP interface accessed using C#)";
            const String BODY = "This email and attachment was sent through the Amazon SES SMTP interface by using C#.";

            // Supply your SMTP credentials below. Note that your SMTP credentials are different from your AWS credentials.
            const String SMTP_USERNAME = "user-creds";  // Replace with your SMTP username. 
            const String SMTP_PASSWORD = "password";  // Replace with your SMTP password.

            // Amazon SES SMTP host name. 
            const String HOST = "your-region.amazonaws.com";

            // The port you will connect to on the Amazon SES SMTP endpoint. We are choosing port 587 because we will use
            // STARTTLS to encrypt the connection.
            const int PORT = 2587;

            // Create an SMTP client with the specified host name and port.
            using (System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(HOST, PORT))
            {
                // Create a network credential with your SMTP user name and password.
                client.Credentials = new System.Net.NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);

                // Use SSL when accessing Amazon SES. The SMTP session will begin on an unencrypted connection, and then 
                // the client will issue a STARTTLS command to upgrade to an encrypted connection using SSL.
                client.EnableSsl = true;

                // Send the email. 
                try
                {
                    Console.WriteLine("Attempting to send an email through the Amazon SES SMTP interface...");

                    var mailMessage = new MailMessage()
                    {
                        Body = BODY,
                        Subject = SUBJECT,
                        From = new MailAddress(FROM)
                    };
                    mailMessage.To.Add(new MailAddress(TO));

                    //REMOVE THIS CODE
                    //System.IO.MemoryStream ms = new System.IO.MemoryStream(attchmentRec.ssSTAttachment.ssBinary);
                    //Attachment attach = new Attachment(ms, attchmentRec.ssSTAttachment.ssFilename);
                    //mailMessage.Attachments.Add(attach);

                    System.Net.Mime.ContentType contentType = new System.Net.Mime.ContentType();
                    contentType.MediaType = System.Net.Mime.MediaTypeNames.Application.Octet;
                    contentType.Name = "Lebowski.docx";
                    mailMessage.Attachments.Add(new Attachment("C:\\users\\luis\\Documents\\Lebowski.docx", contentType));

                    client.Send(mailMessage);

                    Console.WriteLine("Email sent!");
                }
                catch (Exception ex)
                {
                    Console.WriteLine("The email was not sent.");
                    Console.WriteLine("Error message: " + ex.Message);
                }
            }

            Console.Write("Press any key to continue...");
            Console.ReadKey();
        }
    }
}
}

一旦您证明您可以通过帐户发送包含一个附件的电子邮件,那么您就可以开始研究如何将ssAttachmentsList中的二进制文件添加到您的电子邮件中,并为每个邮件分配正确的内容类型。但是你没有为我提供足够的代码或背景来确定这一点。我希望这段代码可以帮助您克服附件问题。