亚马逊SES电子邮件地址未经验证。

29

我正在学习关于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个回答

58

你的代码表明你正在尝试通过us-west-2发送。您是否已请求在该地区生产访问权限,并且您的From地址已验证?Amazon SES的生产访问权限与地区无关,您需要为每个地区单独请求它。了解更多信息

如果您没有生产访问权限,请确保FromTo地址都已验证。Amazon SES控制台将列出us-west-2已验证电子邮件地址已验证域名。Amazon SES博客提供了关于如何在us-west-2中设置的额外指南

快速判断是否没有生产访问权限:登录Amazon SES控制台仪表板,它将在页面顶部显示带有以下文本的蓝色横幅,并显示一个请求生产访问权限的按钮:

您的Amazon SES帐户在US West (Oregon)地区具有“沙盒”访问权限。使用沙盒访问权限,您只能向Amazon SES邮箱模拟器和已验证的电子邮件地址或域发送电子邮件。了解更多信息。

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


这实在是太微妙了。几乎以为它只是一个随机的建议而错过了它。他们应该有一个“请求生产访问”的选项卡菜单。无论如何,谢谢。 - roopunk
5
我迷失了方向,不是沙盒模式,已验证域名、已验证发件地址,仍然遇到“未验证电子邮件”的错误提示。还有其他提示吗? - tom
@tom,我遇到了完全相同的问题。 你解决了吗? - Sharry
我记得...现在想起来了))). ...出了点问题,可能是我的电子邮件提供商的原因...或者可能是那些讨厌的地区,比如欧盟爱尔兰和美国俄勒冈州之间的差异...或者可能是我混淆了我的gmail电子邮件地址的域名和我的个人域名...肯定是我自己搞错了两件事情...我一定要设置一个POP3服务器,以便我的验证发件人地址与我的验证域名匹配。 - tom
@Rohan Deshpande 你确定这句话吗:“如果您没有生产访问权限,您应该确保发件人和收件人地址都经过验证。”?我该如何向我的注册用户发送电子邮件?我的后端不验证他们的电子邮件。 - Ricardo

6
你是否仍在“沙箱”模式下运行?如果是,你只能发送电子邮件到已经预先验证过的地址。
来自亚马逊的提示: 未验证的电子邮件地址 - 您的账户处于沙箱模式下,其中一个收件人的电子邮件地址未通过验证。这可能适用于“发件人”、“Return-Path”或“From”地址。 如果您没有请求 Amazon SES 的生产访问权限,则必须验证每个收件人的电子邮件地址(除了 Amazon SES 邮箱模拟器提供的收件人)。您还必须验证您自己的“From”地址。有关更多信息,请参阅Amazon SES中验证电子邮件地址和域名以及测试Amazon SES电子邮件发送。
更多信息请查看:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/ses-errors.html

1
我感到有些困惑,不知道如何检查我已经完成的控制面板查找(http://docs.aws.amazon.com/ses/latest/DeveloperGuide/verify-email-addresses.html)。 - leedream
1
我正在尝试将AWS SES集成到办公管理软件中,以便用户可以向其客户发送电子邮件。但我有一个疑问:即使我已经退出沙盒模式并且我的域名也已验证,每当用户尝试向其客户发送邮件时,都会出现“电子邮件地址未验证”的错误。这是因为用户和客户的电子邮件地址没有验证,还是有其他原因? - beingyogi
@YogeshKudikala - 一旦您不再运行在沙盒模式下,收件人无需验证其电子邮件地址,因此还有其他问题;在您发送电子邮件之前要求所有收件人进行验证是完全不切实际的。 - E.J. Brennan

3
同时,请确保您未处于生产模式,并且确保您的发送地址在沙盒模式中已验证。
AWS SES沙盒模式的限制:
- 您只能将邮件发送到Amazon SES邮箱模拟器和已验证的电子邮件地址和域名。 - 您只能从经过验证的电子邮件地址和域名发送邮件。 - 您每24小时最多只能发送200封电子邮件。 - Amazon SES每秒最多只能接受来自您账户的一条信息。 http://docs.aws.amazon.com/ses/latest/DeveloperGuide/request-production-access.html

3
经过几周的混乱之后,我终于解决了这个问题。所以,如果你已经走出沙盒,验证了你的域名和发件人电子邮件地址,请注意默认区域。正如你已经知道的一样(只是猜测),走出沙盒是特定于区域的(以及验证的电子邮件和域)。
我的问题是,在使用AWS SDK Java发送电子邮件的所有排列组合中,我无法指定显式区域,而我的美国帐户默认将区域设置为美国西部。我进行所有验证的区域(并且已经走出沙盒)是欧洲西部(email-smtp.eu-west-1.amazonaws.com)。此外,请不要忘记使用适当的Amazon SES API凭据,这些凭据是AWS访问密钥。在我的情况下(如下所示),这些密钥在一个文件中,该文件在类路径中具有两个键值对:
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());
    }
}

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接