无法使用Java中的Amazon SES发送电子邮件 [英] Not able to send Email using Amazon SES in Java

查看:92
本文介绍了无法使用Java中的Amazon SES发送电子邮件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用下面提到的代码发送电子邮件.

I am using below mentioned code to send Email.

public static void send(String email, String subject, String body) {
    try {
        fromEmail = "abc.@xyz.com";
        Content subjectContent = new Content(subject);

        Destination destination = new Destination().withToAddresses(new String[] { "cde@gmail.com" });

        Content htmlContent = new Content().withData("<h1>Hello - I hope you're having a good day.</h1>");
        Body msgBody = new Body().withHtml(htmlContent);

        // Create a message with the specified subject and body.
        Message message = new Message().withSubject(subjectContent).withBody(msgBody);

        SendEmailRequest request = new SendEmailRequest()
                                           .withSource(fromEmail)
                                           .withDestination(destination)
                                           .withMessage(message);

        SendRawEmailRequest sendRawEmailRequest = new SendRawEmailRequest()
                                                          .withSource(fromEmail)
                                                          .withDestinations(destination.getBccAddresses())
                                                          .withRawMessage(new RawMessage());
        AWSCredentials credentials = new BasicAWSCredentials(userName,password);

        AmazonSimpleEmailServiceClient sesClient = new AmazonSimpleEmailServiceClient(credentials);
        // ListVerifiedEmailAddressesResult verifiedEmails =
        // sesClient.listVerifiedEmailAddresses();
        SendRawEmailResult result = sesClient.sendRawEmail(sendRawEmailRequest);
        System.out.println(result + "Email sent");
    } catch (Exception e) {
        logger.error("Caught a MessagingException, which means that there was a "
                + "problem sending your message to Amazon's E-mail Service check the "
                + "stack trace for more information.{}" + e.getMessage());
        e.printStackTrace();
    }
}

我遇到以下提到的错误.

I am getting below mentioned error.

com.amazonaws.AmazonServiceException:我们计算出的请求签名与您提供的签名不匹配.检查您的AWS Secret Access密钥和签名方法.有关详细信息,请查阅服务文档. 此请求的规范字符串应为 '邮政 /

com.amazonaws.AmazonServiceException: The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details. The Canonical String for this request should have been 'POST /

host:email.us-east-1.amazonaws.com 用户代理:aws-sdk-java/1.9.0 Linux/3.19.0-25-通用Java_HotSpot(TM)_64-Bit_Server_VM/25.66-b17/1.8.0_66 x-amz-date:20160223T062544Z

host:email.us-east-1.amazonaws.com user-agent:aws-sdk-java/1.9.0 Linux/3.19.0-25-generic Java_HotSpot(TM)_64-Bit_Server_VM/25.66-b17/1.8.0_66 x-amz-date:20160223T062544Z

host; user-agent; x-amz-date 4c1f25e3dcf887bd49756ddd01c5e923cf49f2affa73adfc7059d00140032edf'

host;user-agent;x-amz-date 4c1f25e3dcf887bd49756ddd01c5e923cf49f2affa73adfc7059d00140032edf'

(服务:AmazonSimpleEmailService;状态代码:403;错误代码:SignatureDoesNotMatch;

(Service: AmazonSimpleEmailService; Status Code: 403; Error Code: SignatureDoesNotMatch;

推荐答案

这是使用Amazon SES发送电子邮件的示例代码. 最初,当您创建Amazon SES帐户时,该帐户将处于沙盒模式,该模式仅允许您发送200封电子邮件.要将其切换到生产模式,您需要请求"以扩展电子邮件限制.请仔细阅读文档.

This is a Sample code to send Email using Amazon SES. Initially when you create an Amazon SES account, the account will be in Sandbox mode which allows you to send only 200 emails. For Switching this to production mode, you need to "Request" for expanding email limit. Please go through the documentation.

先决条件: 您需要激活Amazon SES帐户. 如果您当前处于沙盒模式,请验证电子邮件地址(去往和来自)或域. 在导航栏中的"SMTP设置"下,您可以生成SMTP凭据. 这将包括smtp用户名和密码.您也可以下载包含此详细信息的csv文件.

Pre requisites: You need to have Amazon SES account activated. verify email addressses (to and from) or domain if you are currently in Sandbox mode. Under "SMTP settings" in Navigation bar, you can generate your SMTP credentials. This will include a smtp username and password. You can download a csv file containing this details as well.

使用Java发送电子邮件:

sending email using Java :

public class AmazonSESExample {


static final String FROM = "your from email address";
static final String FROMNAME = "From name";

// Replace recipient@example.com with a "To" address. If your account
// is still in the sandbox, this address must be verified.
static final String TO = "receiver email address";

// Replace smtp_username with your Amazon SES SMTP user name.
static final String SMTP_USERNAME = "username generated under smtp settings";

// Replace smtp_password with your Amazon SES SMTP password.
static final String SMTP_PASSWORD = "password generated under smtp settings";

// Amazon SES SMTP host name. This example uses the US West (Oregon) region.
// See https://docs.aws.amazon.com/ses/latest/DeveloperGuide/regions.html#region-endpoints
// for more information.
static final String HOST = "email-smtp.us-east-1.amazonaws.com";

// The port you will connect to on the Amazon SES SMTP endpoint.
static final int PORT = 25;

static final String SUBJECT = "Amazon SES test (SMTP interface accessed using Java)";

static final String BODY = String.join(
        System.getProperty("line.separator"),
        "<h1>Amazon SES SMTP Email Test</h1>",
        "<p>This email was sent with Amazon SES using the ",
        "<a href='https://github.com/javaee/javamail'>Javamail Package</a>",
        " for <a href='https://www.java.com'>Java</a>."
);

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

    // Create a Properties object to contain connection configuration information.
    Properties props = System.getProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.port", PORT);
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.smtp.auth", "true");

    // Create a Session object to represent a mail session with the specified properties.
    Session session = Session.getDefaultInstance(props);

    // Create a message with the specified information.
    MimeMessage msg = new MimeMessage(session);
    msg.setFrom(new InternetAddress(FROM, FROMNAME));
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(TO));
    msg.setSubject(SUBJECT);
    msg.setContent(BODY, "text/html");


    // Create a transport.
    Transport transport = session.getTransport();

    // Send the message.
    try {
        System.out.println("Sending...");

        // Connect to Amazon SES using the SMTP username and password you specified above.
        transport.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD);

        // Send the email.
        transport.sendMessage(msg, msg.getAllRecipients());
        System.out.println("Email sent!");
    } catch (Exception ex) {
        System.out.println("The email was not sent.");
        System.out.println("Error message: " + ex.getMessage());
    } finally {
        // Close and terminate the connection.
        transport.close();
    }
}

}

这篇关于无法使用Java中的Amazon SES发送电子邮件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