让我们用Java最简单快乐地实现邮件发送

本文章内容——通过java语言以最简单的方式实现邮件发送功能。

文章目的是能够引导读者成功发送邮件,将在帮助理解邮箱发送的同时,附上最简单的实例代码,并尽可能简洁明了。

 

首先了解发送邮件之原理(不需要了解的可以跳过):

首先介绍SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组由源地址向目标地址传送邮件的规则,由它来控制信件的中转方式。

SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

SMTP服务器即是遵循SMTP协议的邮件发送服务器,用来发送或中转电子邮件。

更加简单的理解方式,可以这样总结 —— SMTP协议:地址获取者,寻找者。 SMTP服务器:邮件转发者。 以上构成对JAVA何以实现邮件发送之最基础解答。

图:发送SMTP邮件的基本原理

 

 了解了SMTP服务器之后,我们要完成邮件发送的功能,只需要完成三个步骤——

1:完成开发准备

2:配置SMTP服务器

3:在JAVA中配置发件人的信息与收件人信息

 

1:完成开发准备

需要发件与收件邮箱 并开启SMTP服务 下图以网易163邮箱举例:

重点注意:第一次设置SMTP需要设置客户端授权密码(和邮箱登录密码不同),此后代码中的发件人密码以客户端为准。

需要导入一个JAR包(javax.mail.jar) 附上Jar包下载地址:http://www.oracle.com/technetwork/java/javamail/index-138643.html 

 

2:配置SMTP服务器

为方便调用,首先创造一个邮件发送工具类。

邮件发送工具MailUtil包含两个方法,第一个方法用来完成SMTP服务器配置及邮件发送,第二个方法用来生成一封邮件实例。

代码已作了详细的注释,此处不作过多解释。

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;

import java.util.Date;
import java.util.Properties;
/**
 * @创建人 Levi
 * @功能描述 邮件发送工具
 * @创建时间 2018-07-18 14:08:08
 */

public class MailUtil {
    
