spring mial 发送邮件

通过spring emial 发送邮件

项目最近需要新增发邮件功能,在网上搜了一些资料,这里整理一下。
java本身提供了发送邮件的API,JavaMail API详细信息可以参照: 《JavaMail API详解》

我用的是spring email,spring email抽象的核心是MailSender接口。spring自带MailSender的实现——JavaMailSenderImpl使用和配置起来都更加简单。

配置maven

     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.3.8.RELEASE</version>
    </dependency>

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

发送代码

package com.*.*.util;



/**
 * 邮件发送工具类
 *
 * @author 
 * @create 
 */
@Component
public class EmailUtil {
    static Logger logger = LoggerFactory.getLogger(EmailUtil.class);
    /**
     * 发送邮件
     *
     * @param mailSend   MailSend
     * @param mailConfig MailConfig
     * @throws MessagingException           异常
     * @throws UnsupportedEncodingException 异常
     */
    public static boolean sendMail(MailSend mailSend, MailConfig mailConfig) {
        System.out.println("1.send mail send param MailSend is " + mailSend.toString() + "MailConfig is " + mailConfig.toString());

        //配置邮箱工具参数
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
        javaMailSender.setHost(mailConfig.getMailHost());
        javaMailSender.setPort(mailConfig.getMailPort());
        javaMailSender.setUsername(mailConfig.getMailUsername());
        javaMailSender.setPassword(mailConfig.getMailPassword());
        javaMailSender.setDefaultEncoding("Utf-8");
        Properties properties = new Properties();
        properties.setProperty(MailConfig.MAIL_SMTP_TIMEOUT, mailConfig.getMailTimeout());
        properties.setProperty(MailConfig.MAIL_SMTP_AUTH, "false");
        javaMailSender.setJavaMailProperties(properties);

        //设置短信内容
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try {
            // 设置utf-8或GBK编码,否则邮件会有乱码
            MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            messageHelper.setFrom(mailConfig.getMailUsername(), Utils.notEmpty(mailConfig.getMailFromName()) ? mailConfig.getMailFromName() : mailConfig.getMailUsername());
            messageHelper.setTo(mailSend.getRecipient());
            messageHelper.setSubject(mailSend.getSubject());
            //内容是HTML形式

            System.out.println("2.send mail start , content is " + mailContent);

            messageHelper.setText(mailContent, true);
            //多附件处理
            if (Utils.notEmpty(mailSend.getAnnex())) {
                FileSystemResource file = null;
                for (NoMailAnnex noMailAnnex : mailSend.getAnnex()) {
                    file = new FileSystemResource(noMailAnnex.getAnnexPath());
                    messageHelper.addAttachment(noMailAnnex.getAnnextitle(), file);
                }
            }

            javaMailSender.send(mimeMessage);
            return true;
        } catch (Exception e) {
            System.out.println(("send mail fail!!! mial subject is " + mailSend.getSubject() + e.getMessage()));
        }
        return false;
    }

    public static void main(String[] args) {
        //邮箱配置
        MailConfig mailConfig = new MailConfig();
        mailConfig.setMailHost("smtp.163.com");//邮箱服务器
        mailConfig.setMailPort(25);//端口
        mailConfig.setMailTimeout();//超时,这里我设置默认25000
        mailConfig.setMailUsername("********@163.com");//用户名,
        mailConfig.setMailPassword("*******");//密码
        mailConfig.setMailFromName("***");//发件人,不填默认用发件邮箱
        //邮件内容
        MailSend mailSend = new MailSend();
        mailSend.setSubject("五一出行天气");//主题
        //内容
        mailSend.setText("<p>22日上午,首届数字中国建设峰会在福建福州开幕。开幕式上宣读了习近平的贺信。<br/>中共中央政治局委员、中宣部部长黄坤明出席峰会开幕式并发表主旨演讲。他说,要认真学习贯彻习近平总书记网络强国战略思想和各项指示要求,落实全国网络安全和信息化工作会议精神,紧紧围绕数字中国建设,加快突破核心技术,推动基础设施优化升级,发展壮大数字经济,积极释放数据红利,让信息化发展更好造福社会、造福人民。</p>");
        mailSend.setRecipient("***@qq.com");//收件人邮箱
        try {
            //邮件发送,如果收件人邮箱错误,邮件被退回。是不会抛异常的
            EmailUtil.sendMail(mailSend, mailConfig);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

    }
}

MailSend

package com.*.*.model;

/**
 * 邮件发送实体类
 * @author 
 * @create 
 * 
 */

public class MailSend {

