Amazon SES 电子邮件地址未验证

Posted

技术标签:

【中文标题】Amazon SES 电子邮件地址未验证【英文标题】:Amazon SES Email address is not verified 【发布时间】:2014-04-03 10:34:48 【问题描述】:

我从亚马逊服务器开始研究 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);
            

        

【问题讨论】:

【参考方案1】:

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

来自亚马逊:

电子邮件地址未验证—您的帐户在沙盒中,并且一个 的收件人电子邮件地址尚未验证。这有可能 适用于“发件人”、“返回路径”或“发件人”地址。

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

更多信息在这里:http://docs.aws.amazon.com/ses/latest/DeveloperGuide/ses-errors.html

【讨论】:

我有点困惑,想检查一下,如果我已经找到了控制面板 (docs.aws.amazon.com/ses/latest/DeveloperGuide/…)。 我正在尝试将 aws ses 集成到办公管理软件中。用户可以在哪里向他们的客户发送电子邮件。我在这里有一个疑问。即使我已经摆脱了沙盒模式。我的域名也通过了验证。每当用户尝试将邮件发送给他们的客户时,它都会给出错误email address not verified。这是因为未验证用户和客户的电子邮件地址。还是有其他原因。 @YogeshKudikala - 一旦你不再在沙盒模式下运行,收件人就不需要验证他们的电子邮件地址,所以还有其他事情发生;在您向他们发送电子邮件之前要求所有收件人都经过验证是完全不切实际的。【参考方案2】:

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

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

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

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

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

【讨论】:

这太微妙了。差点把它当作一个随机的建议而错过了。他们应该有一个用于“请求生产访问”的选项卡菜单。无论如何,谢谢。 我迷路了,不在沙盒模式下,已验证域,已从地址验证,仍然是“未验证电子邮件”错误。还有更多提示吗?? 这里完全相同的问题@tom 你搞清楚了吗? ...我做了... ..现在要记住)))。 ...这是一个开关,与我的电子邮件提供商有关....或者可能是那些令人讨厌的地区,例如欧盟爱尔兰与美国俄勒冈州....或者也许我将我的 gmail 电子邮件地址的域与我的个人域... ...这绝对是我的两件事的混合... ...我必须设置一个 POP3 服务器,以便我的验证地址与我的验证域相匹配。 @Rohan Deshpande 你确定“如果你没有生产访问权限,你应该确保 From 和 To 地址都经过验证。”?如何向我的注册用户发送电子邮件?我的后端不验证他们的电子邮件。【参考方案3】:

经过数周的折腾,我终于解决了这个问题。因此,如果您不在沙箱中,请验证您的域和您的 FROM 电子邮件地址,请注意默认区域。正如您已经知道(只是猜测),脱离沙盒是特定于区域的(以及经过验证的电子邮件和域)。

我的问题是,在如何使用 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());
    

【讨论】:

【参考方案4】:

还要仔细检查以确保您没有在生产模式下运行和/或确保您的发送收件人地址在沙盒模式下得到验证。

AWS SES 沙盒模式的限制:

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

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

【讨论】:

以上是关于Amazon SES 电子邮件地址未验证的主要内容,如果未能解决你的问题,请参考以下文章

电子邮件地址未验证 (AWS SES)

发送电子邮件时,Amazon SES(沙盒外和域验证)失败

如何从 Amazon SES 检索响应?

AWS-SES 电子邮件地址未经验证。邮箱帐户

Amazon SES 是不是需要存在我的发件人地址

使用 Amazon SES 的 Codeigniter SMTP 电子邮件