Java发送邮箱

邮箱

要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。

  • SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
  • SMTP协议:通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
  • POP3协议:通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。

邮件分类:

  1. Message.RecipientType.TO:普通直接发送,能看到抄送给了谁。
  2. Message.RecipientType.BCC:抄送。将邮件同时送给收信人以外的人,用户所写的邮件抄送一份给别人,对方原发送给了谁,以及还抄送给了谁。
  3. Message.RecipientType.CC:密送。将邮件同时送给收信人以外的人,用户所写的邮件抄送一份给别人。但是别人都不知道密送的对象,并且密送对象之间也是互相隐藏的。
  • 需要提前在邮箱中开启POP3/SMTP服务,并获得密码(授权码)
    (注意不要将授权码泄露,一个账户可以拥有多个授权码)
    在这里插入图片描述

QQ邮箱

开启服务、获取授权码步骤:
QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务–>开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)

发送邮箱

Java所需依赖:

jar包:
mail.jar:http://www.java2s.com/Code/Jar/j/Downloadjavaxmailjar.htm
activation.jar:http://www.java2s.com/Code/Jar/j/Downloadjavaxactivation30preludejar.htm

或者 maven:

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
<dependency>
    <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>

一、MimeMessage 纯文本邮件发送

在这里插入图片描述

大致过程:

  1. (此步骤大多数情况可省略)构建一个继承自 javax.mail.Authenticator 的具体类,并重写里面的getPasswordAuthentication() 方法。
    1. 此类是用作登录校验的,以确保你对该邮箱有发送邮件的权利。
Session session = Session.getDefaultInstance(properties, new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication("cjx17323995077", "授权码");
    }
});
  1. 构建一个 Properties 对象,该文件中存放 SMTP 服务器地址等参数。
    1. mail.host:设置邮件服务器
    2. mail.transport.protocol:邮件发送协议
    3. mail.smtp.auth:是否需要验证用户名密码
    4. mail.smtp.port:当使用公司内部邮箱,可以设置端口号
    5. mail.smtp.host:当使用公司内部邮箱,可以设置服务器
properties.setProperty("mail.host", "smtp.163.com");
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.smtp.auth", "true")
  1. 通过构建的 properties 文件和 javax.mail.Authenticator(可省略) 具体类来创建一个javax.mail.Session。Session 的创建就相当于登录邮箱一样,剩下的自然就是新建邮件。
Session session = Session.getDefaultInstance(properties);
  1. 构建邮件内容,一般是传入session对象构建 javax.mail.internet.MimeMessage 对象。
    1. setFrom(Address address):邮件发送人
    2. setRecipient(RecipientType type, Address address):邮件接收人
    3. setSubject(String subject):标题
    4. setContent(Object o[, String type]):内容,可以指定编码类型
    5. saveChanges():保存修改。
//创建邮件,传入session对象
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setFrom(new InternetAddress("11@163.com"));
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("3507189908@qq.com"));
mimeMessage.setSubject("Hello Mail");
mimeMessage.setContent("我的想法是把代码放进一个循环里", "text/html;charset=UTF-8");
  1. 使用javax.mail.Transport 工具类发送邮件。
//获取连接对象
Transport transport = session.getTransport();
//连接服务器
transport.connect("smtp.163.com", "11@163.com", "授权码");
//发送邮件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
//关闭连接
transport.close();

Java实现纯文本邮件发送:

public static void sendPlainText() throws MessagingException {
        //创建一个配置文件并保存
        Properties properties = new Properties();
        properties.setProperty("mail.host", "smtp.163.com");
        properties.setProperty("mail.transport.protocol", "smtp");
        properties.setProperty("mail.smtp.auth", "true");
        //创建一个session对象
        Session session = Session.getDefaultInstance(properties);
        //创建邮件,传入session对象
        MimeMessage mimeMessage = new MimeMessage(session);
        //邮件发送人
        mimeMessage.setFrom(new InternetAddress("11@163.com"));
        //邮件接收人
        mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("22@qq.com"));
        //邮件标题
        mimeMessage.setSubject("Hello Mail");
        //邮件内容
        mimeMessage.setContent("我的想法是把代码放进一个循环里", "text/html;charset=UTF-8");
        //获取连接对象
        Transport transport = session.getTransport();
        //通过transport对象邮箱用户名和授权码连接邮箱服务器
        transport.connect("smtp.163.com", "11@163.com", "授权码");
        //发送邮件
        transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        //关闭连接
        transport.close();
    }
  • QQ邮箱 存在一个特性设置SSL加密
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);

