使用javamail发送邮件

时间:2021-02-28 18:12:01

javamail发送邮件的代码太多了。我整理了一下,遇到了了一个问题,就是显示发件人姓名的时候,此处都是自己的邮箱地址,后来经过摸索,解决了这个问题(见结尾)。

项目架构:SSH

在SSH框架中,想要使用javamail发送邮件,还需要两个包,mail.jar 和 activation.jar。

代码大概如此

public static void send(String targetMail, String subject, String content){
		 Properties props = new Properties();
		 try{
			 String path = ServletActionContext.getServletContext().getRealPath("/") + "WEB-INF" + File.separatorChar + "classes" + File.separatorChar;
			 File file = new File(path + "stweb.conf");
			 props.load(new FileInputStream(file));
			 
			 Properties p = new Properties();
			 
			 String host = (String)props.get("host");
			 String srcMail = (String)props.get("from");
			 final String user = (String)props.get("username");
			 final String pwd = (String)props.get("password");
			 
			 //设置发送邮件的邮件服务器的属性
			 p.put("mail.smtp.host", host);
			 
			 //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
			 p.put("mail.smtp.auth", "true");
			 
			 //用刚刚设置好的props对象构建一个session
			 Session session = Session.getDefaultInstance(p, new javax.mail.Authenticator(){
				 @Override
				 public PasswordAuthentication getPasswordAuthentication()
			        {
			                return new PasswordAuthentication(user, pwd);
			        }
			 });
			 //有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使
			 //用(你可以在控制台(console)上看到发送邮件的过程)
			 session.setDebug(true);
			 
			 //用session为参数定义消息对象
			 MimeMessage message = new MimeMessage(session);
			 
			 // 加载发件人地址
			 message.setFrom(new InternetAddress(srcMail));
			 // 加载收件人地址
			 message.addRecipient(Message.RecipientType.TO, new InternetAddress(targetMail));
			 
			 // 加载标题
			 message.setSubject(subject);
			 
			 // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
			 Multipart multipart = new MimeMultipart();

			 // 设置邮件的文本内容
			 BodyPart contentPart = new MimeBodyPart();
			 //UTF-8编码以HTML格式发送邮件
			 contentPart.setContent(content, "text/html;charset=utf-8");
			 
			 
			 multipart.addBodyPart(contentPart);
			   
			 // 添加附件
			 //BodyPart messageBodyPart = new MimeBodyPart();
			 //DataSource source = new FileDataSource(affix);
			 // 添加附件的内容
			 //messageBodyPart.setDataHandler(new DataHandler(source));
			 // 添加附件的标题
			 // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
			 //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
			 //messageBodyPart.setFileName("=?GBK?B?"+ enc.encode(affixName.getBytes()) + "?=");
			 //multipart.addBodyPart(messageBodyPart);
			   
			 // 将multipart对象放到message中
			 message.setContent(multipart);
			 // 保存邮件
			 message.saveChanges();
			 // 发送邮件
			 Transport transport = session.getTransport("smtp");
			 // 连接服务器的邮箱
			 transport.connect(host, user, pwd);
			 // 把邮件发送出去
			 transport.sendMessage(message, message.getAllRecipients());
			 transport.close();
			 //System.out.println("发送成功!");
			 logger.debug("邮件成功发送至 " + targetMail);
		 }catch(IOException ex){
			 System.out.println("stweb.conf 文件未找到");
			 ex.printStackTrace();
		 }catch(Exception ex){
			 ex.printStackTrace();
		 }
	}

  配置文件

#smtp服务器
host=smtp.*****.com

#用户名
username=******

#密码
password=******

#发信人地址	尖括号内必须和用户名一致!尖括号外的内容为邮件显示的用户名
from=这才是我的名字!<admin@******.com>

 注意!如果发信人写为这样Name<admin@******.com>时,在对方收到信件的时候,会将Name显示在发信人的位置,如果不配置的话,发信人的名称为邮件地址。