欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java实现邮件发送

程序员文章站 2022-05-18 21:26:29
...

Java邮件发送

在讲邮件发送之前,我们要先了解两个概念

  • 邮件服务器
我们想要在Internet上提供电子邮件功能,必须有专门的邮件服务器,但是现在有很多提供邮件服务的厂商,例如:QQ、sina、163、souhu;
邮件服务器类似于我们现实生活中的邮局,负责接收用户投递过来的邮件,并将邮件投递到接收者的邮箱中。
  • 电子邮箱
想要使用电子邮箱需要在邮件服务器上申请,通俗地说、用户可以在邮件服务器上申请一个账户,当用户申请了账户之后,服务器就会为这个账户分配一定的空间,
用户可以使用这个空间,进行发送邮件,和保存别人发送给自己的邮件。

Java实现邮件发送
Java实现邮件发送
然后我们用Java代码来实现邮件发送:
我们需要准备两个jar包:
Java实现邮件发送
这两个jar包可以在maven仓库里搜索:maven仓库官方网址

1.简单文本邮件发送

//需要导入的包
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;

Properties properties = new Properties();
        properties.setProperty("mail.host"," smtp.qq.com");
        properties.setProperty("mail.transport.protocol","smtp");
        properties.setProperty("mail.smtp.auth","true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable","true");
        properties.put("mail.smtp.ssl.socketFactory",sf);

        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
      			//发件人邮件用户名,授权码
       			return new PasswordAuthentication("发送人邮件账号", "该账号的授权码");
            }
        });
        //开启session的debug模式,这样就可以看到程序发送email的运行状态
        session.setDebug(true);
        //通过session得到Transport对象
        Transport ts = session.getTransport();
        //使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com","发送人的账号","该账号的授权码");
        //创建邮件对象
        Message message = new MimeMessage(session);
        //指明邮件的发送人
        message.setFrom(new InternetAddress("发送人的账号"));
        //指明邮件的接收者
        message.setRecipient(Message.RecipientType.TO,new InternetAddress("邮件接收者的账号"));
        //邮件的标题
        message.setSubject("Java邮件发送");
        // 邮件的文本内容
        message.setContent("测试内容","text/html;charset=UTF-8");
        //发送邮件
        ts.sendMessage(message,message.getAllRecipients());
        //关闭连接
        ts.close();

2、发送带附件的邮件

//需要导入的包
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.*;
//这是被我封装成了方法,增加复用性。
public static boolean sendMail(String receive, String subject, String msg, String filename)
            throws GeneralSecurityException {
        if (receive==null || receive=="") {
            return false;
        }
        // 发件人电子邮箱
        final String from = "发送人的账号";
        // 发件人电子邮箱密码
        final String pass = "该账号的授权码";
        // 指定发送邮件的主机为 smtp.qq.com
        String host = "smtp.qq.com"; // 邮件服务器
        // 获取系统属性
        Properties properties = System.getProperties();
        // 设置邮件服务器
        properties.setProperty("mail.smtp.host", host);
        properties.put("mail.smtp.auth", "true");
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        properties.put("mail.smtp.ssl.enable", "true");
        properties.put("mail.smtp.ssl.socketFactory", sf);
        // 获取默认session对象
        Session session = Session.getDefaultInstance(properties, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() { // qq邮箱服务器账户、第三方登录授权码
                return new PasswordAuthentication(from, pass); // 发件人邮件用户名、密码
            }
        });
        session.setDebug(true);
        try {
            // 创建默认的 MimeMessage 对象
            MimeMessage message = new MimeMessage(session);
            // Set From: 头部头字段
            message.setFrom(new InternetAddress(from));
            // Set To: 头部头字段
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(receive));
            // Set Subject: 主题文字
            message.setSubject(subject);
            // 创建消息部分
            BodyPart messageBodyPart = new MimeBodyPart();
            // 消息
            messageBodyPart.setText(msg);
            // 创建多重消息
            Multipart multipart = new MimeMultipart();
            // 设置文本消息部分
            multipart.addBodyPart(messageBodyPart);
            // 附件部分
            messageBodyPart = new MimeBodyPart();
            // 设置要发送附件的文件路径
            DataSource source = new FileDataSource(filename);
            messageBodyPart.setDataHandler(new DataHandler(source));
            // messageBodyPart.setFileName(filename);
            // 处理附件名称中文(附带文件路径)乱码问题
       messageBodyPart.setFileName(MimeUtility.encodeText(filename));
            multipart.addBodyPart(messageBodyPart);
            // 发送完整消息
            message.setContent(multipart);
            // 发送消息
            Transport.send(message);
            // System.out.println("Sent message successfully....");
            return true;
        } catch (MessagingException  e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return false;
    }

这里需要说的是电子邮件的授权码,这是我们账号在第三方客户端上的一个通行证,怎么获得呢?很简单,比如说QQ
进入网页版qq邮箱,点击如下地址:
Java实现邮件发送
Java实现邮件发送
希望本文章对您有所帮助!

相关标签: 邮件发送