Java SpringBoot集成阿里云短信与邮件服务

1.pom.xml导入jar包

        <!--阿里云短信 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-core</artifactId>
            <version>4.1.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>commons-codec</artifactId>
                    <groupId>commons-codec</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>activation</artifactId>
                    <groupId>javax.activation</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
            <version>1.1.0</version>
        </dependency>
        <!--阿里云邮件 -->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>aliyun-java-sdk-dm</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>

2.推送方法工具类封装

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dm.model.v20151123.SingleSendMailRequest;
import com.aliyuncs.dm.model.v20151123.SingleSendMailResponse;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.jointech.pushserver.constants.AlibabaConstants;
import lombok.extern.slf4j.Slf4j;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;

/**
 * 阿里服务方法封装
 * @author lenny
 */
@Slf4j
public class AlibabaUtil {
    /**
     * 邮件发送
     * @param toAddress 接收邮箱地址
     * @param fromAlias 发送邮箱名称
     * @param htmlBody 邮箱内容消息体
     * @param subject 邮箱主题
     * @return
     * @throws ClientException
     */
    public static SingleSendMailResponse sendEmail(String toAddress, String fromAlias, String htmlBody, String subject) {
        try {
            if (fromAlias == null || fromAlias.length() <= 0) {
                fromAlias = AlibabaConstants.ALI_EMAIL_CN_FROM_ALIAS;
            }
            IClientProfile profile = DefaultProfile.getProfile(AlibabaConstants.ALI_EMAIL_REGION_ID, AlibabaConstants.ALI_EMAIL_ACCESS_KEY_ID, AlibabaConstants.ALI_EMAIL_SECRET);
            IAcsClient client = new DefaultAcsClient(profile);
            SingleSendMailRequest request = new SingleSendMailRequest();
            request.setAccountName(AlibabaConstants.ALI_EMAIL_ACCOUNT_NAME);
            request.setFromAlias(fromAlias);
            request.setAddressType(1);
            request.setToAddress(toAddress);
            request.setReplyToAddress(true);
            //可以给多个收件人发送邮件,收件人之间用逗号分开
            request.setSubject(subject);
            //如果采用byte[].toString的方式的话请确保最终转换成utf-8的格式再放入htmlbody和textbody,若编码不一致则会被当成垃圾邮件。
            //注意:文本邮件的大小限制为3M,过大的文本会导致连接超时或413错误
            request.setHtmlBody(htmlBody);
            //若textBody、htmlBody或content的大小不确定,建议采用POST方式提交,避免出现uri is not valid异常
            request.setMethod(MethodType.POST);
            SingleSendMailResponse sendMailResponse = client.getAcsResponse(request);
            log.info("邮件发送失败:给邮箱为{},发送的内容为{},主题为{}", toAddress, htmlBody, subject);
            return sendMailResponse;
        }catch (Exception e) {
            log.error(e.getMessage());
            return null;
        }
    }