    /**
     * 收件人
     */
    private String recipient;
    /**
     * 邮件主题
     */
    private String subject;
    /**
     * 邮件内容
     */
    private String text;
    /**
     * 邮件附件路径
     */
    private List<NoMailAnnex> annex;

    public String getRecipient() {
        return recipient;
    }

    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public List<NoMailAnnex> getAnnex() {
        return annex;
    }

    public void setAnnex(List<NoMailAnnex> annex) {
        this.annex = annex;
    }

MailConfig

package com.*.*.model;

/**
 * 邮件发送配置
 * @author 
 * @create 
 */

public class MailConfig {

    public static final String MAIL_SMTP_TIMEOUT = "mail.smtp.timeout";

    public static final String MAIL_SMTP_AUTH = "mail.smtp.auth";
    /**
     * 服务器
     */
    private String mailHost;
    /**
     * #端口号
     */
    private Integer mailPort;
    /**
     * #邮箱账号
     */
    private String mailUsername;
    /**
     * #邮箱授权码
     */
    private String mailPassword;
    /**
     * #时间延迟
     */
    private String mailTimeout ;
    /**
     * #发送人邮箱
     * --废弃字段,默认用mailUsername字段
     */
    private String mailFrom;

    /**
     * #发送人署名
     */
    private String mailFromName;

    public String getMailFromName() {
        return mailFromName;
    }

    public void setMailFromName(String mailFromName) {
        this.mailFromName = mailFromName;
    }

    public String getMailHost() {
        return mailHost;
    }

    public void setMailHost(String mailHost) {
        this.mailHost = mailHost;
    }

    public Integer getMailPort() {
        return mailPort;
    }

    public void setMailPort(Integer mailPort) {
        this.mailPort = mailPort;
    }

    public String getMailUsername() {
        return mailUsername;
    }

    public void setMailUsername(String mailUsername) {
        this.mailUsername = mailUsername;
    }

    public String getMailPassword() {
        return mailPassword;
    }

    public void setMailPassword(String mailPassword) {
        this.mailPassword = mailPassword;
    }

    public String getMailTimeout() {
        return mailTimeout;
    }

    public void setMailTimeout() {
        this.mailTimeout = "25000";
    }

    public String getMailFrom() {
        return mailFrom;
    }

    public void setMailFrom(String mailFrom) {
        this.mailFrom = mailFrom;
    }
}

NoMailAnnex

package com.*.*.model;

/**
 * 说明: 附件
 * 创建人:
 * 创建时间:
 * @version
 */
public class NoMailAnnex{
    /**
     * 标题
     */
    private String annextitle;
    /**
     * 文件真实路径
     */
    private String annexPath;

    public String getAnnexPath() {
        return annexPath;
    }

    public void setAnnexPath(String annexPath) {
        this.annexPath = annexPath;
    }

    public String getAnnextitle() {
        return annextitle;
    }
    public void setAnnextitle(String annextitle) {
        this.annextitle = annextitle;
    }   
}

关于邮件中发送网络资源图片被拦截

  • 测试时,发送到QQ邮箱的时候会发现图片找不到。这是因为QQ邮箱会默认拦截陌生邮件中的图片。

  • 邮件中内嵌图片

 /**
  * 这部分的代码未测试
  */
 MimeMessage message = mailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom("[email protected]");
        helper.setTo("[email protected]");
        helper.setSubject("Spring Email Test");
        helper.setText("<html><body><img src='cid:testLogo'>"
                + "<h4>Hello World!!!</h4>"
                + "</body></html>", true);//第二个参数表明这是一个HTML
        //src='cid:testLogo'表明在消息中会有一部分是图片并以testLogo来进行标识
        ClassPathResource image = new ClassPathResource("logo.jpg");
        System.out.println(image.exists());
        helper.addInline("testLogo", image);//添加内联图片,第一个参数表明内联图片的标识符,第二个参数是图片的资源引用
        mailSender.send(message);

参考博客

猜你喜欢

转载自blog.csdn.net/weixin_40887800/article/details/80282176
今日推荐