二、MimeBodyPart文本图片附件复杂的邮件发送

MimeMultipart

  • javax.mail.internet.MimeMultipart 是抽象类 Multipart 的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
  • addBodyPart(BodyPart part):将 BodyPart 添加到现有部件列表中。
  • setSubType(String subtype):设置子类型。
    • 该方法只能在客户机创建的新 MimeMultipart 对象上调用。
    • 这种多部分对象的 默认子类型是“mixed”。
MimeMultipart mimeMultipart = new MimeMultipart();    //拼装邮件正文
mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(text);
mimeMultipart.setSubType("related");    //文本和图片内嵌成功

MimeBodyPart

  • javax.mail.internet.MimeBodyPart类 表示的是一个 MIME(多用途互联网邮件扩展类型) 消息,它和 MimeMessage 类一样都是从 Part接口 继承过来。
  • setDataHandler(DataHandler dh):提供了设置主体部分内容的机制。给定的DataHandler对象应该包装实际内容。可以放入图片数据。
  • setContentID(String cid):设置这个主体部分的“Content-ID”报头字段。如果cid参数为空,则删除任何现有的“Content-ID”。
image.setDataHandler(new DataHandler(new FileDataSource(
        "E:\\IdeaProjects\\WebEmail\\resources\\测试图片.png")));
image.setContentID("test.png"); //设置图片id
  • setContent(Object o[, String type]):内容,可以指定编码类型。
    可设置 MimeMultipart 对象。
  • setFileName(String filename):设置文件名
public static void sendComplex() throws MessagingException {
    //创建一个配置文件并保存
    Properties properties = new Properties();
    properties.setProperty("mail.host", "smtp.163.com");    // 设置邮件服务器
    properties.setProperty("mail.transport.protocol", "smtp");  // 邮件发送协议
    properties.setProperty("mail.smtp.auth", "true");   // 需要验证用户名密码
    //创建一个session对象
    Session session = Session.getDefaultInstance(properties);
    //创建邮件,传入session对象
    MimeMessage mimeMessage = complexMessage(session);
    //获取连接对象
    Transport transport = session.getTransport();
    //通过transport对象邮箱用户名和授权码连接邮箱服务器
    transport.connect("smtp.163.com", "11@163.com", "TRCJUOXDTYQCMRLX");
    //发送邮件
    transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
    //关闭连接
    transport.close();
}

private static MimeMessage complexMessage(Session session) throws MessagingException {
    //消息的固定信息
    MimeMessage mimeMessage = new MimeMessage(session);
    //发件人
    mimeMessage.setFrom(new InternetAddress("11@163.com"));
    //收件人
    mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("3507189908@qq.com"));
    //邮件标题
    mimeMessage.setSubject("带图片和附件的邮件");
    //邮件内容
    //准备图片数据
    MimeBodyPart image = new MimeBodyPart();
    image.setDataHandler(new DataHandler(new FileDataSource(
            "F:\\picture\\东哥\\1.jpeg")));
    image.setContentID("test.png"); //设置图片id
    //准备文本
    MimeBodyPart text = new MimeBodyPart();
    text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
    //附件
    MimeBodyPart appendix = new MimeBodyPart();
    appendix.setDataHandler(new DataHandler(new FileDataSource("F:\\1temporary-files\\test.txt")));
    appendix.setFileName("test.txt");
    //拼装邮件正文
    MimeMultipart mimeMultipart = new MimeMultipart();
    mimeMultipart.addBodyPart(image);
    mimeMultipart.addBodyPart(text);
    mimeMultipart.setSubType("related");//文本和图片内嵌成功
    //将拼装好的正文内容设置为主体
    MimeBodyPart contentText = new MimeBodyPart();
    contentText.setContent(mimeMultipart);
    //拼接附件
    MimeMultipart allFile = new MimeMultipart();
    allFile.addBodyPart(appendix);//附件
    allFile.addBodyPart(contentText);//正文
    allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为 mixed
    //放到Message消息中
    mimeMessage.setContent(allFile);
    mimeMessage.saveChanges();//保存修改
    return mimeMessage;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TryMyBestTo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值