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) В некоторых случаях используется изменчивое поведение параметров по умолчанию .
Я не думаю, что класс SimpleMailMessage имеет такие параметры.
Я уверен, что вы можете сделать это с помощью JavaMailSender и MimeMessagePreparator, потому что вам нужно установить тип содержимого MIME для HTML.
См. эту ссылку для справки:
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/mail.html
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);
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.
Кроме того, в нем есть приложение для примера сопутствующего приложения какой исходный код вы можете использовать в качестве базы для своих нужд.
С уважением, Даниэль.
Весной это должно быть сделано следующим образом: ваш класс электронной почты:
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);
Полный пример здесь .
Уровень класса:
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>
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);