Amazon SES电子邮件地址未经过验证

时间:2014-03-02 14:24:39

标签: c# asp.net email amazon-web-services amazon-ses

我从亚马逊服务器开始,开始研究SES。 我正在使用asp.net C#并制作了基于代码的教程。 我已经检查了域名,并检查了我将运行测试的电子邮件。

因此,当我运行我的代码时,它会生成以下错误消息:事务失败。服务器响应为:邮件被拒绝:未验证电子邮件地址。

我不知道它是什么因为我遵循了所有可能的步骤,单个细节尚未订购发布获取生产。

但我认为不可能,我还在测试服务。

我的代码

public void enviarSES02()
        {
            try
            {
                const String FROM = "verified email address"; 
                const String TO = "verified email address"; 

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

                const String SMTP_USERNAME = "my username";  // Replace with your SMTP username. 
                const String SMTP_PASSWORD = "my password";  // Replace with your SMTP password.

                const String HOST = "email-smtp.us-west-2.amazonaws.com";

                const int PORT = 25;//already tried with all recommended ports

                SmtpClient client = new SmtpClient(HOST, PORT);
                client.Credentials = new System.Net.NetworkCredential(SMTP_USERNAME, SMTP_PASSWORD);

                client.EnableSsl = true;

                try
                {
                    Console.WriteLine("Attempting to send an email through the Amazon SES SMTP interface...");
                    client.Send(FROM, TO, SUBJECT, BODY);
                    Response.Write("ENVIADO");
                }
                catch (Exception ex)
                {
                    Response.Write("<br>O e-mail não foi enviado.<br>");
                    Response.Write("Olhao erro: " + ex.Message);
                }

            }
            catch (Exception ex)
            {
                Response.Write("Error message: " + ex.Message);
            }

        }

4 个答案:

答案 0 :(得分:54)

您的代码表明您尝试通过us-west-2发送。您是否已请求该地区的生产访问权限,并且您的From地址是否经过验证? Amazon SES的生产访问权限与地区无关,您需要申请separately for each region

如果您没有生产访问权限,则应确保已验证FromTo地址。 Amazon SES控制台将为us-west-2列出您的verified email addressesverified domains。 Amazon SES博客additional guidance介绍了如何在us-west-2中设置。

快速判断您是否没有生产访问权限:登录Amazon SES console dashboard,它将在页面顶部显示带有以下文本的蓝色横幅,其中包含一个请求生产访问权限的按钮:

  

您的Amazon SES帐户在美国西部地区拥有“沙盒”访问权限   (俄勒冈州)。通过沙盒访问,您只能向亚马逊发送电子邮件   SES邮箱模拟器以及您拥有的电子邮件地址或域   验证。了解更多。

     

找不到您现有的帐户设置?您的帐户可能已设置完毕   在不同的AWS区域。尝试切换右上角的区域   控制台的一角。

答案 1 :(得分:5)

您是否仍然在'沙盒'模式下运行?如果是,您只能向已经过预验证的地址发送电子邮件。

来自亚马逊:

  

电子邮件地址未经过验证 - 您的帐户位于沙盒中,而且位于沙箱中   收件人电子邮件地址尚未经过验证。这有可能   适用于“发件人”,“退货路径”或“发件人”地址。

     

如果您尚未请求对Amazon SES的生产访问,则必须   验证除收件人之外的每个收件人电子邮件地址   由Amazon SES邮箱模拟器提供。你还必须验证   你自己的“发件人”地址。有关更多信息,请参阅验证电子邮件   Amazon SES中的地址和域以及Amazon SES电子邮件测试   发送。

此处提供更多信息:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/ses-errors.html

答案 2 :(得分:2)

经过几周的捣乱,我终于把它排除了。因此,如果您不在沙箱中,请验证您的域名和您的FROM电子邮件地址,请注意默认区域。正如您已经知道的那样(只是猜测),离开沙箱是特定于区域的(以及经过验证的电子邮件和域名)。

我的问题是,在所有关于如何使用AWS SDK Java发送电子邮件的排列中,我无法指定显式区域,而我的美国帐户将该区域默认为USA West。我执行所有验证(并且已经离开Sandbox)的我所在的地区是Europe West(email-smtp.eu-west-1.amazonaws.com)。另外,请不要忘记使用适用于AWS访问密钥的Amazon SES API的正确凭据。在我的情况下(下面),这些键位于一个文件中,在带有两个键值对的类路径中:

accessKey = AKI...
secretKey = AsVyp...

以下是代码:

import java.io.IOException;

import java.util.ArrayList;
import java.util.Properties;
import java.util.Arrays;


import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.simpleemail.AWSJavaMailTransport;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailService;
import com.amazonaws.services.simpleemail.AmazonSimpleEmailServiceClient;
import com.amazonaws.services.simpleemail.model.ListVerifiedEmailAddressesResult;
import com.amazonaws.services.simpleemail.model.VerifyEmailAddressRequest;
//import com.amazonaws.services.ec2.model.Region;
import com.amazonaws.services.simpleemail.*;
import com.amazonaws.services.simpleemail.model.*;
import com.amazonaws.regions.*;

public class AmazonSESSample {

static final String FROM = "john@myappsdomain.com";  
static final String TO = "me@mypersonalaccount.com";                                                       // 
static final String BODY = "This email was sent through Amazon SES by using the AWS SDK for Java.";
static final String SUBJECT = "Amazon SES test (AWS SDK for Java)";


public static void main(String[] args) throws IOException {     

    // Construct an object to contain the recipient address.
    Destination destination = new Destination().withToAddresses(new String[]{TO});

    // Create the subject and body of the message.
    Content subject = new Content().withData(SUBJECT);
    Content textBody = new Content().withData(BODY); 
    Body body = new Body().withText(textBody);

    PropertiesCredentials credentials = new PropertiesCredentials(
            AmazonSESSample.class
                    .getResourceAsStream("AwsCredentials.properties"));

    Message message = new Message().withSubject(subject).withBody(body);
    SendEmailRequest request = new SendEmailRequest().withSource(FROM).withDestination(destination).withMessage(message);

    try
    {        

        AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient(credentials);
        Region REGION = Region.getRegion(Regions.EU_WEST_1);
        client.setRegion(REGION);
        client.sendEmail(request);  
        System.out.println("Email sent!");
    }
    catch (Exception ex) 
    {
        System.out.println("The email was not sent.");
        System.out.println("Error message: " + ex.getMessage());
    }
}

}

答案 3 :(得分:2)

另外,请仔细检查以确保您未在​​生产模式下运行和/或确保在沙盒模式下验证您的发送TO地址。

AWS SES沙盒模式的限制:

  • 您只能将邮件发送到Amazon SES邮箱模拟器以及经过验证的电子邮件地址和域。
  • 您只能从经过验证的电子邮件地址和域发送邮件。
  • 每24小时最多可发送200封邮件。
  • 亚马逊SES每秒最多可接受一封来自您帐户的邮件。

http://docs.aws.amazon.com/ses/latest/DeveloperGuide/request-production-access.html