    /**
     * 给指定的手机号发送短信
     * @param phone 电话号码
     * @param signName 签名
     * @param templateCode 模板编码
     * @param content 发送内容
     * @return
     * @throws ClientException
     */
    public static SendSmsResponse sendSms(String phone, String signName, String templateCode, String content) {
        try {
            /* 超时时间,可自主调整 */
            System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
            System.setProperty("sun.net.client.defaultReadTimeout", "10000");
            /* 初始化acsClient,暂不支持region化 */
            IClientProfile profile = DefaultProfile.getProfile(AlibabaConstants.ALI_SMS_REGION_ID, AlibabaConstants.ALI_SMS_ACCESS_KEY_ID, AlibabaConstants.ALI_SMS_SECRET);
            DefaultProfile.addEndpoint(AlibabaConstants.ALI_SMS_REGION_ID, AlibabaConstants.ALI_SMS_PRODUCT, AlibabaConstants.ALI_SMS_DOMAIN);
            IAcsClient acsClient = new DefaultAcsClient(profile);
            /* 组装请求对象-具体描述见控制台-文档部分内容 */
            SendSmsRequest request = new SendSmsRequest();
            /* 必填:待发送手机号 */
            request.setPhoneNumbers(phone);
            /* 必填:短信签名-可在短信控制台中找到 */
            request.setSignName(signName);
            /* 必填:短信模板code-可在短信控制台中找到 */
            request.setTemplateCode(templateCode);
            /* 可选:模板中的变量替换JSON串,如模板内容为"亲爱的用户,您的验证码为${code}"时,此处的值为 */
            request.setTemplateParam(content);
            // hint 此处可能会抛出异常,注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            if (sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) {
                log.info("短信发送成功:给号码为{},发送的内容为{}", phone, content);
            } else {
                log.info("短信发送失败:给号码为{},发送的内容为{}", phone, content);
            }
            return sendSmsResponse;
        }catch (Exception e) {
            log.error(e.getMessage());
            return null;
        }
    }

    /**
     * 发送SMTP邮件,含附件
     * @param toAddress
     * @param fromAlias
     * @param subject
     * @param bodyContent
     * @param attachPath
     * @return
     */
    public static boolean sendSMTPEmail(String toAddress,String fromAlias,String subject,String bodyContent,String attachPath){
        try {
            if (fromAlias == null || fromAlias.length() <= 0) {
                fromAlias = AlibabaConstants.ALI_EMAIL_CN_FROM_ALIAS;
            }
            Properties props = System.getProperties();
            props.setProperty("mail.smtp.host", AlibabaConstants.ALI_SMTP_HOST);
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.port", String.valueOf(AlibabaConstants.ALI_SMTP_PORT));
            props.setProperty("mail.smtp.socketFactory.port", String.valueOf(AlibabaConstants.ALI_SMTP_SSL_PORT));
            props.setProperty("mail.smtp.auth", "true");
            //建立邮件会话
            Session session = Session.getDefaultInstance(props, new Authenticator() {
                //身份认证
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(AlibabaConstants.ALI_EMAIL_ACCOUNT_NAME, AlibabaConstants.ALI_SMTP_PASSWORD);
                }
            });
            //建立邮件对象
            MimeMessage message = new MimeMessage(session);
            //设置邮件的发件人
            message.setFrom(new InternetAddress(AlibabaConstants.ALI_EMAIL_ACCOUNT_NAME,fromAlias));
            //收件人
            message.setRecipients(Message.RecipientType.TO, toAddress);
            //主题
            message.setSubject(subject);
            //内容
            Multipart multipart = new MimeMultipart();
            //body部分
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setContent(bodyContent, "text/html;charset=utf-8");
            multipart.addBodyPart(contentPart);
            //附件部分
            BodyPart attachPart = new MimeBodyPart();
            FileDataSource fileDataSource = new FileDataSource(attachPath);
            attachPart.setDataHandler(new DataHandler(fileDataSource));
            attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
            multipart.addBodyPart(attachPart);
            message.setContent(multipart);
            //发送邮件
            Transport.send(message);
            return true;
        } catch (Exception e) {
            log.error(e.toString());
            return false;
        }
    }
}

3.常量定义

/**
 * 阿里服务常量
 * @author lenny
 * @date 20210710
 */
public class AlibabaConstants {
    private AlibabaConstants() {
    }

