第一种写法:
public static void main(String[] args) throws Exception { // 第一种写法: Properties props = new Properties(); props.setProperty("mail.smtp.host", "smtp.163.com"); props.setProperty("mail.debug", "true"); props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.transport.protocol", "smtp"); Session session = Session.getInstance(props); Message message = new MimeMessage(session); message.setFrom(new InternetAddress("[email protected]")); message.setText("测试邮件!请勿回复!"); Transport transport = session.getTransport(); transport.connect("smtp.163.com", 25, "[email protected]", "****"); transport.sendMessage(message, new Address[] { new InternetAddress( "[email protected]") }); transport.close(); }
或者
public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty("mail.smtp.host", "smtp.163.com"); // 必须有这项设置 props.setProperty("mail.smtp.auth", "true"); props.setProperty("mail.debug", "true"); // Session管理与stmp的链接信息 Session session = Session.getDefaultInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("[email protected]", "*******"); } }); MimeMessage msg = new MimeMessage(session); try { msg.setFrom(new InternetAddress("[email protected]")); msg.addRecipients(Message.RecipientType.TO, "[email protected],[email protected]"); msg.setSubject("测试--群发", "UTF-8"); msg.setSentDate(new Date()); msg.setText("你好,这是一封测试邮件。收到请勿回复", "UTF-8"); // 使用静态的方法发送信息 // Transport.send(msg,new InternetAddress[]{new // InternetAddress("[email protected]")}); Transport.send(msg); } catch (MessagingException e) { e.printStackTrace(); } }
其中javamail Session.getDefaultInstance和getInstance的区别:
如果想要同时使用两个帐号发送javamail,比如使用[email protected]发送1#邮件,使用[email protected]发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:[email protected]创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由[email protected]发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。
Transport 方法 send 和 sendMessage 之间有什么区别?
send() 方法是一个静态方法,可以直接使用,而不需要 Transport 对象的实例。它用于常见、简单的场合,比如使用默认传输发送单条消息。从内部讲,send() 方法首先调用消息上的 saveChanges() 方法。然后创建合适的新 Transport 对象,调用 Transport 的 connect() 方法,调用 Transport 的 sendMessage() 方法来实际发送消息,接着调用 Transport 的 close() 方法,最后丢弃 Transport 对象的新实例,并由垃圾收集器收集(实际上,还有比那更加复杂的,但那是一般的想法)。
如你可以看到,静态 send() 便利 (convenience) 方法是建立在更加通用的每实例 sendMessage() 方法的基础上的。有许多原因可以让应用程序直接使用 sendMessage() 方法。最常见的原因是为了通过在单个连接期间发送多条消息 来提高性能,或者为了手动治理连接以提供验证信息。当使用 sendMessage() 方法时,产生的最常见错误是,忘记在要发送的消息上调用 saveChanges() 方法。
第2种,结合spring
public static void main(String[] args) throws AddressException, MessagingException { JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); mailSender.setHost("mail.xinnet.com"); mailSender.setUsername("*****@xinnet.com"); mailSender.setPassword("*****"); Properties prop = new Properties(); prop.put("mail.debug", "true"); prop.put("mail.smtp.auth", "true"); prop.put("mail.smtp.timeout", "25000"); mailSender.setJavaMailProperties(prop); MimeMessage mailMessage = mailSender.createMimeMessage(); MimeMessageHelper mail = new MimeMessageHelper(mailMessage); mail.setFrom("******@xinnet.com"); mail.setTo("*****@xinnet.com"); mail.setSubject(" 测试spring Mail"); mail.setText("hello!!spring<br/> html Mail",true); mailSender.send(mailMessage); System.out.println(" 邮件发送成功.. "); }
下一篇贴一些网上找来的一些JavaMail的常见问题