    /**
     * SMTP服务器配置及邮件发送
     * @throws Exception
     */
    public void sendMail(MailConfig mc) throws Exception {
        try{
            // 连接邮件服务器的参数配置
            Properties props = new Properties();
            // 设置用户的认证方式
            props.setProperty("mail.smtp.auth", "true");
            // 设置传输协议(JavaMail规范要求)
            props.setProperty("mail.transport.protocol","smtp");
            // 设置发件人的SMTP服务器地址
            props.setProperty("mail.smtp.host", "smtp.163.com");
           //  设置SMTP服务器端口 一般填写:25
            props.setProperty("mail.smtp.port","25");
            // 创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getInstance(props);
            // 设置调试信息在控制台打印出来
            session.setDebug(true);
            // 创建邮件的实例对象
            Message msg = getMimeMessage(session,mc);
            // 根据session对象获取邮件传输对象Transport
            Transport transport = session.getTransport();
            // 设置发件人的账户名和密码
            if(mc.getSenderAccount()==null || mc.getSenderAccount().isEmpty()){
                throw new Exception("发件人账户为空");
            }
            if(mc.getSenderPassword()==null || mc.getSenderPassword().isEmpty()){
                throw new Exception("发件人密码为空");
            }
            transport.connect(mc.getSenderAccount(), mc.getSenderPassword());
            // 发送邮件,并发送到所有收件人地址,message.getAllRecipients() 获取到的是在创建邮件对象时添加的所有收件人, 抄送人, 密送人
            transport.sendMessage(msg,msg.getAllRecipients());
            // 关闭邮件连接
            transport.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    /**
     * 获取邮件的实例对象
     * @param session
     * @return MimeMessage
     * @throws MessagingException
     * @throws AddressException
     */
    private MimeMessage getMimeMessage(Session session,MailConfig mc) throws Exception{
        // 创建一封邮件的实例对象
        MimeMessage msg = new MimeMessage(session);

        // 设置发件人地址
        if (mc.getSenderAddress()!=null && !mc.getSenderAddress().isEmpty()){
            msg.setFrom(new InternetAddress(mc.getSenderAddress()));
        }else{
            throw new Exception("发件人地址为空");
        }
        /**
         * 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
         * MimeMessage.RecipientType.TO:发送
         * MimeMessage.RecipientType.CC:抄送
         * MimeMessage.RecipientType.BCC:密送
         */
       if (mc.getRecipientAddresses()!=null && !mc.getRecipientAddresses().isEmpty()){
           InternetAddress[] recipients = new InternetAddress().parse(mc.getRecipientAddresses());
           msg.setRecipients(MimeMessage.RecipientType.TO, recipients);
       }else{
            throw new Exception("收件人地址为空");
        }
        if (mc.getCopyToAddresses()!=null && !mc.getCopyToAddresses().isEmpty()){
            InternetAddress[] copyTos = new InternetAddress().parse(mc.getCopyToAddresses());
            msg.setRecipients(MimeMessage.RecipientType.CC,copyTos);
        }
        // 设置邮件主题
        if (mc.getSubject()!=null && !mc.getSubject().isEmpty()){
            msg.setSubject(mc.getSubject(),"UTF-8");
        }else{
            throw new Exception("邮件主题为空");
        }
        //设置邮件正文
        // 设置(文本+图片)和 附件 的关系(合成一个大的混合"节点" / Multipart )
        MimeMultipart mm = new MimeMultipart();
        // 混合关系
        mm.setSubType("mixed");
        // 创建附件"节点"
        MimeBodyPart body = new MimeBodyPart();
        if (mc.getContent()!=null && !mc.getContent().isEmpty()){
            body.setContent(mc.getContent(), "text/html;charset=UTF-8");
        }else{
            throw new Exception("邮件内容为空");
        }
        mm.addBodyPart(body);     // 如果有多个附件,可以创建多个多次添加
        if(mc.getAttachmentPaths()!=null && mc.getAttachmentPaths().length>0){
            for (String attachmentPath: mc.getAttachmentPaths()) {
                // 创建附件"节点"
                MimeBodyPart attachment = new MimeBodyPart();
                // 读取本地文件
                DataHandler dh = new DataHandler(new FileDataSource(attachmentPath));
                // 将附件数据添加到"节点"
                attachment.setDataHandler(dh);
                // 设置附件的文件名(需要编码)
                attachment.setFileName(MimeUtility.encodeText(dh.getName()));
                mm.addBodyPart(attachment);     // 如果有多个附件,可以创建多个多次添加
            }
        }
        // 设置整个邮件的关系(将最终的混合"节点"作为邮件的内容添加到邮件对象)
        msg.setContent(mm);
        // 设置邮件的发送时间,默认立即发送
        msg.setSentDate(new Date());
        msg.saveChanges();
        return msg;
    }
}

 

3:在JAVA中配置邮件内容

配置完SMTP服务器内容后,我们将配置邮件内容(包括发件人,收件人信息,邮件主题,内容等)

首先构建邮件实体类

public class MailConfig {
    //发件人地址
    private String senderAddress;
    //发件人账户名
    private String senderAccount;
    //发件人账户密码
    private String senderPassword;
    /**
     * 收件人地址,多个以","隔开
     */
    private String recipientAddresses;
    /**
     * 抄送人地址,多个以","隔开
     */
    private String copyToAddresses;
    //邮件标题
    private String subject;
    //邮件正文
    private String content;
    //附件路径
    private String[] attachmentPaths;
    
    public String getSenderAddress() {
        return senderAddress;
    }
    public void setSenderAddress(String senderAddress) {
        this.senderAddress = senderAddress;
    }
    public String getSenderAccount() {
        return senderAccount;
    }
    public void setSenderAccount(String senderAccount) {
        this.senderAccount = senderAccount;
    }
    public String getSenderPassword() {
        return senderPassword;
    }
    public void setSenderPassword(String senderPassword) {
        this.senderPassword = senderPassword;
    }
    public String getRecipientAddresses() {
        return recipientAddresses;
    }
    public void setRecipientAddresses(String recipientAddresses) {
        this.recipientAddresses = recipientAddresses;
    }
    public String getCopyToAddresses() {
        return copyToAddresses;
    }
    public void setCopyToAddresses(String copyToAddresses) {
        this.copyToAddresses = copyToAddresses;
    }
    public String getSubject() {
        return subject;
    }
    public void setSubject(String subject) {
        this.subject = subject;
    }
    public String getContent() {
        return content;
    }
    public void setContent(String content) {
        this.content = content;
    }
    public String[] getAttachmentPaths() {
        return attachmentPaths;
    }
    public void setAttachmentPaths(String[] attachmentPaths) {
        this.attachmentPaths = attachmentPaths;
    }
}

然后,配置邮件的具体内容 并调用邮件发送工具类。

public class MailSend {
   //采用单例以提供持久可用的工具类对象
static MailUtil mu = new MailUtil(); public static void main(String arg[]){ try { MailConfig mc = new MailConfig(); //设置发件人地址 mc.setSenderAddress("sender@163.com"); //设置发件人账户名 mc.setSenderAccount("sender@163.com"); //设置发件人密码(备注:密码需要用邮箱SMTP客户端授权密码,而非登录密码,此处需注意) mc.setSenderPassword("mypassword"); //设置邮件主题 mc.setSubject("邮件发送测试"); //设置收件人地址,多个地址可用逗号隔开 mc.setRecipientAddresses("xx@qq.com,xxx@163.com"); //设置抄送人地址,多个地址可用逗号隔开 mc.setCopyToAddresses("xxxx@qq.com"); //设置邮件内容 mc.setContent("邮件发送成功啦!"); //设置附件地址,多个附件地址用逗号隔开 String[] s = {"C:/测试附件1.txt","C:/测试附件2.pdf"}; mc.setAttachmentPaths(s);
          //
邮件信息配置完毕,调用MailUtil发送邮件。
mu.sendMail(mc); }
catch (Exception e) { e.printStackTrace(); } } }

运行以上代码,邮件即可成功发送。

提示:本文展示演示代码,若需要实际测试,代码中的“账号”和“密码”需更换为自己所使用的邮箱。

 代码GIT CLONE地址:https://github.com/ooo8866923/MailSend.git

 

以上仅为邮件发送功能的简单实现,若需进阶拓展,或了解底层,需要更进一步查阅相关书籍和网站。

本人能力有限,若文章存在纰漏,或对该文章有任何疑问,批评,建议,衷心渴望您的指教。

本文结束,感谢浏览。

转载于:https://www.cnblogs.com/Levierx/p/9798357.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值