/* * Copyright 2014 Baidu, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on * an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the * specific language governing permissions and limitations under the License. */ package com.baidubce.services.ses; import static com.google.common.base.Preconditions.checkNotNull; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import com.baidubce.BceClientException; import com.baidubce.http.HttpMethodName; import com.baidubce.internal.InternalRequest; import com.baidubce.services.ses.model.DeleteVerifiedDomainRequest; import com.baidubce.services.ses.model.DeleteVerifiedEmailRequest; import com.baidubce.services.ses.model.EnableDKIMRequest; import com.baidubce.services.ses.model.GetFailedReasonResponse; import com.baidubce.services.ses.model.GetFeedbackResponse; import com.baidubce.services.ses.model.GetQuotaResponse; import com.baidubce.services.ses.model.GetVerifiedDomainRequest; import com.baidubce.services.ses.model.GetVerifiedDomainResponse; import com.baidubce.services.ses.model.GetVerifiedEmailRequest; import com.baidubce.services.ses.model.GetVerifiedEmailResponse; import com.baidubce.services.ses.model.IsInRecipientBlacklistRequest; import com.baidubce.services.ses.model.IsInRecipientBlacklistResponse; import com.baidubce.services.ses.model.ListRecipientBlacklistResponse; import com.baidubce.services.ses.model.ListVerifiedDomainResponse; import com.baidubce.services.ses.model.ListVerifiedEmailResponse; import com.baidubce.services.ses.model.SendEmailRequest; import com.baidubce.services.ses.model.SendEmailRequest.Mail; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Attachment; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Attachment.FileData; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Destination; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Destination.Addr; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Message; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Source; import com.baidubce.services.ses.model.SendEmailRequest.Mail.Subject; import com.baidubce.services.ses.model.SendEmailResponse; import com.baidubce.services.ses.model.SesRequest; import com.baidubce.services.ses.model.SesResponse; import com.baidubce.services.ses.model.SetFeedbackRequest; import com.baidubce.services.ses.model.SetQuotaRequest; import com.baidubce.services.ses.model.VerifyDKIMRequest; import com.baidubce.services.ses.model.VerifyDKIMResponse; import com.baidubce.services.ses.model.VerifyDomainRequest; import com.baidubce.services.ses.model.VerifyDomainResponse; import com.baidubce.services.ses.model.VerifyEmailRequest; import com.baidubce.util.JsonUtils; /** * <B>The entrance class for all client access to the API of SES(Baidu email Service).</B> * <p> * <B>All of the API method of SES is includes in this class.</B> * <p> */ public class SesClient extends SesClientSupport { /** * Constructs a new <code>SesClient</code> instance with default settings. */ public SesClient() { this(new SesClientConfiguration()); } /** * Constructs a new <code>SesClient</code> instance with the specified configuration. * * @param config the specified configuration, default inherit super class * <code>com.baidubce.BceClientConfiguration</code> */ public SesClient(SesClientConfiguration config) { super(config, SES_HANDLERS); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#verifyEmail(VerifyEmailRequest request) */ public void verifyEmail(String emailAddress) { assertStringNotNullOrEmpty(emailAddress, "object emailAddress should not be null or empty"); verifyEmail(new VerifyEmailRequest().withEmailAddress(emailAddress)); } /** * Verify email address * * @param request The request object includes the URL address to verify, refer to * <code>com.baidubce.services.ses.model.VerifyEmailRequest</code> * * @see com.baidubce.services.ses.model.VerifyEmailRequest */ public void verifyEmail(VerifyEmailRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getEmailAddress(), "object emailAddress should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedEmail", request, HttpMethodName.PUT, request.getEmailAddress()); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#listVerifiedEmail(SesRequest request) */ public ListVerifiedEmailResponse listVerifiedEmail() { return listVerifiedEmail(new SesRequest()); } /** * Get the list of verified email address * * @param request The request object which it's <code>credentials</code> can be override * @return The response object includes the detail of verified email address, refer to * <code>com.baidubce.services.ses.model.ListVerifiedEmailResponse</code> * * @see com.baidubce.services.ses.model.ListVerifiedEmailResponse */ public ListVerifiedEmailResponse listVerifiedEmail(SesRequest request) { InternalRequest internalRequest = this.createRequest("verifiedEmail", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, ListVerifiedEmailResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#getVerifiedEmail(GetVerifiedEmailRequest request) */ public GetVerifiedEmailResponse getVerifiedEmail(String emailAddress) { return getVerifiedEmail(new GetVerifiedEmailRequest().withEmailAddress(emailAddress)); } /** * Get the detail of verified email address * * @param request The request object includes email address to get * @return The response object includes the detail of verified email address, refer to * <code>com.baidubce.services.ses.model.GetVerifiedEmailResponse</code> * * @see com.baidubce.services.ses.model.GetVerifiedEmailRequest * @see com.baidubce.services.ses.model.GetVerifiedEmailResponse */ public GetVerifiedEmailResponse getVerifiedEmail(GetVerifiedEmailRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getEmailAddress(), "object emailAddress should not be null or empty"); checkIsEmail(request.getEmailAddress()); InternalRequest internalRequest = this.createRequest("verifiedEmail", request, HttpMethodName.GET, request.getEmailAddress()); return this.invokeHttpClient(internalRequest, GetVerifiedEmailResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#deleteVerifiedEmail( DeleteVerifiedEmailRequest request) */ public void deleteVerifiedEmail(String emailAddress) { deleteVerifiedEmail(new DeleteVerifiedEmailRequest().withEmailAddress(emailAddress)); } /** * Delete verified email address * * @param request The request object includes the email address to delete, refer to * <code>com.baidubce.services.ses.model.DeleteVerifiedEmailRequest</code> * * @see com.baidubce.services.ses.model.DeleteVerifiedEmailRequest */ public void deleteVerifiedEmail(DeleteVerifiedEmailRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getEmailAddress(), "object emailAddress should not be null or empty"); checkIsEmail(request.getEmailAddress()); InternalRequest internalRequest = this.createRequest("verifiedEmail", request, HttpMethodName.DELETE, request.getEmailAddress()); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#verifyDomain( VerifyDomainRequest request) */ public VerifyDomainResponse verifyDomain(String domainName) { return verifyDomain(new VerifyDomainRequest().withDomainName(domainName)); } /** * Verify the domain * <p> * When this API is called successfully, it will return a token which is used to verify domain. You should put the * token into DSN setting as a TXT record, then SES can finish verifying automatically. * * @param request The request object which includes the domain to verify * * @see com.baidubce.services.ses.model.VerifyDomainRequest */ public VerifyDomainResponse verifyDomain(VerifyDomainRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.PUT, request.getDomainName()); return this.invokeHttpClient(internalRequest, VerifyDomainResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#verifyDKIM( VerifyDKIMRequest request) */ public VerifyDKIMResponse verifyDKIM(String domainName) { return verifyDKIM(new VerifyDKIMRequest().withDomainName(domainName)); } /** * Verify the DKIM * <p> * When this API is called successfully, it will return a group of tokens,you should use this tokens to create DSN * CNAME records, then SES can finish verifying automatically. * * @param request The request object which includes the DKIM to verify * * @return The response object includes a group of tokens * * @see com.baidubce.services.ses.model.VerifyDKIMRequest * @see com.baidubce.services.ses.model.VerifyDKIMResponse */ public VerifyDKIMResponse verifyDKIM(VerifyDKIMRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.PUT, request.getDomainName()); internalRequest.addParameter("dkim", "true"); return this.invokeHttpClient(internalRequest, VerifyDKIMResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#disableDKIM(EnableDKIMRequest request) */ public void disableDKIM(String domainName) { disableDKIM(new EnableDKIMRequest().withDomainName(domainName)); } /** * Disable the DKIM * <P> * Disable or enable DKIM the specifical email or domain, if enabled then SES will add DKIM for all the email about * the email and domain. * * @param request The request object which includes domain to disable * * @see com.baidubce.services.ses.model.EnableDKIMRequest */ public void disableDKIM(EnableDKIMRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.PUT, request.getDomainName()); internalRequest.addParameter("enable", "disableDkim"); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#enableDKIM(EnableDKIMRequest request) */ public void enableDKIM(String domainName) { enableDKIM(new EnableDKIMRequest().withDomainName(domainName)); } /** * Enable the DKIM * <P> * Disable or enable DKIM the specifical email or domain, if enabled then SES will add DKIM for all the email about * the email and domain. * * @param request The request object which includes domain to enable */ public void enableDKIM(EnableDKIMRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.PUT, request.getDomainName()); internalRequest.addParameter("enable", "enableDkim"); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#listVerifiedDomain(SesRequest request) */ public ListVerifiedDomainResponse listVerifiedDomain() { return listVerifiedDomain(new SesRequest()); } /** * Get the list of verified domain * * @param request The request object which it's <code>credentials</code> can be override * @return The response object which includes the detail of verified domain * * @see com.baidubce.services.ses.model.ListVerifiedDomainResponse */ public ListVerifiedDomainResponse listVerifiedDomain(SesRequest request) { InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, ListVerifiedDomainResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#getVerifiedDomain( GetVerifiedDomainRequest request) */ public GetVerifiedDomainResponse getVerifiedDomain(String domainName) { return getVerifiedDomain(new GetVerifiedDomainRequest().withDomainName(domainName)); } /** * Get the detail of specifical verified domain * * @param request The request object which includes the domain to get * @return The response object which includes the detail of verified domain * * @see com.baidubce.services.ses.model.GetVerifiedDomainResponse */ public GetVerifiedDomainResponse getVerifiedDomain(GetVerifiedDomainRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.GET, request.getDomainName()); return this.invokeHttpClient(internalRequest, GetVerifiedDomainResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#deleteVerifiedDomain( DeleteVerifiedDomainRequest request) */ public void deleteVerifiedDomain(String domainName) { deleteVerifiedDomain(new DeleteVerifiedDomainRequest().withDomainName(domainName)); } /** * Delete the domain * * @param request The request object which includes the domain to delete * * @see com.baidubce.services.ses.model.DeleteVerifiedDomainRequest */ public void deleteVerifiedDomain(DeleteVerifiedDomainRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getDomainName(), "object domainName should not be null or empty"); InternalRequest internalRequest = this.createRequest("verifiedDomain", request, HttpMethodName.DELETE, request.getDomainName()); this.invokeHttpClient(internalRequest, SesResponse.class); } /** * Send email. * <p> * Simple to send email without display name, all optional parameters use system default value. * * @param from The sender, which is required * @param toAddr The receive, which is required * @param subject The title of the email, which is required * @param body The content of the email, which is required * @param attachmentFiles The array of attachment file. If you need send attachment then set it, it's optional * parameters * * @see com.baidubce.services.ses.SesClient#sendEmail(com.baidubce.services.ses.model.SendEmailRequest request) */ public SendEmailResponse sendEmail(String from, String[] toAddr, String subject, String body, File...attachmentFiles) { return sendEmail(from, "", toAddr, subject, body, attachmentFiles); } /** * Send email. * <p> * Simple to send email, all optional parameters use system default value. * * @param from The sender, which is required * @param displayName The display name of sender, which can be custom by the users themselves * @param toAddr The receive, which is required * @param subject The title of the email, which is required * @param body The content of the email, which is required * @param attachmentFiles The array of attachment file. If you need send attachment then set it, it's optional * parameters * * @see com.baidubce.services.ses.SesClient#sendEmail(com.baidubce.services.ses.model.SendEmailRequest request) */ public SendEmailResponse sendEmail(String from, String displayName, String[] toAddr, String subject, String body, File...attachmentFiles) { SendEmailRequest request = buildSendEmailRequest(from, from, from, toAddr, new String[] { "" }, new String[] { "" }, subject, body, 1, 1); request = fillDisplayName(request, displayName); request = fillAttachment(request, attachmentFiles); return sendEmail(request); } /** * Send email. * <p> * Simple to send email, partly optional parameters use system default value. * * @param from The sender, which is required * @param displayName The display name of sender, which can be custom by the users themselves * @param toAddr The receive, which is required * @param ccAddr The CC, which is optional * @param bccAddr The BCC which is optional * @param subject The title of the email, which is required * @param body The content of the email, which is required * @param attachmentFiles The array of attachment file. If you need send attachment then set it, it's optional * parameters * * @see com.baidubce.services.ses.SesClient#sendEmail(com.baidubce.services.ses.model.SendEmailRequest request) */ public SendEmailResponse sendEmail(String from, String displayName, String[] toAddr, String[] ccAddr, String[] bccAddr, String subject, String body, File...attachmentFiles) { SendEmailRequest request = buildSendEmailRequest(from, from, from, toAddr, ccAddr, bccAddr, subject, body, 1, 1); request = fillDisplayName(request, displayName); request = fillAttachment(request, attachmentFiles); return sendEmail(request); } /** * Send email. * <p> * Full to send email, all optional parameters need you set. * * @param from The sender, which is required * @param displayName The display name of sender, which can be custom by the users themselves * @param returnPath Optional parameters * @param replyTo Optional parameters * @param toAddr The receive, which is required * @param ccAddr The CC, which is optional * @param bccAddr The BCC which is optional * @param subject The title of the email, which is required * @param body The content of the email, which is required * @param priority The priority of the email, which is Optional * @param charset The charset of the email, which is Optional * @param attachmentFiles The array of attachment file. If you need send attachment then set it, it's optional * parameters * * @see com.baidubce.services.ses.SesClient#sendEmail(com.baidubce.services.ses.model.SendEmailRequest request) */ public SendEmailResponse sendEmail(String from, String displayName, String returnPath, String replyTo, String[] toAddr, String[] ccAddr, String[] bccAddr, String subject, String body, int priority, int charset, File...attachmentFiles) { SendEmailRequest request = buildSendEmailRequest(from, returnPath, replyTo, toAddr, ccAddr, bccAddr, subject, body, priority, charset); request = fillDisplayName(request, displayName); request = fillAttachment(request, attachmentFiles); return sendEmail(request); } /** * Send email * <p> * This method allow you to construct request object by yourself. * * @param request The request object which includes the parameters of sending mail, you can see detail from class * <code>com.baidubce.services.ses.model.SendEmailRequest</code> * * @see com.baidubce.services.ses.model.SendEmailRequest */ public SendEmailResponse sendEmail(SendEmailRequest request) { checkNotNull(request, "object request should not be null."); checkNotNull(request.getMail(), "object mail of request should not be null."); // validate source checkNotNull(request.getMail().getSource(), "object source of request should not be null."); assertStringNotNullOrEmpty(request.getMail().getSource().getFrom(), "from should not be null or empty."); checkIsEmail(request.getMail().getSource().getFrom()); // validate subject checkNotNull(request.getMail().getSubject(), "object subject of request should not be null."); assertStringNotNullOrEmpty(request.getMail().getSubject().getData(), "subject should not be null or empty."); if (request.getMail().getSubject().getCharset() != null && !Arrays.asList(new Integer[] { 0, 1, 2, 3, 4 }) .contains(request.getMail().getSubject().getCharset())) { throw new IllegalArgumentException("illegal charset."); } // validate body checkNotNull(request.getMail().getMessage(), "object message of request should not be null."); checkNotNull(request.getMail().getMessage().getHtml(), "object html of request should not be null."); assertStringNotNullOrEmpty(request.getMail().getMessage().getHtml().getData(), "body should not be null or empty."); if (request.getMail().getMessage().getHtml().getCharset() != null && !Arrays.asList(new Integer[] { 0, 1, 2, 3, 4 }).contains( request.getMail().getMessage().getHtml().getCharset())) { throw new IllegalArgumentException("illegal charset."); } // validate priority if (request.getMail().getPriority() != null && (request.getMail().getPriority() <= -1 || request.getMail().getPriority() >= 100)) { throw new IllegalArgumentException("illegal priority."); } // validate destination checkNotNull(request.getMail().getDestination(), "object destination of request should not be null."); assertListNotNullOrEmpty(request.getMail().getDestination().getToAddr(), "toAddr should not be null or empty."); for (Addr toAddr : request.getMail().getDestination().getToAddr()) { checkNotNull(toAddr, "object toAddr of request should not be null."); checkIsEmail(toAddr.getAddr()); } InternalRequest internalRequest = this.createRequest("email", request, HttpMethodName.POST); // fill in the request payload internalRequest = fillRequestPayload(internalRequest, JsonUtils.toJsonString(request)); // send email return this.invokeHttpClient(internalRequest, SendEmailResponse.class); } /** * Set feedback * * @param request The request object which includes the feedback information to set * * @see com.baidubce.services.ses.model.SetFeedbackRequest */ public void setFeedback(SetFeedbackRequest request) { checkNotNull(request, "object request should not be null."); if (request.getEmail() != null && request.getEmail().trim().length() > 0) { checkIsEmail(request.getEmail()); } if (request.getType() == null) { request.setType(1); } if (!Arrays.asList(new Integer[] { 1, 2, 3 }).contains(request.getType())) { throw new IllegalArgumentException("illegal type."); } InternalRequest internalRequest = this.createRequest("feedback", request, HttpMethodName.PUT); // fill in the request payload internalRequest = fillRequestPayload(internalRequest, JsonUtils.toJsonString(request)); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#getFeedback(SesRequest request) */ public GetFeedbackResponse getFeedback() { return getFeedback(new SesRequest()); } /** * Get feedback * * @param request The request object which it's <code>credentials</code> can be override * @return The response object which includes the feedback information * * @see com.baidubce.services.ses.model.GetFeedbackResponse */ public GetFeedbackResponse getFeedback(SesRequest request) { InternalRequest internalRequest = this.createRequest("feedback", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, GetFeedbackResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#getQuota(SesRequest request) */ public GetQuotaResponse getQuota() { return getQuota(new SesRequest()); } /** * Get quota * * @param request The request object which it's <code>credentials</code> can be override * @return The response object which includes the detail of quota * * @see com.baidubce.services.ses.model.GetQuotaResponse */ public GetQuotaResponse getQuota(SesRequest request) { InternalRequest internalRequest = this.createRequest("quota", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, GetQuotaResponse.class); } /** * Set quota * * @param request The request object which includes the information of quota to set * * @see com.baidubce.services.ses.model.SetQuotaRequest */ public void setQuota(SetQuotaRequest request) { checkNotNull(request, "object request should not be null."); checkIsInteger(request.getMaxPerDay()); checkIsInteger(request.getMaxPerSecond()); InternalRequest internalRequest = this.createRequest("quota", request, HttpMethodName.PUT); // fill in the request payload internalRequest = fillRequestPayload(internalRequest, JsonUtils.toJsonString(request)); this.invokeHttpClient(internalRequest, SesResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#listRecipientBlacklist(SesRequest request) */ public ListRecipientBlacklistResponse listRecipientBlacklist() { return listRecipientBlacklist(new SesRequest()); } /** * Get the list of blacklist * * @param request The request object which it's <code>credentials</code> can be override * @return The response which includes the detail of blacklist * * @see com.baidubce.services.ses.model.ListRecipientBlacklistResponse */ public ListRecipientBlacklistResponse listRecipientBlacklist(SesRequest request) { InternalRequest internalRequest = this.createRequest("recipientBlacklist", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, ListRecipientBlacklistResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#isInRecipientBlacklist( IsInRecipientBlacklistRequest request) */ public IsInRecipientBlacklistResponse isInRecipientBlacklist(String emailAddress) { return isInRecipientBlacklist(new IsInRecipientBlacklistRequest().withEmailAddress(emailAddress)); } /** * Query the special receiver is in blacklist or not * * @param request The request object which includes the special receiver * @return The response result which includes the result of receiver in blacklist or not * * @see com.baidubce.services.ses.model.IsInRecipientBlacklistResponse */ public IsInRecipientBlacklistResponse isInRecipientBlacklist(IsInRecipientBlacklistRequest request) { checkNotNull(request, "object request should not be null."); assertStringNotNullOrEmpty(request.getEmailAddress(), "object emailAddress should not be null or empty"); InternalRequest internalRequest = this.createRequest("recipientBlacklist", request, HttpMethodName.GET, request.getEmailAddress()); return this.invokeHttpClient(internalRequest, IsInRecipientBlacklistResponse.class); } /* * (non-Javadoc) * * @see com.baidubce.services.ses.SesClient#getFailedReason(SesRequest request) */ public GetFailedReasonResponse getFailedReason() { return getFailedReason(new SesRequest()); } /** * Query the failed reason * * @param request The request object which it's <code>credentials</code> can be override * @return The response which includes the detail of failed reason * * @see com.baidubce.services.ses.model.GetFailedReasonResponse */ public GetFailedReasonResponse getFailedReason(SesRequest request) { InternalRequest internalRequest = this.createRequest("failedReason", request, HttpMethodName.GET); return this.invokeHttpClient(internalRequest, GetFailedReasonResponse.class); } private SendEmailRequest fillAttachment(SendEmailRequest request, File...attachmentFiles) { if (attachmentFiles != null && attachmentFiles.length > 0) { // fetch attachments from Files for (File file : attachmentFiles) { try { InputStream in = new FileInputStream(file); String filedata = ""; try { filedata = getBASE64EncoderStrFromInputStream(in); } catch (IOException e) { logger.error("fetch attachment filedata failure.", e); throw new BceClientException("fetch attachment filedata failure.", e); } request = fillAttachment(request, file.getName(), filedata); } catch (FileNotFoundException e) { logger.error("attachment not found.", e); throw new BceClientException("attachment not found.", e); } } } return request; } private SendEmailRequest fillAttachment(SendEmailRequest request, String filename, String filedata) { Mail mail = request.getMail(); Attachment attachment = new Attachment(); attachment.setFiledata(new FileData().withData(filedata)); attachment.setFilename(filename); List<Attachment> attachments = mail.getAttachments(); if (attachments == null) { attachments = new ArrayList<SendEmailRequest.Mail.Attachment>(); } attachments.add(attachment); mail.setAttachments(attachments); return request; } private SendEmailRequest buildSendEmailRequest(String from, String returnPath, String replyTo, String[] toAddr, String[] ccAddr, String[] bccAddr, String subject, String body, int priority, int charset) { // fill with source object Source source = new Source(from, returnPath, replyTo); // fill with destination object Destination destination = new Destination(Addr.asAddrList(toAddr), Addr.asAddrList(ccAddr), Addr.asAddrList(bccAddr)); // fill with message object Message message = new Message().withHtml(new Subject().withData(body).withCharset(charset)); // fill with mail object Mail mail = new Mail(source, destination, new Subject().withData(subject).withCharset(charset), priority, message); // fill with request object SendEmailRequest request = new SendEmailRequest(); request.setMail(mail); return request; } private SendEmailRequest fillDisplayName(SendEmailRequest request, String displayName) { if (request != null && request.getMail() != null && request.getMail().getSource() != null) { request.getMail().getSource().setDisplayName(displayName); } return request; } }