Весенняя электронная почта с Thymeleaf, отправляющая HTML-код [дубликат]

1) Так называемая проблема «Mutable Default Argument» - это, в общем, специальный пример, демонстрирующий, что: «Все функции с этой проблемой также страдают от аналогичной проблемы побочного эффекта от фактического параметра». Это противоречит правилам

Пример:

def foo(a=[]):                 # the same problematic function
    a.append(5)
    return a

>>> somevar = [1, 2]           # an example without a default parameter
>>> foo(somevar)
[1, 2, 5]
>>> somevar
[1, 2, 5]                      # usually expected [1, 2]

Решение: копия Совершенно безопасным решением является copy или deepcopy входной сигнал сначала, а затем делать все с копией.

def foo(a=[]):
    a = a[:]     # a copy
    a.append(5)
    return a     # or everything safe by one line: "return a + [5]"

Многие встроенные изменяемые типы имеют метод копирования, такой как some_dict.copy() или some_set.copy(), или могут быть скопированы легко, как somelist[:] или list(some_list) , Каждый объект также может быть скопирован с помощью copy.copy(any_object) или более тщательным с помощью copy.deepcopy() (последний полезен, если изменяемый объект состоит из изменяемых объектов). Некоторые объекты основаны на побочных эффектах, таких как «файл», и не могут быть осмысленно воспроизведены копией. копирование

Пример проблемы для аналогичного вопроса SO

class Test(object):            # the original problematic class
  def __init__(self, var1=[]):
    self._var1 = var1

somevar = [1, 2]               # an example without a default parameter
t1 = Test(somevar)
t2 = Test(somevar)
t1._var1.append([1])
print somevar                  # [1, 2, [1]] but usually expected [1, 2]
print t2._var1                 # [1, 2, [1]] but usually expected [1, 2]

Он не должен быть ни сохранен ни в одном ] public экземпляра, возвращаемого этой функцией. (Предполагая, что атрибуты private экземпляра не должны быть изменены извне этого класса или подкласса по соглашению, т. Е. _var1 является частным атрибутом)

Заключение: Параметры входных параметров shouldn 'изменяются на месте (мутированные), и они не должны быть привязаны к объекту, возвращаемому функцией. (Если мы предпочитаем программирование без побочных эффектов, которые настоятельно рекомендуются, см. Wiki о «побочном эффекте» (первые два абзаца имеют смысл в этом контексте.).)

2) Только если побочный эффект на фактический параметр требуется, но нежелателен по параметру по умолчанию, тогда полезным решением является def ...(var1=None): if var1 is None: var1 = [] Подробнее ..

3) В некоторых случаях используется изменчивое поведение параметров по умолчанию .

31
задан Brendan Long 29 September 2011 в 06:12
поделиться

6 ответов

Я не думаю, что класс SimpleMailMessage имеет такие параметры.

Я уверен, что вы можете сделать это с помощью JavaMailSender и MimeMessagePreparator, потому что вам нужно установить тип содержимого MIME для HTML.

См. эту ссылку для справки:

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mail.html

15
ответ дан danny.lesnik 21 August 2018 в 13:27
поделиться

import javax.mail.internet.MimeMessage;
import org.springframework.mail.javamail.MimeMessageHelper;

MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, false, "utf-8");
String htmlMsg = "<h3>Hello World!</h3>";
mimeMessage.setContent(htmlMsg, "text/html");
helper.setTo("someone@abc.com");
helper.setSubject("This is the test message for testing gmail smtp server using spring mail");
helper.setFrom("abc@gmail.com");
mailSender.send(mimeMessage);
61
ответ дан Danubian Sailor 21 August 2018 в 13:27
поделиться
  • 1
    Благодарю. Ваш ответ помогает. Я узнал, что вы также можете использовать helper.setText(htmlMsg, true);, который указывает истинный флаг, который включает текст HTML. Он будет применять тип контента «text / html». для почты HTML, поэтому вам не нужно указывать mimeMessage.setContent(htmlMsg, "text/html"); – Stanley 26 September 2013 в 04:43

