Java实现邮件发送【单纯文字】
2016-08-12 13:40
204 查看
使用JavaxMail 实现一个简单的邮件发送的demo,网上找来了好多。在调试的时候总是有错。最后终于成功了!源码如下:
package com.mailSend; /** * @author * @describe * @date 2016/8/11 */ import java.io.IOException; import java.io.InputStream; import java.util.Properties; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeUtility; public class SendMailUtil3 { /** * Message对象将存储我们实际发送的电子邮件信息, * Message对象被作为一个MimeMessage对象来创建并且需要知道应当选择哪一个SendMailUtil3 session。 */ private MimeMessage message; /** * Session类代表SendMailUtil3中的一个邮件会话。 * 每一个基于SendMailUtil3的应用程序至少有一个Session(可以有任意多的Session)。 * * SendMailUtil3需要Properties来创建一个session对象。 * 寻找"mail.smtp.host" 属性值就是发送邮件的主机 * 寻找"mail.smtp.auth" 身份验证,目前免费邮件服务器都需要这一项 */ private Session session; /*** * 邮件是既可以被发送也可以被受到。SendMailUtil3使用了两个不同的类来完成这两个功能:Transport 和 Store。 * Transport 是用来发送信息的,而Store用来收信。对于这的教程我们只需要用到Transport对象。 */ private Transport transport; private String mailHost=""; private int mailPort; private String sender_username=""; private String sender_password=""; private String smtp_auth = ""; private Properties properties = new Properties(); /* * 初始化方法 */ public SendMailUtil3(boolean debug) { InputStream in = SendMailUtil3.class.getClassLoader().getResourceAsStream("config.properties"); try { properties.load(in); this.mailHost = properties.getProperty("mail.smtp.host"); this.mailPort = Integer.parseInt(properties.getProperty("mail.smtp.port")); this.sender_username = properties.getProperty("mail.sender.username"); this.sender_password = properties.getProperty("mail.sender.password"); this.smtp_auth = properties.getProperty("mail.smtp.auth"); } catch (IOException e) { e.printStackTrace(); } Authenticator auth = new MyAuthenticator(sender_username, sender_password); session = Session.getDefaultInstance(properties, auth); session.setDebug(debug);//开启后有调试信息 message = new MimeMessage(session); } /** * 发送邮件 * * @param subject * 邮件主题 * @param sendHtml * 邮件内容 * @param receiveUser * 收件人地址 */ public void doSendHtmlEmail(String subject, String sendHtml, String receiveUser) { try { // 发件人 //InternetAddress from = new InternetAddress(sender_username); // 下面这个是设置发送人的Nick name InternetAddress from = new InternetAddress(MimeUtility.encodeWord("sky")+" <"+sender_username+">"); message.setFrom(from); // 收件人 InternetAddress to = new InternetAddress(receiveUser); message.setRecipient(Message.RecipientType.TO, to);//还可以有CC、BCC // 邮件主题 message.setSubject(subject); String content = sendHtml.toString(); // 邮件内容,也可以使纯文本"text/plain" message.setContent(content, "text/html;charset=UTF-8"); // 保存邮件 message.saveChanges(); transport = session.getTransport("smtp"); // smtp验证,就是你用来发邮件的邮箱用户名密码 transport.connect(mailHost,mailPort, sender_username, sender_password); // 发送 transport.sendMessage(message, message.getAllRecipients()); //System.out.println("send success!"); } catch (Exception e) { e.printStackTrace(); }finally { if(transport!=null){ try { transport.close(); } catch (MessagingException e) { e.printStackTrace(); } } } } public static void main(String[] args) { SendMailUtil3 se = new SendMailUtil3(false); se.doSendHtmlEmail("邮件主题", "我在使用Java进行邮件发送测试", "xxxx@qq.com"); } }
依赖的两文件config.proprties 文件与类MyAuthenticator文件见下:
资源文件:
mail.smtp.host=smtp.163.com mail.smtp.port=25 mail.sender.username=xxx@163.com //发送邮箱地址 mail.sender.password=xxxx //发送邮箱密码 mail.smtp.auth = true
类文件
package com.mailSend; import javax.mail.Authenticator; import javax.mail.PasswordAuthentication; /** * @author * @describe * @date 2016/8/12 */ class MyAuthenticator extends Authenticator { private String strUser; private String strPwd; public MyAuthenticator(String user, String password) { this.strUser = user; this.strPwd = password; } protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(strUser, strPwd); } }
总结下遇到的问题:
问题1. session 的获取
使用 Session.getDefaultInstance(properties, auth);
而不是 getInstance。两者的区别是getDefaultInstance得到的始终是该方法初次创建的缺省的对象,而getInstance得到的始终是新的对象
问题2 transport.connect(mailHost,mailPort, sender_username, sender_password);时总是报出javax.mail.AuthenticationFailedException异常,导致此异常的原因有很多,可能是用户名密码不正确,也可能是SMPT邮件服务器不接受你这样连接,我的原因是我邮箱账号没开启 POP3/SMTP服务 IMAP/SMTP服务。验证这个的方法可以随便找个邮件客户端例如Foxmail或者outlook自己配置登录看下
相关文章推荐
- 用Java类实现JavaMail发送邮件的例子-Java基础-Java-编程开发
- 用java实现的邮件系统六(javamail发送复杂邮件-带附件和html)
- java中如何实现邮件的发送包括网页文件的发送
- java实现邮件定时发送
- java实现邮件的发送包括网页文件的发送
- javaMail Java实现邮件发送,群发功能,java发送邮件
- JAVA邮件发送的简单实现
- java实现邮件的发送和网页文件的发送
- java实现邮件发送
- java代码实现邮件发送
- 发送邮件 java实现
- commons-mail+javaMail 实现java的邮件发送功能
- java实现邮件发送
- java实现邮件的发送包括网页文件的发送
- 【Java】纯底层SMTP实现邮件发送核心源码
- 用java实现的邮件系统四 (javamail发送邮件)
- 用JavaMial 实现邮件发送
- java邮件发送 实现群发和带附件发送
- java实现发送邮件功能
- java实现邮件的发送包括网页文件的发送