Javamail - 将邮件从localhost发送到外部帐户

时间:2014-06-13 10:13:20

标签: java localhost javamail james hmail-server

需要从localhost向gmail和yahoo等外部帐户发送电子邮件。现在我有一个程序可以通过本地电子邮件服务器发送和接收来自我本地域的邮件,例如(admin@ib-status.com< - > devteam@ib-status.com)。但问题是当我尝试从本地域发送到gmail或yahoo帐户时我无法做到这一点,例如(admin@ib-status.com - > myaccount@gmail.com)。需要帮助

PS。我正在使用Hmailserver for emailserver

public class JMailer {

          private static String HOSTNAME = "localhost";
            private static String USERNAME = "admin";
            private static String PASSWORD = "Mylocaldomainpassword";

            public static void main(String[] args) {
            try {  
                String to = "MygmailAccount@gmail.com";
                String from = "admin@ib-status.com";               
                Properties properties = System.getProperties();

                properties.setProperty("mail.smtp.host",HOSTNAME);
                Session session = Session.getInstance(properties, new Authenticator() {                
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(USERNAME, PASSWORD);
                    }
                });
                    MimeMessage message = new MimeMessage(session);
                    message.setFrom(new InternetAddress(from));
                    message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
                    message.setSubject("My Subject!");
                    message.setText("Here Goes My Message");                    
                    Transport.send(message);
                    System.out.println("Message Sending Completed");
                } catch (MessagingException mex) {
                    mex.printStackTrace();
                }
            }
}

我的Hmailserver日志错误在

之下

" SMTPC" 4508 0" 2014-06-13 15:18:01.022" " TCP" " SMTPDeliverer - 消息13 - 连接失败:主机名:74.125.25.27,消息:无法建立连接,因为目标计算机主动拒绝它"

我在这里错过了什么?为什么远程机器的连接被拒绝了?我不想使用gmail的SMTP服务器发送消息。我需要的是我希望我自己的smtp服务器运行发送和接收

2 个答案:

答案 0 :(得分:1)

试试这个。工作完美!将您的Gmail ID设置为sender@gmail.com,将Gmail密码设置为密码。

import com.sun.mail.smtp.SMTPMessage;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendmailSSl {
public static void main(String[] args) {
    Properties props = new Properties();
    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class",
            "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "805");

    Session session = Session.getDefaultInstance(props,new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("sender@gmail.com","Password");
        }
    });

    try {

        SMTPMessage message = new SMTPMessage(session);
        message.setFrom(new InternetAddress("sender@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,
                                 InternetAddress.parse( "reciver@gmail.com" ));

        message.setSubject("Testing Subject");
        message.setText("This is Test mail");
        message.setContent("This Is my First Mail Through Java");
        message.setNotifyOptions(SMTPMessage.NOTIFY_SUCCESS);
        int returnOption = message.getReturnOption();
        System.out.println(returnOption);        
        Transport.send(message);
        System.out.println("sent");

    }
     catch (MessagingException e) {
        throw new RuntimeException(e);         
     }
  }
}

答案 1 :(得分:1)

最后,我能够解决这个问题,我在2台可以完成工作的电子邮件服务器上测试过Apache james和hmailserver。 Hmailserver非常容易运行和配置,因为它有gui来做到这一点。

HmailServer 5.4.2

 1. Configure as per the documentation 
 2. Do not use localhost and make sure you change it in C:\Windows\System32\drivers\etc\hosts from "127.0.0.1 localhost" -> "127.0.0.1 example.com"
 3. In add domain of hmailserver give "example.com"
 4. In Domain created add accounts eg.user@example.com
 5. under setting->protocold->smtp->delivery of email add "example.com"

现在运行以下程序我们很高兴。

Apache James apache-james-3.0-beta4

与上面大致相同但是没有任何GUI可供配置,这是轻量级命令行电子邮件服务器,也可以在Linux上运行。

应用相同的过程,但它具有特定的命令行来创建域和帐户,在此之前您需要登录管理员帐户来创建用户。

你将面对使用Apache james的障碍是它运行良好的32位,但它将有64位的服务器启动问题,因为" Wrapper.exe"它使用tanuki。你不支持64位版本的wrapper.exe所以我不得不试用许可证并添加64位wrapper.exe并修改james.bat。

除此之外它工作正常。

package com.javabp.jmailer;


import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class JMailer {
    public static void main(String[] args) 
    {
        /***** CHANGE THESE FOUR VARIABLE VALUES TO REFLECT YOUR ENVIRONMENT ******/
        String user = "user";   // Newly created user on JAMES Server
        String password = "password"; // user password

        String fromAddress = "user@example.com"; // newlycreateduser@localhost
        String toAddress = "myaccount@gmail.com";


        // Create a mail session
        Properties properties = new Properties();
        properties.put("mail.transport.protocol", "smtp");
        properties.put("mail.smtp.host", "example.com");
        properties.put("mail.smtp.port", "25");
        properties.put("mail.smtp.username", user);
        properties.put("mail.smtp.password", password);
        Session session = Session.getDefaultInstance(properties, null);

        try 
        {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(fromAddress));
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(toAddress));

            message.setSubject("Email From my Own Server");
            message.setText("Test Mail sent from My Apache James Server!!");
            Transport.send(message);

            System.out.println("Email sent successfully");
        }
        catch (MessagingException e) 
        {
            e.printStackTrace();
        }
    }
}

上述代码适用于Hmailserver和Apache James。

电子邮件指针

   * if your sending to external accounts be sure you see you mail at spam folders unless you have registered domain and hosted.
   * once you send a mail to those server there is been chance your IP or domain will be blocked especially gmail. so it is better to have dynamic IP so you can restart your internet connection to send a mail again and also make sure you change your domain before sending even you changed your IP.