Возможно, вы заинтересованы в проверке этой статьи: «Богатое HTML-письмо весной с тимелеафом» http://www.thymeleaf.org/doc/articles/springmail.html

Он использует Thymeleaf в качестве шаблонного уровня представления, но концепции и специальный код Spring, объясненный там, являются общими для всех приложений Spring.

Кроме того, в нем есть приложение для примера сопутствующего приложения какой исходный код вы можете использовать в качестве базы для своих нужд.

С уважением, Даниэль.

8
ответ дан end-user 21 August 2018 в 13:27
поделиться

Весной это должно быть сделано следующим образом: ваш класс электронной почты:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;

public class HTMLMail
{
    private JavaMailSender mailSender;


    public void setMailSender(JavaMailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void sendMail(String from, String to, String subject, String msg) {
        try {

            MimeMessage message = mailSender.createMimeMessage();

            message.setSubject(subject);
            MimeMessageHelper helper;
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setText(msg, true);
            mailSender.send(message);
        } catch (MessagingException ex) {
            Logger.getLogger(HTMLMail.class.getName()).log(Level.SEVERE, null, ex);
        }
    }


}

beans: (Spring-Mail.xml)

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" />
        <property name="username" value="youremail@gmail.com" />
        <property name="password" value="yourpassword" />

        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
            </props>
        </property>
    </bean>
    <bean id="htmlMail" class="com.mohi.common.HTMLMail">
        <property name="mailSender" ref="mailSender" />
    </bean>
</beans>

Использование:

ApplicationContext context = new ClassPathXmlApplicationContext("Spring-Mail.xml");

        HTMLMail mm = (HTMLMail) context.getBean("htmlMail");
        String html="<p>Hi!</p><a href=\"google.com\">Link text</a>";
    mm.sendMail("sender@gmail.com",
            "receiver@gmail.com",
            "test html email",
            html);

Полный пример здесь .

15
ответ дан MD. Mohiuddin Ahmed 21 August 2018 в 13:27
поделиться

Уровень класса:

public String sendEmailToUsers(String emailId,String subject, String name){
    String result =null;
    MimeMessage message =mailSender.createMimeMessage();
    try {

        MimeMessageHelper helper = new MimeMessageHelper(message, false, "utf-8");
        String htmlMsg = "<body style='border:2px solid black'>"
                    +"Your onetime password for registration is  " 
                        + "Please use this OTP to complete your new user registration."+
                          "OTP is confidential, do not share this  with anyone.</body>";
        message.setContent(htmlMsg, "text/html");
        helper.setTo(emailId);
        helper.setSubject(subject);
        result="success";
        mailSender.send(message);
    } catch (MessagingException e) {
        throw new MailParseException(e);
    }finally {
        if(result !="success"){
            result="fail";
        }
    }

    return result;

}

Уровень XML:

    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="smtp.gmail.com" />
    <property name="port" value="587" />
    <property name="username" value="********@gmail.com" />
    <property name="password" value="********" />
    <property name="javaMailProperties">
        <props>
            <prop key="mail.transport.protocol">smtp</prop>
            <prop key="mail.smtp.auth">true</prop>
            <prop key="mail.smtp.starttls.enable">true</prop>
        </props>
    </property>
</bean>
4
ответ дан Umapathi 21 August 2018 в 13:27
поделиться
String emailMessage = report.toString();
            Map velocityContext = new HashMap();
            velocityContext.put("firstName", "messi");
            velocityContext.put("Date",date );  
            velocityContext.put("Exception",emailMessage );
            String text = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "VelocityTemplate.vm","UTF-8", velocityContext);
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper;
            helper = new MimeMessageHelper(message, true);
            helper.setTo("abc@gmail.com");
            helper.setFrom("xyz@gmail.com");
            helper.setSubject("new email");
            helper.setText(text, true);         
            mailSender.send(message);
0
ответ дан user 21 August 2018 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: