您的位置:首页 > 编程语言 > Java开发

java写发邮件(email.jar)的方法

2009-09-15 17:48 197 查看
我想在公司每个项目中都会遇到发邮件的问题,这两周我都在公司做发邮件的东西,本以为很简单的东西,却遇到了很多问题,现总结到下面。
发邮件我用的sun公司的email.jar和activation.jar。
方法:
1.写在一起用一个方法:
public boolean SendEmailTest(String ToEmailStr,String Title,String Content,String FromEmail) throws AddressException
{
//ToEmailStr收件人地址
//Title邮件标题
//Content邮件内容
//FromEmail发件人地址
FromEmail="240195798@qq.com";
// System.out.println(FromEmail);
boolean fnt = false;
Properties props = new Properties();
Session sendMailSession;
Transport transport;
sendMailSession = Session.getInstance(props, null);
props.put("mail.smtp.host", "smtp.qq.com"); //"202.106.187.180" 是“smtp.sohu.com”的IP!
props.put("mail.smtp.auth", "true"); //允许smtp校验

try
{
transport = sendMailSession.getTransport("smtp");
transport.connect("smtp.qq.com","240195798","20070424chen"); //你在sohu的用户名,密码...........
Message newMessage = new MimeMessage(sendMailSession);

//设置mail主题
String mail_subject=Title;

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
newMessage.setSubject("=?GB2312?B?"+enc.encode(mail_subject.getBytes())+"?=");
// newMessage.setSubject(mail_subject); //在winxp上只要在action中转成utf-8

//设置发信人地址
//String strFrom="service@jrsoft.com.cn"; // <--------------
// strFrom=new String(strFrom.getBytes(),"8859_1");
// newMessage.setFrom(new InternetAddress(strFrom));
Address address[] = {new InternetAddress(FromEmail)};//改变发件人地址
newMessage.addFrom(address);
//设置收件人地址
newMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(ToEmailStr));

//设置mail正文
newMessage.setSentDate(new java.util.Date());
String mail_text=Content;

newMessage.setContent(mail_text,"text/plain;charset=gb2312 ");
// newMessage.setText("=?GB2312?B?"+enc.encode(mail_text.getBytes())+"?=");
//newMessage.setText(mail_text);

newMessage.saveChanges(); //保存发送信息
transport.sendMessage(newMessage,newMessage.getRecipients(Message.RecipientType.TO)); //发送邮件
fnt=true;
transport.close();
}
catch(Exception e)
{
fnt=false;
System.out.println(e);
}
System.out.println("aaaaaaaaaaaaa");
return fnt;
}
如果想分开哪么可以写成

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
public class Email_Autherticator extends Authenticator {
String username = "hackboyo";//用户名

String password = "woyao025";//密码
public Email_Autherticator() {
super();
}
import java.util.Date;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.SendFailedException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class Mail {
private String host = "smtp.126.com";

private String mail_head_name = "this is head of this mail";

private String mail_head_value = "this is head of this mail";

private String mail_to = "254173774@qq.com";

private String mail_from = "hackboyo@126.com";

private String mail_subject = "this is the subject of this test mail";

private String mail_body = "this is mail_body of this test mail";

private String personalName = "我的邮件";
public void sendMail() throws SendFailedException{
try {
Properties props = new Properties();//获取系统环境
Authenticator auth = new Email_Autherticator();//进行邮件服务用户认证
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
System.out.println(props);
Session session = Session.getDefaultInstance(props,auth);
//设置session,和邮件服务器进行通讯
MimeMessage message = new MimeMessage(session);
message.setContent("Hello","text/plain");//设置邮件格式
message.setSubject(mail_subject);//设置邮件主题
message.setText(mail_body);//设置邮件内容
message.setHeader(mail_head_name, mail_head_value);//设置邮件标题
message.setSentDate(new Date());//设置邮件发送时期
Address address = new InternetAddress(mail_from,personalName);
message.setFrom(address);//设置邮件发送者的地址
Address toaddress = new InternetAddress(mail_to);//设置邮件接收者的地址
message.addRecipient(Message.RecipientType.TO,toaddress);
System.out.println(message);
Transport.send(message);
System.out.println("Send Mail Ok!");
} catch (Exception e) {
e.printStackTrace();
}
//return flag;
}
}
public Email_Autherticator(String user,String pwd){
super();
username = user;
password = pwd;
}
public PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(username,password);
}
}
====================其中遇到的问题以及解决方案=========================
1.发邮件收不到的问题
其中如果发送失败,一般是因为你的密码,用户名或者是smtp设置错误
smtp:QQ的是smtp.qq.com 163的是smtp.163.com gmail的是smtp.gmail.com
我觉得一般的邮箱应该都是 smtp.邮箱.com
2.props.put("mail.smtp.auth", "true"); //允许smtp校验
以前的邮箱这个可以设成false但是现在的一般都不行的,都需要smtp校验
3.另外你有时用别的邮箱做代理会发现报错说使用 pop3的错误,因为现在很多邮箱的 pop3 协议默认是关闭的
如果pop3 协议关闭就不能用其做代理,我试着注册过163,gmail,雅虎,qq的邮箱,都是注册后几周后才开通,
而且qq的邮箱是邮箱开通后两周才能手懂开通pop3 协议,在个人设置里有
4.关于乱码的问题,特别是移植的问题,这个问题困惑了我好几天
但最后还是找到了决绝方案
在winxp下
只要你的title和comtent在后台发送前有转码基本就没有问题的,我的项目页面是用utf-8,在后台我又做了一下
转码,发送时基本是没又乱码的
在Linux下,
我用的是在Linux下用的weblogic,在winxp下测试没问题的,但在Linux下会遇到很变态的乱码,大概是因为字符编码和传输编码(Content-Transfer-Encoding)的问题,最后看到一篇文章(http://www.javaresearch.org/html/article/64874.htm)才解决:解决方案
邮件的标题乱码解决: //设置mail主题
String mail_subject=Title;

sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
newMessage.setSubject("=?GB2312?B?"+enc.encode(mail_subject.getBytes())+"?=");
如果是在winxp上只需要newMessage.setSubject(mail_subject);就可以了,
邮件的正文这样是不行的,解决方案是:String mail_text=Content;
newMessage.setContent(mail_text,"text/plain;charset=gb2312 ");
而在winxp上只需要newMessage.setText(mail_text);就可以了
剩下的就没有什么问题了,其余的都是很简单的问题,有时还会遇到,你发的邮件有的邮箱可以收到
可是有的邮箱收不到,我们公司的邮件服务器就是这样的,qq邮箱是收不到的,但问题我们还不知道
最后没办法,我就只有用qq邮箱代理了,但是用别的邮箱代理还是有问题的,因为我用循环测试时发现
如果qq邮箱用10去循环只有前几条可以发出去,连续几封后就会有错,估计是qq邮箱的服务器发现异常暂时会
把你的邮箱关闭,但一会儿就正常了,如果是126的邮箱,我测试时用的100,但到快五十封邮件时就不行了
,原因估计是一样的。
by cju。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: