AWS SES 在 spring boot java 中实现而不使用凭证
AWS SES implement In spring boot java without using credential
我是一名后端开发人员(Spring 启动),DevOps 团队希望我实施 AWS 的 SES 和 SNS 服务,但不使用凭据,因为它们在 aws 中存储了与 IAM 角色相同的凭据,所以他们想让我传递代码中唯一的主机并将凭据部分留空,它将向特定收件人发送电子邮件。(根据他们的关注)
正如他们所说,我确实在 java 中尝试使用空凭据,但没有成功,它说身份验证无效
我不知道怎么做,但他们确实用 PHP SDK 实现了同样的事情,他们将凭据部分留空,它与 IAM 角色凭据一起工作得很好
这是我的代码,其中我将凭据部分留空
private boolean sendAwsMail() {
String result = null;
boolean flag = true;
try {
Properties props = System.getProperties();
props.put("mail.transport.protocol", varMap.get("protocol"));
props.put("mail.smtp.port", Integer.parseInt(varMap.get("port")));
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(varMap.get("destinationMailId")));
msg.setSubject(varMap.get("subject"));
msg.setContent(varMap.get("content"), "text/html");
Transport transport = session.getTransport();
transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");
transport.sendMessage(msg, msg.getAllRecipients());
AppLogger.writeLog("INFO", "MAIL_SEND", "send_mail", this.getClass().getName(),
Thread.currentThread().getStackTrace()[1].getMethodName(),
"toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null,
null, "");
result = varMap.get("content");
transport.close();
} catch (Exception ex) {
AppLogger.writeLog("WARNING", "Issue_In_Connection", "send_mail", this.getClass().getName(),
Thread.currentThread().getStackTrace()[1].getMethodName(),
"toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null, ex,
"");
flag = false;
result = ex.toString();
} finally {
this.flag = flag;
dumpList.add(new MessageDataDump(varMap.get("destinationMailId"), result, varMap, "AWS-EMAIL"));
return flag;
}
}
我替换了msg.setFrom(new InternetAddress(varMap.get("fromEmail"), varMap.get("fromName")));
msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));
并且还在 transport.connect(varMap.get("HOST"), varMap.get("SMTP_USERNAME"), varMap.get("SMTP_PASSWORD"));
的 credentail 部分替换为 transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");
请指出实现此目标的正确方法。
提前致谢
当您执行代码时,AWS SDK 将使用凭证链查找您的凭证:
https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html
SDK 将沿此链向下工作,尝试查找凭据。对于在本地计算机上工作的开发人员,您的凭据通常通过 a) aws 凭据文件或 b) 将 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
设置为环境变量来获取。
当您在服务器上 运行 您的代码时,情况会略有不同。在这种情况下,凭证将应用于实例角色。基本上,不需要传递任何凭据,因为代码在 AWS 服务器上,AWS 知道它有什么权限,通过 IAM 实例角色设置。
简而言之,您在本地时需要传递凭据,但请放心,如果您的同事正确设置了服务器,则您在服务器上时不需要传递凭据.
编辑:您将需要使用 Java SDK 来访问凭证链
https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-sdk-java.html
我是一名后端开发人员(Spring 启动),DevOps 团队希望我实施 AWS 的 SES 和 SNS 服务,但不使用凭据,因为它们在 aws 中存储了与 IAM 角色相同的凭据,所以他们想让我传递代码中唯一的主机并将凭据部分留空,它将向特定收件人发送电子邮件。(根据他们的关注)
正如他们所说,我确实在 java 中尝试使用空凭据,但没有成功,它说身份验证无效
我不知道怎么做,但他们确实用 PHP SDK 实现了同样的事情,他们将凭据部分留空,它与 IAM 角色凭据一起工作得很好
这是我的代码,其中我将凭据部分留空
private boolean sendAwsMail() {
String result = null;
boolean flag = true;
try {
Properties props = System.getProperties();
props.put("mail.transport.protocol", varMap.get("protocol"));
props.put("mail.smtp.port", Integer.parseInt(varMap.get("port")));
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(varMap.get("destinationMailId")));
msg.setSubject(varMap.get("subject"));
msg.setContent(varMap.get("content"), "text/html");
Transport transport = session.getTransport();
transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");
transport.sendMessage(msg, msg.getAllRecipients());
AppLogger.writeLog("INFO", "MAIL_SEND", "send_mail", this.getClass().getName(),
Thread.currentThread().getStackTrace()[1].getMethodName(),
"toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null,
null, "");
result = varMap.get("content");
transport.close();
} catch (Exception ex) {
AppLogger.writeLog("WARNING", "Issue_In_Connection", "send_mail", this.getClass().getName(),
Thread.currentThread().getStackTrace()[1].getMethodName(),
"toMailId:" + varMap.get("destinationMailId"), "subject:" + varMap.get("subject"), "", "", null, ex,
"");
flag = false;
result = ex.toString();
} finally {
this.flag = flag;
dumpList.add(new MessageDataDump(varMap.get("destinationMailId"), result, varMap, "AWS-EMAIL"));
return flag;
}
}
我替换了msg.setFrom(new InternetAddress(varMap.get("fromEmail"), varMap.get("fromName")));
msg.setFrom(new InternetAddress("no-reply@lottoweaver.com", "lottoweaver.com"));
并且还在 transport.connect(varMap.get("HOST"), varMap.get("SMTP_USERNAME"), varMap.get("SMTP_PASSWORD"));
的 credentail 部分替换为 transport.connect("email-smtp.us-west-2.amazonaws.com", "", "");
请指出实现此目标的正确方法。
提前致谢
当您执行代码时,AWS SDK 将使用凭证链查找您的凭证: https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/credentials.html
SDK 将沿此链向下工作,尝试查找凭据。对于在本地计算机上工作的开发人员,您的凭据通常通过 a) aws 凭据文件或 b) 将 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
设置为环境变量来获取。
当您在服务器上 运行 您的代码时,情况会略有不同。在这种情况下,凭证将应用于实例角色。基本上,不需要传递任何凭据,因为代码在 AWS 服务器上,AWS 知道它有什么权限,通过 IAM 实例角色设置。
简而言之,您在本地时需要传递凭据,但请放心,如果您的同事正确设置了服务器,则您在服务器上时不需要传递凭据.
编辑:您将需要使用 Java SDK 来访问凭证链 https://docs.aws.amazon.com/ses/latest/DeveloperGuide/send-using-sdk-java.html