请问如何实现javaMail发送邮件不需要发送者账号和口令的办法。

时间:2022-03-01 05:04:59
我实验过发送mail的例子,在有用户名称和口令时发送成功,但我需要的是发件是可动态的,又不能提供口令。不知如何实现发送,请大家指教!小弟在这里谢过了。
我写的发送代码是:
String tto="lnzyb@163.com";
String ttitle="实验mail主题";
String tcontent="正文内容:!!!!!!!!";
Properties props=new Properties();//也可用Properties props = System.getProperties(); 
props.put("mail.smtp.host","smtp.163.com");//存储发送邮件服务器的信息
props.put("mail.smtp.auth","true");//同时通过验证
Session s=Session.getInstance(props);//根据属性新建一个邮件会话
s.setDebug(true);

MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象

//设置邮件
InternetAddress from=new InternetAddress("zzzz@163.com");
message.setFrom(from);//设置发件人
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO
message.setSubject(ttitle);//设置主题
message.setText(tcontent);//设置信件内容
message.setSentDate(new java.util.Date());//设置发信时间

//发送邮件
message.saveChanges();//存储邮件信息
Transport transport=s.getTransport("smtp");
transport.connect("smtp.163.com","lnzyb","pwd***");//以smtp方式登录邮箱
transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有
transport.close();


这样发送正常!单修改成无认证的不知该如何是好。

12 个解决方案

#1


是不是与smtp服务器设置有关!!

#2


贴一个我做流程时邮件通知得代码,试过了挺好用的
//´øÑéÖ¤µÄ·¢ËÍÓʼþ·½·¨
    public void sendEmail(String smtpServer,String fromUser,String fromPassword
     ,String fromEmail,String toUserEmail,String subject,String comment) throws UnsupportedEncodingException, MessagingException{
     Properties props=new Properties();
props.put("mail.smtp.auth","true");
props.put("mail.host",smtpServer);
        props.put("mail.smtp.user", fromUser);
        props.put("mail.smtp.password", fromPassword);

        Session session=Session.getDefaultInstance(props,null);
        Message msg=new MimeMessage(session);
msg.setFrom(new InternetAddress(fromEmail,fromUser));
msg.setRecipient(Message.RecipientType.TO,new InternetAddress(toUserEmail));
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(comment);

Transport transport = session.getTransport("smtp");
transport.connect((String)props.get("mail.smtp.host"),
props.getProperty("mail.smtp.user"),
props.getProperty("mail.smtp.password"));

        transport.sendMessage(msg,msg.getAllRecipients());
  
      
    }

#3


gz

#4


这个不是和你的程序相关的,是和服务器设置相关的,
如果服务器端设置了发邮件必须login,那么你想匿名,或者不写pwd都是不行的

#5


你可是直接声请一个163.com的邮箱就作为发送邮件来使用,把这个声请的邮箱的用户名和密码写在代码中,通过au.check("用户名","密码")方法来通过验证,给你一段代码试试,这是我用来将告警信息发送到指定用户的信箱里.
Properties props = new Properties();

SendMailAuthenticator au = new SendMailAuthenticator();
au.check("用户名", "密码"); // 认证 
props.put("mail.smtp.host", "smtp.126.com"); // 设置smtp服务器
props.put("mail.smtp.auth", "true"); // 这样认证才会起作用:)
Session session = Session.getInstance(props, au);// 创建session

MimeMessage message = new MimeMessage(session); //创建message对象
//先来写“信封”吧
try {
     
     Address address = new InternetAddress("*****@126.com", "发件人姓名"); //发件人地址
     Address toAddress = new InternetAddress(*****@163.com);//收件人地址
     message.setFrom(address);//设置发件人
     message.setRecipient(MimeMessage.RecipientType.TO, toAddress);//设置收件人

     //下面写邮件内容
     message.setSubject("测试邮件", "GB2312"); //设置主题
     message.setSentDate(new Date());//设置日期
     message.setText("凡在我心目中占有一定地位的人都将获得我有我免费提供测试邮件一封!!呵呵…^_^," +"发生告警的设备id是:"+id, "GB2312");//设置邮件内容

//发送啦
     Transport transport = session.getTransport("smtp");
     Transport.send(message);

   }catch(Exception ex){
   ex.printStackTrace();
}

#6


感谢大家的帮助非常感动!!

#7


还是不可以,我实验了验证用户名称必须和(From)发送邮件人是同一人才可以发送,我用的是smtp.163.com,提示错误:
javax.mail.MessagingException: 553 You are not authorized to send mail as <MAIL FROM:<ggzzgg2001@163.com>>, authentication is required
我用的用户名称是令一个邮箱名称。

感谢: freestorm119(皮皮鲁) 兄,你的SendMailAuthenticator类没有写,我在网上找到了,
补充一下。

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SendMailAuthenticator extends Authenticator
{
private String username = ""; 
  private String password = ""; 

  public void check(String username, String password){ 
this.username = username; 
this.password = password; 
  } 

  public PasswordAuthentication getPasswordAuthentication(){ 
return new PasswordAuthentication(username,password); 
  } 
}
方法还是很好用的,但是不成功!
应该是象 eureka0891()  兄说的那样。
感谢帮助。


#8


呵呵.一时疏忽把这个细节给忘了,不好意思啊
帮你up一下好了

#9


不过你有没有考虑过怎么能让发送的时候作一个控制,就是当产生告警信息后我采用发email的方法通知相关的人员,可是相同的告警会不停的产生,而又不能一直不停的给用户发信,不然邮箱那里能受的了啊,怎么能让相同的告警信息不重复的发送给相同的用户啊,只是想给点思路,谢谢

