JAVA使用Transport类发送邮件


        使用Authenticator类的情况:当直接使用Transport的无参方法connect或者是Transport的静态方法直接发送邮件时,若服务器需要认证信息者则这两个方法都不能提供,因此要在创建Session对象时提供了Authenticator的认证信息,则就可以直接使用了。
通过使用Authenticator类的方式向邮件服务器提供认证信息可以按照以下步骤和思路进行编写:
1. 编写抽象类Authenticator的实现子类,在子类中覆盖父类的getPasswordAuthentication方法,并返回封装用户名和密码的PasswordAuthentication对象;
2. 调用Session.getInstance(Properties, Authenticator)方法获得Session类的实例对象,并把Authenticator对象注册到Session对象中。
3. 使用Session对象创建代表邮件消息内容的Message对象
4. 调用Transport.send静态方法发送Message对象中的邮件消息内容。send方法将从Message对象中获得Session对象的引用,然后将调用Session对象中注册的Authenticator对象从中获取认证信息后传递给邮件服务器。或者首先使用Transport的无参connect方法连接邮件服务器然后使用sendMessage发送发送邮件;最后调用close方法关闭与邮件服务器的连接。
public class MyAuthentication extends Authenticator {
 
    private String username;
    private String password;
    
    public MyAuthentication(String username, String password) {
        this.username = username;
        this.password = password;
    }
    
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {
        
        return new PasswordAuthentication(username, password);
    }
}
public class TransportWithAuthentication {
 
    public static void main(String[] args) throws Exception {
        String smtpServer ="smtp.163.com";
        String protocol = "smtp";
        String username = "XXX";
        String password = "XXX";
        
        String from ="XXX@163.com";
        String to     = "XXX@gmail.com , XXX@qq.com";
        String subject = "测试邮件";
        String body = "authenticator 测试";
        
        Properties props = new Properties();
        props.setProperty("mail.transport.protocol", protocol);
        props.setProperty("mail.host", smtpServer);
        props.setProperty("mail.smtp.auth", "true");
        MyAuthentication authentication = new MyAuthentication(username, password);
        Session session = Session.getInstance(props, authentication);
        session.setDebug(true);
        
        //创建代表邮件的MimeMessage对象
        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
        message.setSentDate(new Date());
        message.setSubject(subject);
        message.setText(body);
        //保存并且生成邮件对象
        message.saveChanges();
        
        //建立发送邮件的对象
        Transport sender = session.getTransport();
        Transport.send(message);
        
        //或是使用下面的方法
/*        sender.connect();
        sender.sendMessage(message, message.getRecipients(RecipientType.TO));
        sender.close();*/
    }
}
实际上可以使用匿名类实现上面的程序,这种方式的思想就是设计模式中的策略模式(封装变化)。其代码如下:
public class Transport2 {
    
        public static void main(String[] args) throws Exception {
            String smtpServer ="smtp.163.com";
            String protocol = "smtp";
            final String username = "XXX";
            final String  password = "XXX";
            
            String from ="XXX@163.com";
            String to     = "XXX@gmail.com ,XXX@qq.com";
            String subject = "测试邮件";
            String body = "authenticator 测试";
            
            Properties props = new Properties();
            props.setProperty("mail.transport.protocol", protocol);
            props.setProperty("mail.host", smtpServer);
            props.setProperty("mail.smtp.auth", "true");
            
            Session session = Session.getInstance(props, 
                    new Authenticator() {
 
                        @Override
                        protected PasswordAuthentication getPasswordAuthentication() {
                            //匿名只能访问函数内容的final类型的变量,可以访问外部类的成员变量
                            return new PasswordAuthentication(username, password);
                        }
                
                    }
            );
            
            session.setDebug(true);
            
            //创建代表邮件的MimeMessage对象
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(RecipientType.TO, InternetAddress.parse(to));
            message.setSentDate(new Date());
            message.setSubject(subject);
            message.setText(body);
            //保存并且生成邮件对象
            message.saveChanges();
            
            //建立发送邮件的对象
            Transport sender = session.getTransport();
            Transport.send(message);
        }
}

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
可以使用JavaMail API发送邮件,它提供了SMTP协议的实现。以下是一个简单的JavaMail发送邮件的示例代码: ```java import java.util.Properties; import javax.mail.*; import javax.mail.internet.*; public class SendMail { public static void main(String[] args) { // 收件人邮箱地址 String to = "recipient@example.com"; // 发件人邮箱地址 String from = "sender@example.com"; // 发件人邮箱密码/授权码 String password = "password"; // SMTP服务器地址 String host = "smtp.example.com"; // 获取系统属性 Properties properties = System.getProperties(); // 设置邮件服务器 properties.setProperty("mail.smtp.host", host); // 设置邮件服务器验证需要的用户名和密码/授权码 properties.setProperty("mail.smtp.auth", "true"); properties.setProperty("mail.smtp.user", from); properties.setProperty("mail.smtp.password", password); // 获取默认的Session对象 Session session = Session.getDefaultInstance(properties); try { // 创建一个默认的MimeMessage对象 MimeMessage message = new MimeMessage(session); // 设置发件人 message.setFrom(new InternetAddress(from)); // 设置收件人 message.addRecipient(Message.RecipientType.TO, new InternetAddress(to)); // 设置邮件主题 message.setSubject("Testing JavaMail API"); // 设置邮件内容 message.setText("This is a test email sent using JavaMail API."); // 发送邮件 Transport.send(message); System.out.println("Mail sent successfully."); } catch (MessagingException mex) { mex.printStackTrace(); } } } ``` 需要注意的是,该示例代码中的SMTP服务器地址、发件人邮箱地址、发件人邮箱密码/授权码以及收件人邮箱地址需要根据实际情况进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值