    /**
     * 阿里邮件发送账户
     */
    public static final String ALI_EMAIL_ACCOUNT_NAME = "xxxxx.xxxxxx.com";
    /**
     * 阿里邮件发送人名称
     */
    public static final String ALI_EMAIL_CN_FROM_ALIAS="xxx";
    /**
     * 阿里邮件发送人名称
     */
    public static final String ALI_EMAIL_EN_FROM_ALIAS = "xxx";
    /**
     *阿里邮件地区标识
     */
    public static final String ALI_EMAIL_REGION_ID = "cn-hangzhou";
    /**
     * 阿里邮件验证账户
     */
    public static final String ALI_EMAIL_ACCESS_KEY_ID = "xxx";
    /**
     *阿里邮件密钥
     */
    public static final String ALI_EMAIL_SECRET = "xxx";
    /**
     * 阿里邮件主题(中文)
     */
    public static final String ALI_EMAIL_CN_SUBJECT="【邮件提醒】";
    /**
     * 阿里邮件主题(英文)
     */
    public static final String ALI_EMAIL_EN_SUBJECT="[Email reminder]";
    /**
     * 阿里短信API产品名称
     */
    public static final String ALI_SMS_PRODUCT = "Dysmsapi";
    /**
     * 阿里短信API产品域名
     */
    public static final String ALI_SMS_DOMAIN = "dysmsapi.aliyuncs.com";
    /**
     * 阿里短信地区标识
     */
    public static final String ALI_SMS_REGION_ID = "cn-hangzhou";
    /**
     * 阿里短信验证账户
     */
    public static final String ALI_SMS_ACCESS_KEY_ID = "xxx";
    /**
     * 阿里短信密钥
     */
    public static final String ALI_SMS_SECRET = "xxxxxx";
    /**
     * 阿里短信签名(中文)
     */
    public static final String ALI_SMS_CN_SIGN_NAME="xxx";
    /**
     * 阿里短信签名(英文)
     */
    public static final String ALI_SMS_EN_SIGN_NAME="xxx";
    /**
     * 阿里短信模板(中文)
     */
    public static final String ALI_SMS_CN_MESSAGE_TEMPLATE="SMS_xxxxxx";
    /**
     * 阿里短信模板(英文)
     */
    public static final String ALI_SMS_EN_MESSAGE_TEMPLATE="SMS_xxxxxx";
    /**
     * 阿里短信模板(推送微信服务号订阅信息)
     */
    public static final String ALI_SMS_CN_SUBSCRIPTION_TEMPLATE="SMS_xxxxx";
    /**
     * 阿里SMTP邮件域名
     */
    public static final String ALI_SMTP_HOST = "smtpdm.aliyun.com";
    /**
     * 阿里SMTP邮件端口
     */
    public static final int ALI_SMTP_PORT = 80;
    /**
     * 阿里SMTP邮件SSL端口
     */
    public static final int ALI_SMTP_SSL_PORT = 465;
    /**
     * 阿里SMTP邮件用户名
     */
    public static final String ALI_SMTP_USER = "xxxx";
    /**
     * 阿里SMTP邮件密码
     */
    public static final String ALI_SMTP_PASSWORD = "xxxxxxx";
    /**
     * SMTP邮件内容(中文)
     */
    public static final String ALI_SMTP_CN_CONTENT="报告已送达,请查阅附件!";
    /**
     * SMTP邮件内容(英文)
     */
    public static final String ALI_SMTP_EN_CONTENT="The report has been delivered, please refer to the attachment!";
}

4.方法调用

在调用的时候直接使用

    /**
     * 发送邮件
     * @param toAddress 接收人邮件地址
     * @param fromAlias 发送邮箱名称
     * @param htmlBody 消息体内容(用html格式发送效果更好)
     * @param subject 主题名称
     */
    AlibabaUtil.sendEmail(toAddress,fromAlias,htmlBody,subject);
    /**
     * 发送短信
     * @param phone 接收人手机号
     * @param signName 短信签名
     * @param templateCode 短信模板
     * @param content 符合模板的短信内容参数
     */
    AlibabaUtil.sendSms(phone,signName,templateCode,content);
    /**
     * smtp发送带附件的邮件
     * @param toAddress 接收人邮件地址
     * @param fromAlias 发送邮箱名称
     * @param subject 主题名称
     * @param bodyContent 邮件内容
     * @param filePath 邮件附件地址 
     */
    AlibabaUtil.sendSMTPEmail(toAddress, fromAlias, subject, bodyContent, filePath);

5.效果截图

短信报警:

 普通邮件报警:

SMTP附件邮件

猜你喜欢

转载自blog.csdn.net/qq_17486399/article/details/119023912