#10


http://www.javayou.com/showlog.jspe?log_id=502

#11


这个不是和你的程序相关的,是和服务器设置相关的,
如果服务器端设置了发邮件必须login,那么你想匿名,或者不写pwd都是不行的
----------------------------------

是这样的!

#12


我分析也是应当需要用户名称和口令来设置发件人,要不所有人都可以以别人身份发送邮件那启不是天下大乱了。
再次感谢各位的帮助,这个问题我会象客户要用户名称和口令的。就此结贴,各位后会有期。

#1


是不是与smtp服务器设置有关!!

#2


贴一个我做流程时邮件通知得代码,试过了挺好用的
//&acute;&oslash;&Ntilde;é&Ouml;¤&micro;&Auml;·&cent;&Euml;&Iacute;&Oacute;&Ecirc;&frac14;&thorn;·&frac12;·¨
    public void sendEmail(String smtpServer,String fromUser,String fromPassword
     ,String fromEmail,String toUserEmail,String subject,String comment) throws UnsupportedEncodingException, MessagingException{
     Properties props=new Properties();
props.put("mail.smtp.auth","true");
props.put("mail.host",smtpServer);
        props.put("mail.smtp.user", fromUser);
        props.put("mail.smtp.password", fromPassword);

        Session session=Session.getDefaultInstance(props,null);
        Message msg=new MimeMessage(session);
msg.setFrom(new InternetAddress(fromEmail,fromUser));
msg.setRecipient(Message.RecipientType.TO,new InternetAddress(toUserEmail));
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(comment);

Transport transport = session.getTransport("smtp");
transport.connect((String)props.get("mail.smtp.host"),
props.getProperty("mail.smtp.user"),
props.getProperty("mail.smtp.password"));

        transport.sendMessage(msg,msg.getAllRecipients());
  
      
    }

#3


gz

#4


这个不是和你的程序相关的,是和服务器设置相关的,
如果服务器端设置了发邮件必须login,那么你想匿名,或者不写pwd都是不行的

#5


你可是直接声请一个163.com的邮箱就作为发送邮件来使用,把这个声请的邮箱的用户名和密码写在代码中,通过au.check("用户名","密码")方法来通过验证,给你一段代码试试,这是我用来将告警信息发送到指定用户的信箱里.
Properties props = new Properties();

SendMailAuthenticator au = new SendMailAuthenticator();
au.check("用户名", "密码"); // 认证 
props.put("mail.smtp.host", "smtp.126.com"); // 设置smtp服务器
props.put("mail.smtp.auth", "true"); // 这样认证才会起作用:)
Session session = Session.getInstance(props, au);// 创建session

MimeMessage message = new MimeMessage(session); //创建message对象
//先来写“信封”吧
try {
     
     Address address = new InternetAddress("*****@126.com", "发件人姓名"); //发件人地址
     Address toAddress = new InternetAddress(*****@163.com);//收件人地址
     message.setFrom(address);//设置发件人
     message.setRecipient(MimeMessage.RecipientType.TO, toAddress);//设置收件人

     //下面写邮件内容
     message.setSubject("测试邮件", "GB2312"); //设置主题
     message.setSentDate(new Date());//设置日期
     message.setText("凡在我心目中占有一定地位的人都将获得我有我免费提供测试邮件一封!!呵呵…^_^," +"发生告警的设备id是:"+id, "GB2312");//设置邮件内容

//发送啦
     Transport transport = session.getTransport("smtp");
     Transport.send(message);

   }catch(Exception ex){
   ex.printStackTrace();
}

#6


感谢大家的帮助非常感动!!

#7


还是不可以,我实验了验证用户名称必须和(From)发送邮件人是同一人才可以发送,我用的是smtp.163.com,提示错误:
javax.mail.MessagingException: 553 You are not authorized to send mail as <MAIL FROM:<ggzzgg2001@163.com>>, authentication is required
我用的用户名称是令一个邮箱名称。

感谢: freestorm119(皮皮鲁) 兄,你的SendMailAuthenticator类没有写,我在网上找到了,
补充一下。

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class SendMailAuthenticator extends Authenticator
{
private String username = ""; 
  private String password = ""; 

  public void check(String username, String password){ 
this.username = username; 
this.password = password; 
  } 

  public PasswordAuthentication getPasswordAuthentication(){ 
return new PasswordAuthentication(username,password); 
  } 
}
方法还是很好用的,但是不成功!
应该是象 eureka0891()  兄说的那样。
感谢帮助。


#8


呵呵.一时疏忽把这个细节给忘了,不好意思啊
帮你up一下好了

#9


不过你有没有考虑过怎么能让发送的时候作一个控制,就是当产生告警信息后我采用发email的方法通知相关的人员,可是相同的告警会不停的产生,而又不能一直不停的给用户发信,不然邮箱那里能受的了啊,怎么能让相同的告警信息不重复的发送给相同的用户啊,只是想给点思路,谢谢

#10


http://www.javayou.com/showlog.jspe?log_id=502

#11


这个不是和你的程序相关的,是和服务器设置相关的,
如果服务器端设置了发邮件必须login,那么你想匿名,或者不写pwd都是不行的
----------------------------------

是这样的!

#12


我分析也是应当需要用户名称和口令来设置发件人,要不所有人都可以以别人身份发送邮件那启不是天下大乱了。
再次感谢各位的帮助,这个问题我会象客户要用户名称和口令的。就此结贴,各位后会有期。